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
相关产品推荐
相关产品推荐

