You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress自定义WP_Query分页第二页不显示结果问题求助

问题根源
  • 分页链接丢失筛选参数:paginate_links()生成的页码链接仅携带paged参数,未携带分类筛选提交的category-filter、filteredCategories参数,点击第二页时筛选条件失效,不会触发自定义筛选查询逻辑。
  • 页码获取逻辑不兼容首页场景:WordPress静态首页读取分页参数使用page查询变量,普通归档页才使用paged变量,原有初始查询仅读取paged变量,翻页时无法拿到正确页码,导致查询偏移量计算错误返回空结果。
  • 查询逻辑拆分存在判断漏洞:全量文章查询、筛选文章查询拆成了两段独立逻辑,仅当请求携带category-filter参数时才会走筛选查询,翻页时参数丢失直接回退到初始查询,和分页计算时用的查询对象不匹配,页码总数正确但内容查询错位。
  • 代码中遗留的var_dump调试输出会破坏页面结构,需要清理。
修复方案

1. 替换原有查询逻辑

删除原有的全局初始化查询、returnFilteredCategories函数及对应的条件判断,替换为统一的查询逻辑,拆分参数获取、查询构建步骤,避免条件判断遗漏:

// 统一获取当前页码,同时兼容静态首页page参数和普通归档paged参数
$paged = 1;
if (get_query_var('paged')) {
    $paged = absint(get_query_var('paged'));
} elseif (get_query_var('page')) {
    $paged = absint(get_query_var('page'));
}

// 安全处理分类筛选参数
$cat_param = 0;
if (isset($_GET['filteredCategories']) && is_array($_GET['filteredCategories'])) {
    $valid_cat_ids = [];
    foreach ($_GET['filteredCategories'] as $cat_name) {
        $clean_name = sanitize_text_field($cat_name);
        $cat_id = get_cat_ID($clean_name);
        if ($cat_id) $valid_cat_ids[] = $cat_id;
    }
    if (!empty($valid_cat_ids)) {
        $cat_param = implode(',', $valid_cat_ids);
    }
}

// 构建统一查询参数,无论是否筛选都使用同一套逻辑
$query_args = [
    'posts_per_page' => 5,
    'post_type' => 'post',
    'paged' => $paged,
    'cat' => $cat_param
];
$the_query = new WP_Query($query_args);

// 获取全部分类用于渲染筛选表单
$allCategories = get_categories();
$filterCategories = [];
foreach ($allCategories as $category) {
    $filterCategories[] = $category->name;
}

2. 修复分页链接生成逻辑

替换原有paginate_links代码块,在分页链接中追加保留当前筛选参数,同时使用前面统一获取的$paged作为当前页码,避免重复读取查询变量出错:

<div class="pagination-nav flex">
    <div>
    <?php
    $big = 999999999;
    $base = str_replace($big, '%#%', esc_url(get_pagenum_link($big)));
    
    // 拼接现有筛选参数到分页格式中
    $format = '?paged=%#%';
    $existing_query = [];
    if (isset($_GET['filteredCategories'])) {
        foreach ($_GET['filteredCategories'] as $item) {
            $existing_query['filteredCategories'][] = sanitize_text_field($item);
        }
    }
    if (isset($_GET['category-filter'])) {
        $existing_query['category-filter'] = sanitize_text_field($_GET['category-filter']);
    }
    if (!empty($existing_query)) {
        $format .= '&' . http_build_query($existing_query);
    }

    echo paginate_links([
        'base' => $base,
        'format' => $format,
        'current' => $paged,
        'total' => $the_query->max_num_pages
    ]);
    ?>
    </div>
</div>
验证要点
  • 点击筛选后再翻页,地址栏会同时保留分类参数和paged参数,不会出现筛选条件丢失
  • 未筛选状态下翻页也能正常读取页码,不会返回空内容
  • 所有用户传入的GET参数都经过sanitize处理,不存在SQL注入、XSS风险
  • 清理掉所有遗留的调试输出代码,避免页面结构异常

内容的提问来源于stack exchange,提问作者NickyLind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:48:18