在使用 WordPress 搭建博客时,有时需要让不同的分类页面显示不同篇数的文章,通过设置项”博客页面至多显示多少篇文章”只能设置为显示相同的篇数。虽然可以通过修改 query_string 来实现,但如果使用了 WP-PageNavi 等分页插件,还是会出现一些问题,这种情况下,可以借助 pre_get_posts 来实现我们的需求。
通过修改 query_string 可以实现显示指定篇数:
global $query_string;
$posts = query_posts($query_string.'&posts_per_page=10');
while ( have_posts() ) {
// ...
}
但如果使用了 WP-PageNavi 等分页插件,通常会导致的一个问题是:分页数量是正确的,但访问后面的页数时,会提示 404 错误。如果要对插件进行修改,那会非常麻烦,而借助 WordPress 的 hooks/action – pre_get_posts ,不同分类页面显示不同篇数文章的实现就简单多了:
function powerxing_custom_posts_per_page( $query ) {
// 为特定分类指定显示数量,键为分类别名(可在后台的分类目录中查看),值为显示数量
$ppp = array(
// 比如为分类 notes 和 gallery 设置不同的显示数量
'notes' => 10,
'gallery' => 15,
);
if ( $query->is_category() && $query->is_main_query() ) {
// 获取当前分类别名
$slug = $query->query_vars['category_name'];
if ( array_key_exists($slug, $ppp) ) {
$query->set( 'posts_per_page', $ppp[$slug] );
}
}
}
add_action('pre_get_posts', 'powerxing_custom_posts_per_page');
只需要将上面的代码复制到主题下的 functions.php 中,修改 $ppp 数组为你想要的设置就行了。