返回
WordPress 分页与查询筛选器故障排查指南
php
2024-03-12 17:37:23
WordPress 分页与查询过滤器故障排查
问题
在 WordPress 中使用自定义查询分页时遇到问题。当应用过滤器对查询进行筛选后,分页仍然会显示所有结果,而不是经过筛选后的结果集。
原因分析
造成此问题的原因是使用 $paged
变量作为分页参数。当使用查询过滤器时,$paged
变量会反映未经过滤的查询结果的页码,而不是经过筛选后的结果集的页码。
解决方法
要解决此问题,需要使用 WordPress 的 pre_get_posts
钩子来拦截查询并修改 $paged
变量。在 pre_get_posts
钩子中,需要根据经过筛选后的结果集计算正确的 $paged
值。
以下是如何实现此解决方案的代码示例:
add_action( 'pre_get_posts', 'modify_paged_for_filtered_query' );
function modify_paged_for_filtered_query( $query ) {
if ( is_admin() || ! $query->is_main_query() || ! is_category() ) {
return;
}
// 获取经过筛选后的结果总数
$filtered_post_count = count( $query->posts );
// 计算经过筛选后的当前页码
if ( isset( $_GET['paged'] ) && $_GET['paged'] > 1 ) {
$filtered_paged = min( $_GET['paged'], ceil( $filtered_post_count / $query->query_vars['posts_per_page'] ) );
} else {
$filtered_paged = 1;
}
// 设置经过筛选后的页码到查询中
$query->set( 'paged', $filtered_paged );
}
结论
通过使用 pre_get_posts
钩子来拦截查询并修改 $paged
变量,可以解决 WordPress 分页与查询过滤器之间的问题。这将确保经过筛选后的结果集的分页正确无误。
常见问题解答
-
为什么需要使用
pre_get_posts
钩子?pre_get_posts
钩子允许我们在查询执行前对其进行修改。通过拦截查询,我们可以修改$paged
变量以反映经过筛选后的结果集的页码。
-
什么是
$query->query_vars['posts_per_page']
?$query->query_vars['posts_per_page']
是查询中每页显示的帖子数量。
-
为什么
$filtered_paged
需要设为1
而不是0
?- 在 WordPress 中,页码从
1
开始,而不是从0
开始。因此,如果$filtered_paged
设置为0
,它将显示第一页,而不是经过筛选后的第一页。
- 在 WordPress 中,页码从
-
如何测试此解决方案是否有效?
- 创建一个自定义查询并应用一些过滤器。然后,尝试在不同的页面之间进行分页。经过筛选后的结果集的分页应该正确无误。
-
这个解决方案是否适用于所有类型的 WordPress 过滤器?
- 此解决方案专为查询过滤器而设计。对于其他类型的过滤器,可能需要不同的方法。