带参数的自定义文章分页为何在部分搜索词下触发404错误
核心诱因(按出现概率从高到低)
自定义查询的分页计数错误
你加了distance=3这类自定义筛选,大概率是用pre_get_posts修改主查询、或是通过自定义SQL/meta_query实现距离匹配。如果修改了查询逻辑但没有同步修正found_posts的计数,WP会错误计算总页数:
York的搜索结果刚好触发计数逻辑的边界,算出总页数≥2,能正常访问第2页;但Huntington的结果被错误计数为「总页数=1」,哪怕实际有足够多的结果,WP也会直接返回404。
排查方法:在搜索结果模板(search.php或archive.php)里临时加var_dump($GLOBALS['wp_query']->found_posts, $GLOBALS['wp_query']->max_num_pages);,访问两个搜索词的第1页,确认Huntington对应的max_num_pages是否返回1。未注册自定义查询变量导致参数丢失
post_type=property和distance=3不属于WP默认查询参数,如果没有通过query_vars过滤器把它们加入白名单,WP处理/page/2/这类分页路由时会直接丢弃这两个参数。
York的搜索结果哪怕丢了这两个参数,依然能匹配到≥2页的内容;但Huntington的结果丢了参数后,匹配范围变成全站,最终结果只有1页,触发404。
排查方法:在第1页的搜索模板里输出var_dump(get_query_var('post_type'), get_query_var('distance'));,看访问Huntington的URL时这两个值是否为空。重写规则/路由优先级冲突
两种常见场景:- 你写过自定义重定向规则(比如挂在
template_redirect钩子上的301跳转),刚好匹配到带Huntington的搜索请求,直接跳去了404页; - 站点里存在slug为
huntington(不区分大小写)的自定义文章/页面/归档,WP的路由优先级是「独立内容页 > 归档页 > 搜索分页」,当请求的查询参数能命中这个slug时,重写引擎会优先匹配slug对应的路由,而不是搜索分页路由,最终触发404。
排查方法:
- 临时禁用所有自定义重定向代码,把固定链接换成WP默认结构再测试;
- 后台全局搜索有没有slug为
huntington的内容,临时修改slug后再测试。
- 你写过自定义重定向规则(比如挂在
快速验证小技巧:把搜索词改成全小写(比如
s=huntington)再访问分页,如果能正常加载,基本可以确定是路由的大小写不敏感匹配冲突。
内容的提问来源于stack exchange,提问作者onesixty

