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

WordPress自定义查询分页失效:带筛选参数跳转第二页报404

WordPress自定义归档分页404问题修复

问题背景

开发WordPress自定义归档页面时,通过details、maker等GET参数实现分类法术语筛选,第一页URL /case/?post_type=works&details=test&maker=&s= 可正常加载,但跳转第二页(URL:/case/?post_type=works&details=test&maker&s&paged=2)时出现404错误。

原自定义WP_Query代码:

if (!empty($get_magazine_menu)) {
    $magazine_menu_selected = array(
        'taxonomy' => $magazine_menu,
        'terms' => $get_magazine_menu,
        'field' => 'name',
        'operator' => 'IN'
    );
};

if (!empty($get_magazine_maker)) {
    $magazine_maker_selected = array(
        'taxonomy' => $magazine_maker,
        'terms' => $get_magazine_maker,
        'field' => 'name',
        'operator' => 'IN'
    );
};

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$param = array(
    'posts_per_page' => '12',
    'post_type' => 'works',
    'post_status' => 'publish',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'paged' => $paged,
    's' => $s
);
if (isset($current_slug)) {
    $param['tax_query'] = array(
        array(
            'taxonomy' => $current_term->taxonomy,
            'field' => 'slug',
            'terms' => $current_slug
        )
    );
}

if (!empty($_GET)) {
    $param['tax_query'] = array(
        'relation' => 'AND',
        $magazine_menu_selected,
        $magazine_maker_selected
    );
}

原分页代码:

<?php if ($wp_query->max_num_pages > 1) { ?>
    <div class="pagenav">
        <?php global $wp_rewrite;
        $paginate_base = get_pagenum_link(1);
        if (strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()) {
            $paginate_format = '';
            $paginate_base = add_query_arg('paged', '%#%');
        } else {
            $paginate_format = (substr($paginate_base, -1, 1) == '/' ? '' : '/') .
                user_trailingslashit('page/%#%/', 'paged');
            $paginate_base .= '%_%';
        }
        echo paginate_links(array(
            'base' => $paginate_base,
            'format' => $paginate_format,
            'total' => $wp_query->max_num_pages,
            'mid_size' => 1,
            'current' => ($paged ? $paged : 1),
            'prev_text' => '',
            'next_text' => '',
        )); ?>
    </div>
<?php } ?>

修复方案

1. 修复分页链接,保留筛选参数

当前分页代码未保留details、maker等筛选参数,导致第二页URL参数异常。修改分页代码,在生成链接时携带所有GET参数:

<?php if ($wp_query->max_num_pages > 1) { ?>
<div class="pagenav">
    <?php 
    global $wp_rewrite;
    // 获取当前所有GET参数,移除paged避免重复
    $query_args = $_GET;
    unset($query_args['paged']);
    
    // 构建带筛选参数的分页基础链接
    $paginate_base = add_query_arg($query_args, get_pagenum_link(1));
    if (strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()) {
        $paginate_format = '';
        $paginate_base = add_query_arg('paged', '%#%', $paginate_base);
    } else {
        $paginate_format = (substr($paginate_base, -1, 1) == '/' ? '' : '/') .
            user_trailingslashit('page/%#%/', 'paged');
        $paginate_base .= '%_%';
    }
    echo paginate_links(array(
        'base' => $paginate_base,
        'format' => $paginate_format,
        'total' => $wp_query->max_num_pages,
        'mid_size' => 1,
        'current' => ($paged ? $paged : 1),
        'prev_text' => '',
        'next_text' => '',
    )); ?>
</div>
<?php } ?>

2. 修复WP_Query的tax_query逻辑

原代码中$_GET不为空时会直接覆盖tax_query,导致原有分类筛选丢失;同时若某筛选参数为空,会传入空数组引发查询错误。重构tax_query构建逻辑:

// 初始化tax_query,默认AND关系
$tax_query = array('relation' => 'AND');

// 添加当前分类筛选(如果存在)
if (isset($current_slug)) {
    $tax_query[] = array(
        'taxonomy' => $current_term->taxonomy,
        'field' => 'slug',
        'terms' => $current_slug
    );
}

// 添加details筛选(仅当有值时)
if (!empty($get_magazine_menu)) {
    $tax_query[] = array(
        'taxonomy' => $magazine_menu,
        'terms' => $get_magazine_menu,
        'field' => 'name',
        'operator' => 'IN'
    );
}

// 添加maker筛选(仅当有值时)
if (!empty($get_magazine_maker)) {
    $tax_query[] = array(
        'taxonomy' => $magazine_maker,
        'terms' => $get_magazine_maker,
        'field' => 'name',
        'operator' => 'IN'
    );
}

// 构建主查询参数
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$param = array(
    'posts_per_page' => '12',
    'post_type' => 'works',
    'post_status' => 'publish',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'paged' => $paged,
    's' => $s
);

// 只有当tax_query存在实际筛选条件时才添加到参数中
if (count($tax_query) > 1) {
    $param['tax_query'] = $tax_query;
}

// 执行查询
$wp_query = new WP_Query($param);

3. 注册自定义查询变量(可选)

在主题functions.php中添加代码,让WordPress认可这些筛选参数,避免参数被过滤:

function custom_register_query_vars($vars) {
    $vars[] = 'details';
    $vars[] = 'maker';
    return $vars;
}
add_filter('query_vars', 'custom_register_query_vars');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:12:04