我有自己的插件,在激活时会添加一些重写规则,将网址映射到单页应用程序。
现在,我偶尔会丢失规则,经过一些其他插件更新或者在Wordpress中触发flush_rewrite_rules
的其他进程。
问题是,我不知道它何时,如何或为何发生。由谁。
所以我在WP文件中全局搜索并提出以下触发刷新的操作
add_action( 'woocommerce_settings_saved', array( $this, 'load' ) );
add_action( 'woocommerce_attribute_added', array( $this, 'load' ) );
add_action( 'woocommerce_attribute_updated', array( $this, 'load' ) );
add_action( 'woocommerce_attribute_deleted', array( $this, 'load' ) );
add_action( 'wp_install', array( $this, 'load' ) );
add_action( 'after_db_upgrade', array( $this, 'load' ) );
add_action( 'after_switch_theme', array( $this, 'load' ) );
当触发其中一个操作时,我会重新加载规则。 当其中一个触发时,这是有效的。 所以可能,偶尔会有另一个触发我无法找到的触发器。 或者可能在动作触发后发生刷新,使我的负载无效。
那么,有没有更好的方法来挂钩,以便我可以自动添加自己的规则? 现在我们在几天后发现有人抱怨该应用程序无法正常工作,我必须再次加载规则。
任何建议都表示赞赏。
干杯
答案 0 :(得分:1)
我可以看到几个选项;修复症状,或追查原因。
修复症状
WP_Rewrite::rewrite_rules()
函数的末尾是过滤器rewrite_rules_array
:
$this->rules = apply_filters( 'rewrite_rules_array', $this->rules );
你可以参与其中并使你的规则存在(如果它们不存在则添加它们)。如果使用相同的钩子删除规则,则使用$priority
参数的高数字挂钩。
追查原因
或者,您可以更改flush_rewrite_rules
功能本身(假设是删除规则的流氓更改的入口点),并且只要它“#”;叫。它可能有助于您追踪原因。像(完全未经测试)的东西:
function flush_rewrite_rules( $hard = true ) {
global $wp_rewrite;
$e = new Exception();
wp_mail ( 'you@example.com', 'flush_rewrite_rules called', $e->getTraceAsString() );
$wp_rewrite->flush_rules( $hard );
}
显然,改变只是暂时的,直到你对问题有所了解 - 我从不主张永久性地更改核心代码。
如果这不起作用,您可能需要将其更深入$wp_rewrite
,就像generate_rewrite_rules
函数一样。