add_rewrite_rule在父主题生效但在子主题报404错误怎么解决?
子主题重写规则404问题排查与解决方案
可能的原因
- 重写规则缓存未刷新:WordPress不会自动检测重写规则变更,你将代码放到子主题后没有手动刷新缓存,父主题代码生效大概率是上次修改父主题代码后刚好刷新过缓存。
- 自定义查询变量未注册:你使用
host作为自定义查询参数,但没有将其加入WordPress白名单查询变量中,父主题可能提前注册过该参数所以能正常生效,子主题加载顺序早于父主题,没读到父主题的注册逻辑就会失效。 - 重写规则优先级被覆盖:子主题的
init钩子默认优先级和父主题一致,如果父主题或其他插件也注册了coupons开头的重写规则且优先级更高,就会覆盖子主题中的规则。 - 重写规则内部路径写法问题:你当前写的内部重定向地址
coupons/?host=$1是非标准写法,标准写法应该基于index.php传入查询参数,非标准写法在子主题加载时可能被WordPress的规则校验拦截。
解决方案
按顺序操作即可:
- 刷新重写规则缓存
登录WordPress后台,进入【设置】→【固定链接】页面,直接点击底部的「保存更改」按钮,不需要修改任何配置,即可刷新所有重写规则缓存,之后先测试访问链接是否正常。 - 注册自定义查询变量
在现有代码基础上添加如下代码,将host加入查询变量白名单:
add_filter('query_vars', function($vars) { $vars[] = 'host'; return $vars; });
- 调整重写规则写法与优先级
把add_rewrite_rule的第二个参数改成标准WordPress内部查询格式,同时给init钩子设置更高的执行优先级(数值越小优先级越高),修改后的重写规则代码如下:
function custom_rewrite_basic() { // 如果你注册的CPT别名不是coupons,自行替换post_type参数值为你的CPT别名 add_rewrite_rule('^coupons/([a-z0-9-]+)[/]?$', 'index.php?post_type=coupons&host=$matches[1]', 'top'); } // 优先级设置为9,比默认的10更早执行,避免被其他规则覆盖 add_action('init', 'custom_rewrite_basic', 9);
- 验证模板路径(可选)
如果调整后还是异常,可以修改模板引入逻辑增加存在性判断,避免路径错误:
add_action( 'template_include', function( $template ) { if ( get_query_var( 'host' ) == false || get_query_var( 'host' ) == '' ) { return $template; } $custom_template = get_theme_file_path().'/list-coupons.php'; return file_exists($custom_template) ? $custom_template : $template; } );
所有代码修改完成后,再次进入固定链接页面保存更改刷新缓存即可。
内容的提问来源于stack exchange,提问作者GoSSDHosting
相关产品推荐
相关产品推荐

