为您的查询创建列并在主题中轻松显示可能更有用的方法是在模板标记和循环中加入一些内容。我的第一个答案并没有集中在那么多方面。此外,我认为它有点太复杂,无法快速采用。
我脑海中浮现的一种更简单的方法是用列扩展“循环”,并得出了目前为止的解决方案:
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环境中执行最后一个示例,但至少在语法上应该是正确的。)