You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

add_rewrite_rule在父主题生效但在子主题报404错误怎么解决?

子主题重写规则404问题排查与解决方案

可能的原因

  • 重写规则缓存未刷新:WordPress不会自动检测重写规则变更,你将代码放到子主题后没有手动刷新缓存,父主题代码生效大概率是上次修改父主题代码后刚好刷新过缓存。
  • 自定义查询变量未注册:你使用host作为自定义查询参数,但没有将其加入WordPress白名单查询变量中,父主题可能提前注册过该参数所以能正常生效,子主题加载顺序早于父主题,没读到父主题的注册逻辑就会失效。
  • 重写规则优先级被覆盖:子主题的init钩子默认优先级和父主题一致,如果父主题或其他插件也注册了coupons开头的重写规则且优先级更高,就会覆盖子主题中的规则。
  • 重写规则内部路径写法问题:你当前写的内部重定向地址coupons/?host=$1是非标准写法,标准写法应该基于index.php传入查询参数,非标准写法在子主题加载时可能被WordPress的规则校验拦截。

解决方案

按顺序操作即可:

  1. 刷新重写规则缓存
    登录WordPress后台,进入【设置】→【固定链接】页面,直接点击底部的「保存更改」按钮,不需要修改任何配置,即可刷新所有重写规则缓存,之后先测试访问链接是否正常。
  2. 注册自定义查询变量
    在现有代码基础上添加如下代码,将host加入查询变量白名单:
add_filter('query_vars', function($vars) {
    $vars[] = 'host';
    return $vars;
});
  1. 调整重写规则写法与优先级
    把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);
  1. 验证模板路径(可选)
    如果调整后还是异常,可以修改模板引入逻辑增加存在性判断,避免路径错误:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:45:02