使用meta_query结合自定义查询变量时Timber分页出现404错误
解决自定义文章类型筛选后分页404问题
你的问题核心是主查询与自定义Timber查询的参数不匹配:WordPress的分页逻辑依赖主查询结果判断页面合法性,但你仅在search.php的自定义查询中加入了meta_query,主查询(pre_get_posts中的$query)未同步筛选条件,导致分页时主查询找不到对应内容,返回404。
以下是具体修复步骤:
1. 注册自定义查询变量
先让WordPress识别你的筛选参数,避免分页时参数丢失。在functions.php中添加:
function register_grants_query_vars($vars) { $vars[] = 'program_type'; $vars[] = 'contributor'; $vars[] = 'researchers'; $vars[] = 'area_of_research'; $vars[] = 'disease_areas'; $vars[] = 'province'; $vars[] = 'start_date'; $vars[] = 'end_date'; return $vars; } add_filter('query_vars', 'register_grants_query_vars');
2. 在pre_get_posts中同步meta_query
修改filterFundedGrantsSearch函数,将筛选条件同步到主查询,确保主查询与自定义查询逻辑一致:
function filterFundedGrantsSearch($query) { if ($query->is_search && $query->get('post_type') == 'funded_grants' && !is_admin() ) { // 获取所有自定义筛选参数 $program_type = get_query_var('program_type'); $contributor = get_query_var('contributor'); $researchers = get_query_var('researchers'); $area_of_research = get_query_var('area_of_research'); $disease_areas = get_query_var('disease_areas'); $province = get_query_var('province'); $start_date = get_query_var('start_date'); $end_date = get_query_var('end_date'); // 复用你的meta_query生成函数 $meta_query = bc_create_meta_query(); // 同步主查询参数 $query->set('posts_per_page', 5); $query->set('meta_query', $meta_query); // paged参数无需手动设置,WordPress会自动处理,删除原手动赋值代码 } return $query; } add_filter('pre_get_posts','filterFundedGrantsSearch');
3. 简化search.php中的Timber查询
主查询已包含所有筛选条件,直接复用主查询结果即可,无需新建PostQuery:
if ( $post_type == 'funded_grants' ) { // 直接使用主查询构建Timber PostQuery $context['posts'] = new Timber\PostQuery(); Timber::render(['archive-funded_grants.twig'], $context); }
若坚持手动构建查询,需确保参数与主查询完全同步,比如添加'paged' => get_query_var('paged')。
4. 刷新固定链接
进入后台「设置」→「固定链接」,任选一个选项保存,刷新WordPress重写规则,确保新参数能被正确解析。
额外检查点
- 确认
bc_create_meta_query生成的meta_query格式合法,无语法错误 - 验证分页链接是否携带所有自定义筛选参数(如
/search/page/2/?program_type=xxx)
内容的提问来源于stack exchange,提问作者Michael Walker
相关产品推荐
相关产品推荐

