我认为你不需要获得某一类别的作者列表,也不需要使用一堆个人WP_Query
\'s、 你只需要order posts 按作者排序,并查看作者何时更改。
这有两个部分。一个是修改类别页面上的循环以按作者排序。你可以加入pre_get_posts
这样做。
<?php
add_action(\'pre_get_posts\', \'wpse56168_order_author\');
/**
* Change the order of posts only on the category pages.
*
* @param WP_Query $q The current WP_Query object
* @author Christopher Davis <http://christopherdavis.me>
* @return void
*/
function wpse56168_order_author($q)
{
if($q->is_main_query() && $q->is_category())
{
$q->set(\'orderby\', \'author\');
$q->set(\'order\', \'ASC\'); // alphabetical, ascending
}
}
现在
to get a list of authors.
自从WP_Query
一次获取所有帖子--它不会流式传输数据--您可以array_map
获取作者ID并创建列表的帖子。因为你改变了上面帖子的顺序,作者应该按顺序出来。将其包装到函数中可能是一个好主意:
<?php
/**
* Extract the authors from a WP_Query object.
*
* @param WP_Query $q
* @return array An array of WP_User objects.
*/
function wpse56168_extract_authors(WP_Query $q)
{
// this is PHP 5.3+, you\'ll have to use a named function with PHP < 5.3
$authors = array_map(function($p) {
return isset($p->post_author) ? $p->post_author : 0;
}, $q->posts);
return get_users(array(
\'include\' => array_unique($authors),
));
}
然后你可以在你的
category.php
生成列表的模板。
<ul>
<?php foreach(wpse56168_extract_authors($wp_query) as $author): ?>
<li><?php echo esc_html($author->display_name); ?></li>
<?php endforeach; ?>
</ul>
按作者对文章进行分组只需将以前的文章作者与当前的文章作者进行比较即可。
示例:
<?php
$old_author = 0;
while(have_posts()): the_post();
?>
<?php if($post->post_author != $old_author): ?>
<h2><?php the_author(); ?></h2>
<?php endif; ?>
// display post here
<?php
$old_author = $post->post_author;
endwhile;