wordpress:检测重写规则刷新

时间:2016-04-09 00:18:18

标签: wordpress mod-rewrite

我有自己的插件,在激活时会添加一些重写规则,将网址映射到单页应用程序。

现在,我偶尔会丢失规则,经过一些其他插件更新或者在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' ) );

当触发其中一个操作时,我会重新加载规则。 当其中一个触发时,这是有效的。 所以可能,偶尔会有另一个触发我无法找到的触发器。 或者可能在动作触发后发生刷新,使我的负载无效。

那么,有没有更好的方法来挂钩,以便我可以自动添加自己的规则? 现在我们在几天后发现有人抱怨该应用程序无法正常工作,我必须再次加载规则。

任何建议都表示赞赏。

干杯

1 个答案:

答案 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函数一样。