返回

WordPress 分页与查询筛选器故障排查指南

php

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 分页与查询过滤器之间的问题。这将确保经过筛选后的结果集的分页正确无误。

常见问题解答

  1. 为什么需要使用 pre_get_posts 钩子?

    • pre_get_posts 钩子允许我们在查询执行前对其进行修改。通过拦截查询,我们可以修改 $paged 变量以反映经过筛选后的结果集的页码。
  2. 什么是 $query->query_vars['posts_per_page']

    • $query->query_vars['posts_per_page'] 是查询中每页显示的帖子数量。
  3. 为什么 $filtered_paged 需要设为 1 而不是 0

    • 在 WordPress 中,页码从 1 开始,而不是从 0 开始。因此,如果 $filtered_paged 设置为 0,它将显示第一页,而不是经过筛选后的第一页。
  4. 如何测试此解决方案是否有效?

    • 创建一个自定义查询并应用一些过滤器。然后,尝试在不同的页面之间进行分页。经过筛选后的结果集的分页应该正确无误。
  5. 这个解决方案是否适用于所有类型的 WordPress 过滤器?

    • 此解决方案专为查询过滤器而设计。对于其他类型的过滤器,可能需要不同的方法。