2016-04-09 57 views
0

我有我自己的插件,在激活时,添加了一些将url映射到单页应用程序的重写规则。wordpress:检测重写规则刷新

现在,我偶尔失去了一些规则,在其他插件更新之后,或者在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

我可以看到几个选项;修复症状,或追查原因。

固定症状

WP_Rewrite::rewrite_rules()功能到底是一个过滤器rewrite_rules_array

$this->rules = apply_filters('rewrite_rules_array', $this->rules); 

你可以挂接到这一点,让你的规则是存在(如果他们不”,并称他们t存在)。如果使用相同的钩子删除规则,则将其与高位号码挂钩为$priority参数。

追查原因

或者,你可以改变flush_rewrite_rules函数本身(假设这是对被删除您的规则的流氓变化的入口点),并使其向您发送电子邮件堆栈跟踪时,它是调用。它可能会帮助你追查原因。喜欢的东西(完全未经):

function flush_rewrite_rules($hard = true) { 
    global $wp_rewrite; 

    $e = new Exception(); 
    wp_mail ('[email protected]', 'flush_rewrite_rules called', $e->getTraceAsString()); 

    $wp_rewrite->flush_rules($hard); 
} 

显然这种改变只是暂时的,直到你有问题铅 - 我从来没有主张永久更改核心代码。

如果这不起作用,您可能需要将其更深入$wp_rewrite,如generate_rewrite_rules函数。

+0

我想我会结合你的答案:添加我的规则,如果他们不从我自己的插件(所以没有核心黑客攻击)。当发生刷新时,在我的debug.log中写入一些东西。这样我可以追查下来,并希望一劳永逸。 – Mattijs