我们正在我们的网站上引入一个“特写作者”区域,并希望显示一组精选作者的最新文章。然而,我们只希望每个作者最多显示一篇文章。因此,一位作者可能在另一位作者发表文章后发表了5次,但不管怎样,只有一篇文章应该出现。目前我得到的代码是:
<?php
$args = array(
\'showposts\' => 5,
\'author\' => "6800,3845,1720,7045,4949"
);
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ) : $the_query->the_post();
?>
// DISPLAYING STUFF
<?php endwhile; wp_reset_query(); ?>
我考虑过的一个可能的解决方案是查询更多帖子并设置一个数组,然后每次都检查数组,看看是否有作者已经在其中。如果是,它将继续到下一行。但一个明显的问题是,如果某个“特写作者”有一段时间没有写文章,我可能最终不得不撤回100篇文章。
我对PHP/MySQL还是相当陌生的,可能有一个解决方案让我眼前一亮。感谢您的帮助。
SO网友:s_ha_dum
你需要GROUP BY
作者ID,需要对其进行筛选posts_groupby
. 该过滤器的Codex页面不存在,但其工作方式如下posts_join
. 类似于。。。
function filter_authors($groupby) {
global $wpdb;
$groupby = " {$wpdb->posts}.post_author";
return $groupby;
}
add_filter(\'posts_groupby\',\'filter_authors\');
$args = array(
\'showposts\' => 3,
\'author\' => "1,2,3"
);
$the_query = new WP_Query( $args );
while ( $the_query->have_posts() ) : $the_query->the_post();
echo $post->post_title.\' :: \'.$post->post_author."<br/>";
endwhile;
在中使用您自己的值
$args
当然
这将影响在该代码块之后运行的页面上的任何其他查询。你可能想remove the filter 完成后。
remove_filter(\'posts_groupby\',\'filter_authors\');
SO网友:brasofilo
另一种方法可以是使用循环的函数get_posts
并打印结果。
检查此问题(&A);答:When should you use WP_Query vs query_posts() vs get_posts()?
// function located in the theme\'s functions.php
function wpse_78117_print_authors_last_post()
{
$user_ids = array( \'1\', \'2\' );
foreach( $user_ids as $user )
{
$args = array(
\'post_type\' => \'post\',
\'numberposts\' => 1,
\'author\' => $user
);
// as we are getting only 1 post, extract it from the returned array
$user_post = array_shift( get_posts( $args ) );
// similar
$nick = array_shift( get_user_meta( $user, \'nickname\' ) );
// custom output, $user_post contains all the post normal data
echo $user_post->post_title . \', by: \' . $nick;
}
}
然后在任何主题模板中使用它:
<?php wpse_78117_print_authors_last_post(); ?>
.
SO网友:Zachary
我有一个问题,因为每个作者只想在滑块中放一篇文章,我这样解决了这个问题:
$query_args = array(\'post_type\' => \'post\');
$query = new WP_Query($query_args);
$author_ids = array(); // Array of author id\'s to check before executing
if ($query->have_posts()) : $query->the_post();
if (!in_array(get_the_author_meta(\'ID\'), $author_ids)) {
// DO YOUR STUFF
// Afterwards, add that id to our array so we don\'t get another one
array_push($author_ids, get_the_author_meta(\'ID\'));
}
endif;