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
相关产品推荐
相关产品推荐

