如何将循环拆分为多列

时间:2011-02-14 作者:zac

如果我有一个从类别查询运行的循环,如:

<?php $the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');?>
<ul>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<li>.. </li><?php wp_reset_query(); ?>
<?php endwhile; ?>
</ul>
我如何创建一个if子句,以一定的间隔打破列表,并开始一个新的。例如,在第10篇文章中,返回a</ul> 开始一个新的<ul> 11点。

这是不正确的,但为了说明我的目标:

<?php $count =0;
    while($count <=50){
        if ($count == 9){
            echo "<li><a href=\'<?php the_permalink(); ?>\'>
                      <?php the_title(); ?></a></li></ul>";
            } 
        elseif ($count == 10){
        echo "<ul><li><a href=\'<?php the_permalink(); ?>\'>
                          <?php the_title(); ?></a></li>";
        }
        else {
        echo "<li><a href=\'<?php the_permalink(); ?>\'><?php the_title(); ?></a></li>";
        }
将此逻辑包含到循环中的正确方法是什么?

5 个回复
最合适的回答,由SO网友:hakre 整理而成

为您的查询创建列并在主题中轻松显示可能更有用的方法是在模板标记和循环中加入一些内容。我的第一个答案并没有集中在那么多方面。此外,我认为它有点太复杂,无法快速采用。

我脑海中浮现的一种更简单的方法是用列扩展“循环”,并得出了目前为止的解决方案:

A.WP_Query_Columns 对象使用易于迭代的列“扩展”任何标准WP查询。第一个参数是查询变量,第二个参数是每列要显示的项目数:

<?php $the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');?>
<?php foreach(new WP_Query_Columns($the_query, 10) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; ?>
要使用它,只需添加WP_Query_Columns class from this gist 主题功能。php。

高级用法

如果需要当前显示的列号(例如,对于某些偶数/奇数CSS类,也可以从foreach获取:

<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>
还有可用的列总数:

<?php 
    $the_columns = new WP_Query_Columns($the_query, 10);
    foreach($the_columns as $column => $column_count) : 
?>
    <h2>Column <?php echo $column; ?>/<?php echo sizeof($the_columns); ?></h2>
    <ul>...
二十个十的例子,我可以快速破解二十个十的测试主题,并以这种方式在任何循环上方添加标题。它被插入到循环中。php,开头是主题代码:

<?php /* If there are no posts to display, such as an empty archive page */ ?>
<?php if ( ! have_posts() ) : ?>
    <div id="post-0" class="post error404 not-found">
        <h1 class="entry-title"><?php _e( \'Not Found\', \'twentyten\' ); ?></h1>
        <div class="entry-content">
            <p><?php _e( \'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.\', \'twentyten\' ); ?></p>
            <?php get_search_form(); ?>
        </div><!-- .entry-content -->
    </div><!-- #post-0 -->
<?php endif; ?>

<!-- WP_Query_Columns -->
<?php 
    ### Needs WP_Query_Columns --- see http://wordpress.stackexchange.com/q/9308/178
    $query_copy = clone $wp_query; // save to restore later
    foreach( new WP_Query_Columns($wp_query, 3) as $columns_index => $column_count ) : ?>
    <ul>
        <?php 
        while ( $column_count-- ) : the_post(); ?>
            <li><h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( \'Permalink to %s\', \'twentyten\' ), the_title_attribute( \'echo=0\' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2></li>
        <?php endwhile; ?>
    </ul>       
<?php endforeach; ?>
<?php $wp_query = $query_copy;?>

<?php
    /* Start the Loop.
    ...
关于更长的答案:(这基本上就是我得出上述内容的原因,但更好地解释了如何通过简单的数学运算来实际解决问题。我的新解决方案是对预先计算的内容进行迭代。)

这在一定程度上取决于你实际需要解决多少问题。

例如,如果每列的项数等于1,则非常简单:

<?php $the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');?>    
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<ul>
    <li>.. </li>
<ul>
<?php endwhile;  wp_reset_query(); ?>
</ul>
即使使用简单的代码,也可以看到需要做出多个决策:

一列中有多少项最后一个问题对于HTML输出来说非常有趣,因为您可能不仅要用HTML元素括起项目,还要用HTML元素括起列。

幸运的是,有了代码,我们可以在变量中设置所有这些,并创建总是根据需要计算的代码。

有时,我们甚至不能从一开始就回答每个问题。对于exmaple,项目总数:是否有任何、某些、多个精确的计数与总列数的整数匹配?

即使Jan Fabry的回答在某些情况下也可能有效(正如我上面的示例针对每列一个项目的场景所做的那样),您可能会对适用于WP\\U查询返回的任意数量的项目的东西感兴趣。

首先是数学:

//
// arithmetical example:
//
# configuration:
$colSize = 20;  // number of items in a column
$itemsTotal = 50; // number of items (total)

# calculation:
$count = 0; // a zero-based counter variable
$isStartOfNewColum = 0 === ($count % $colSize); // modulo operation
$isEndOfColumn = ($count && $isStartOfNewColum) || $count === $itemsTotal; // encapsulation
该代码无法运行,因此让我们将其放入一个简单的文本示例中

//
// simple-text example:
//
$column = 0; // init a column counter
for($count=0; $count<= $itemsTotal; $count++) {
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        printf("/End of Column: %d\\n", $column-1);
    }

    if ($isStartOfNewColum) {
        printf("<start of Column: %d\\n", $column);
    }

    printf(" * item %d\\n", $count);
}
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    printf("/End of Column: %d\\n", $column);
}

printf("Done. Total Number of Columns: %d.\\n", $column);
这实际上已经运行并执行了一些输出:

<start of Column: 1
 * item 0
 * item 1
 * item 2
 * item 3
...
 * item 17
 * item 18
 * item 19
/End of Column: 1
<start of Column: 2
 * item 20
 * item 21
 * item 22
...
 * item 37
 * item 38
 * item 39
/End of Column: 2
<start of Column: 3
 * item 40
 * item 41
 * item 42
...
 * item 48
 * item 49
 * item 50
/End of Column: 3
Done. Total Number of Columns: 3.
这已经很好地模拟了它在wordpress模板中的样子:

//
// wordpress example:
//
$count = 0; // init item counter
$column = 0; // init column counter
$colSize = 10; // column size of ten this time
$the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');
$itemsTotal = $the_query->post_count;
?>
<?php while ($the_query->have_posts()) : $the_query->the_post();?>
<?php
    # columns display variables 
    $isStartOfNewColum = 0 === ($count % $colSize); // modulo
    $isEndOfColumn = ($count && $isStartOfNewColum);
    $isStartOfNewColum && $column++; // update column counter

    if ($isEndOfColumn) {
        print(\'</ul>\');
    }

    if ($isStartOfNewColum) {
        printf(\'<ul class="col-%d">\', $column);
    }
?>
    <li> ... make your day ...
    </li>
<?php endwhile; ?>
<?php
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
    print(\'</ul>\');
}
// You don\'t have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>
(我没有在WP环境中执行最后一个示例,但至少在语法上应该是正确的。)

SO网友:Jan Fabry

这是一个更一般的编程问题,但基本思想如下:

<?php $the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');?>
<ul>
<?php
$post_counter = 0;
while ($the_query->have_posts()) :
    $the_query->the_post();
    $post_counter++;
?>
    <li>.. </li>
<?php
    if ( 0 == $post_counter % 10 ) {
        echo \'</ul><ul>\';
    }
endwhile;
?>
</ul>
<?php
// You don\'t have to do this in every loop, just once at the end should be enough
wp_reset_query();
?>

SO网友:Dan Gayle

无需创建单独的var进行计数,因为查询var已经在以下位置对其进行计数:$wp_query->current_post. 此外,您需要说明列表中的最终条目,这样您就不会有空条目<ul></ul> 在标记中。

<?php 
$the_query = new WP_Query(\'showposts=21&orderby=title&order=asc\'); 
echo "<ul>";
while ($the_query->have_posts()) :
    $the_query->the_post();
    echo "<li>{$the_query->current_post}</li>";

    // Note that the post is already counted in the $the_query->current_post variable when in the loop. Add one to translate array counting to real counts.
    // Jan\'s example didn\'t account for the final entry in the list. Don\'t want empty <ul>\'s hanging around
    if ((($the_query->current_post+1) % 10 == 0) && ($the_query->current_post+1 !== count($the_query->posts))):
        echo "</ul><ul>";
    endif;
endwhile;
echo "</ul>";
?>

SO网友:hakre

添加get_columns_array() 功能到您的功能。php。然后,您可以轻松地迭代列:

然后在主题中,在列上foreach循环:

<?php $the_query = new WP_Query(\'cat=1&showposts=50&orderby=title&order=asc\');?>
<?php foreach(get_columns_array($post_count) as $column_count) : ?>
    <ul>
        <?php while ($column_count--) : $the_query->the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
        <?php endwhile; ?>
    </ul>
<?php endforeach; wp_reset_postdata(); ?>
我将列的默认大小设置为10。您可以使用第二个参数自行设置列的大小。喜欢7:get_columns_array($post_count, 7);.

SO网友:Vincent

以下是您可以采取的另一种方法:

$article = 0;

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
        <?php $article = $article + 1; ?>
        <?php if ($article % 3 == 1) echo \'<div class="row-fluid">\';  ?>
            <div class="span4">
            <h2><a href="<?php esc_url( the_permalink() ); ?>" title="Permalink to <?php the_title(); ?>" rel="bookmark"><?php the_title(); ?></a></h2>
            </div><!--/span-->
        <?php if ($article % 3 == 0) echo \'</div><!--/row-->\';  ?>
    <?php endwhile;?>
<?php else: ?>
<h2>...</h2>
<?php endif; ?>

结束

相关推荐

Paging in a sidebar mini loop

我切换到了另一个主题,并决定用其中的一些默认代码制作一个小部件,在自定义循环中显示我的美味帖子、推特帖子、su帖子和youtube视频(不包括主循环中的这些类别)。但是现在。。。分页不再工作。我制作了这个小部件:// =============================== EDL Sidebar Posts Widget ====================================== class SidebarPosts extends WP_Widget { &#x