WordPress add_rewrite_rule()导致compare页面带字符URL返回404错误求助
问题分析与解决方案
你遇到404的核心原因是当前的重写规则只匹配数字路径,但你访问的compare/aa-bb-cc-dd包含字母和横杠,完全不符合规则里的正则表达式,所以WordPress无法匹配到对应的页面,返回404错误。
具体问题拆解
你写的正则^compare/([0-9]+)/?中,[0-9]+表示只匹配1个或多个数字字符,而aa-bb-cc-dd包含字母(a-z)和横杠(-),根本不在匹配范围内,所以规则不会触发。
修复步骤
修改正则表达式,匹配目标路径格式
将正则改为能匹配字母、数字、横杠的组合,替换后的代码如下:add_action( 'init', 'custom_rewrite_rules'); function custom_rewrite_rules() { // 匹配字母、数字、横杠的任意组合 add_rewrite_rule('^compare/([a-zA-Z0-9-]+)/?', 'index.php?page_id=250', 'top'); // 重要提示:不要把flush_rewrite_rules()放在init钩子中! // 每次页面加载都执行会严重影响性能,建议只在首次修改后临时调用一次, // 之后注释掉,或者直接去后台刷新规则 // flush_rewrite_rules(); }刷新重写规则
修改代码后,必须刷新WordPress的重写规则才能生效:- 登录WordPress后台,进入「设置」→「固定链接」
- 不需要修改任何设置,直接点击「保存更改」按钮即可完成规则刷新
进阶优化(可选)
如果你需要在compare页面中获取aa-bb-cc-dd这个路径参数,可以添加query var支持,代码示例:
// 注册自定义query var add_filter('query_vars', 'custom_compare_query_vars'); function custom_compare_query_vars($vars) { $vars[] = 'compare_slug'; return $vars; } // 修改重写规则,传递参数 add_action( 'init', 'custom_rewrite_rules'); function custom_rewrite_rules() { add_rewrite_rule('^compare/([a-zA-Z0-9-]+)/?', 'index.php?page_id=250&compare_slug=$matches[1]', 'top'); }
之后在compare页面的模板文件中,就可以用get_query_var('compare_slug')获取到aa-bb-cc-dd这个值,用于后续业务逻辑处理。
内容的提问来源于stack exchange,提问作者NewUser
相关产品推荐
相关产品推荐

