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

WordPress插件init钩子调用add_rewrite_rule报致命错误求助

WordPress插件中add_rewrite_rule触发致命错误的原因及解决方法

你遇到的致命错误,根源是调用add_rewrite_rule时,全局对象$wp_rewrite还未完成初始化。

WordPress中,$wp_rewrite的实例化是在init钩子的默认优先级(10)阶段完成的。如果你的addRules方法在这个阶段之前执行(比如默认优先级10,可能和核心初始化动作并行,导致对象还未创建),就会出现"Call to a member function add_rule() on null"的错误。

其他插件不需要手动实例化$wp_rewrite,是因为它们要么调整了钩子优先级,要么用了更合适的钩子,确保在$wp_rewrite初始化后再添加规则。

正确解决方法

方法1:调整init钩子的优先级

将你的动作优先级设为高于10的值(比如20),确保在$wp_rewrite初始化后执行:

add_action( 'init', [ __CLASS__, 'addRules' ], 20 );

public static function addRules()
{
    add_rewrite_rule(
        '^my-acct(/.*)/?$',
        'index.php?pagename=my-acct',
        'top'
    );
}

方法2:使用wp_loaded钩子

wp_loaded钩子在WordPress核心完全加载后触发,此时$wp_rewrite肯定已经初始化:

add_action( 'wp_loaded', [ __CLASS__, 'addRules' ]);

public static function addRules()
{
    add_rewrite_rule(
        '^my-acct(/.*)/?$',
        'index.php?pagename=my-acct',
        'top'
    );
}

不建议手动实例化$wp_rewrite的原因

手动创建WP_Rewrite实例会和WordPress内部的原生实例不一致,可能导致后续 permalink 设置保存时,自定义规则无法被正确存储或生效,引发潜在的规则冲突问题。

内容的提问来源于stack exchange,提问作者Brian Gottier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:47:05