你的主要问题是cat
param接受整数(term\\u id)作为值,而不是逗号分隔的id字符串。。。
你必须使用category__in
你的论点。
阅读here 了解更多信息。
另一个问题是showposts
辩君:将其设置为2,您将总共获得2篇帖子,而不是每个类别2篇帖子。
我的建议是:
如果functions.php
创建如下函数:
function get_posts_for_cat_ordered( $cats = array(), $posts_per_cat = 2 ) {
if ( empty($cats) ) return false;
$args = array(\'posts_per_page\' => 99, \'category__in\' => $cats, \'orderby\' => \'rand\');
$q = new WP_Query( $args );
$posts_ordered = array();
$done = 0;
while ( $q->have_posts() ) : $q->the_post();
global $post;
$cats = get_the_category();
$cat = array_shift( $cats );
if ( ! isset($posts_ordered[$cat->slug]) )
$posts_ordered[$cat->slug] = array(\'term\' => $cat);
if ( ! isset($posts_ordered[$cat->slug][\'posts\']) )
$posts_ordered[$cat->slug][\'posts\'] = array();
if ( count($posts_ordered[$cat->slug][\'posts\']) == $posts_per_cat ) {
$done++;
if ( $done == count($cats) ) return $posts_ordered;
continue;
}
$posts_ordered[$cat->slug][\'posts\'][] = $post;
endwhile;
wp_reset_postdata();
return $posts_ordered;
}
此函数为每个类别获取一个类别数组和要检索的帖子数量,并返回一个多维数组,其中每个类别的帖子排序。
然后使用刚才创建的函数,如下所示:
$cats = array(12, 13, 14);
$posts_per_category = 2;
$posts_ordered = get_posts_for_cat_ordered( $cats, $posts_per_category );
if ( ! empty($posts_ordered) ) { foreach ( $posts_ordered as $loop_data) {
// Example category heading
echo \'<h2><a href="\' . get_term_link($loop_data[\'term\'], \'category\') . \'">\' . $loop_data[\'term\']->name . \'</a></h2>\';
global $post;
foreach ( $loop_data[\'posts\'] as $post) {
setup_postdata($post);
?>
<!-- Example post content -->
<?php the_title(); ?><br />
<?php the_content(); ?><br />
<?php
}
wp_reset_postdata();
} }
请注意,我还
更改了showposts
参数(已弃用)posts_per_page
添加了wp_reset_postdata
在自定义查询循环之后
Possible issues:
如果一个帖子有多个类别,则此代码可能无法按预期工作。但是在
get_posts_for_cat_ordered
函数可以解决此问题。然而,如果您不需要此功能,请保持代码不变,因为它的性能更高。
如果在最后99篇文章中,博客中没有足够的文章来满足每个想要的类别,则可能会出现另一个问题。这是给\'posts_per_page\' => 99
中使用的查询中的参数get_posts_for_cat_ordered
作用我使用这个数字是因为这是一个合理的高数字,如果这个博客有数千篇文章,这个功能不会影响性能。
这两个问题都不会使功能停止工作,但如果出现所描述的情况,显示的帖子可能会比预期的少。