在用于类别存档的模板中,您不应该使用new WP_Query
. 对于所有main templates WordPress会自行加载帖子存档,WordPress已经查询了正确的帖子,因此您无需再次使用WP_Query
. 对于这些模板,模板的工作就是显示那些已经查询过的帖子。这是通过使用The Loop.
使用时分页问题如此常见的原因WP_Query
默认情况下就是这样paginate_links()
设计用于根据“主查询”(WordPress已经执行的查询,循环将输出)中每页的帖子数和帖子数输出分页链接。因此,如果您试图将其用于自定义查询,但尚未完全完美地进行设置,那么自定义查询与主查询之间的不匹配将导致错误的结果。
即使您可以修复分页以处理查询,但执行额外查询仍然存在问题,这会降低站点速度,并会导致大量冗余逻辑。最好的解决方案是按照WordPress希望的方式实现模板。
因此,根据您问题中的标记,您的模板应该是:
<div class="row">
<?php while ( have_posts() ) : the_post(); ?>
<div class="col-md-4 module">
<a href="<?php the_permalink(); ?>">
<!-- ... -->
</a>
</div>
<?php endwhile; ?>
<div class="d-flex justify-content-center pagination">
<?php
echo paginate_links(
array(
\'prev_text\' => \'<<\',
\'next_text\' => \'>>\',
)
);
?>
</div>
</div>
这将使用标记和分页控件输出当前类别中的帖子。
那么,如果您想更改有关所查询帖子的某些内容,例如顺序或每页帖子的数量,该怎么办?如果您搜索“每页查询帖子数”或“反向排序帖子”,您可能会看到许多使用new WP_Query
. 这些答案演示了如何为新查询而不是现有的主查询设置这些属性。更改主查询的这些属性的过程略有不同。
要更改主查询的帖子数量或顺序,而不是将其放在模板中,您需要在主题函数中添加一个函数。php即hooked 进入pre_get_posts
. 此函数将使您有机会更改主查询的属性。例如,如果要更改类别存档的每页帖子数,可以添加以下内容:
add_action(
\'pre_get_posts\',
function( $query ) {
// We don\'t want to affect any back-end queries.
if ( is_admin() ) {
return;
}
// We only want to modify the main query for category archives.
if ( $query->is_category() ) {
// Change the number of posts per page.
$query->set( \'posts_per_page\', 3 );
}
}
);
这将更改类别页面,使其每页仅显示3篇文章,但分页将继续工作,因为您已经修改了分页控件用于的主查询。
通过谷歌搜索“pre_get_posts”,你会发现更多关于这种修改查询方法的资源。