Flush_rewrite_rules()取消添加_重写规则()的效果

时间:2014-02-08 作者:geomagas

作为插件的一个特性,我尝试定义一个自定义url结构,如http://www.mysite.tld/foo/{action}. 我正在使用add_rewrite_rule() 随着flush_rewrite_rules() 插件激活时,按预期工作。

直到flush_rewrite_rules() 在另一个请求期间,通过手动或启用其他插件再次调用。当这种情况发生时,我的重写规则突然消失(我正在使用Rewrite Rules Inspector 来检查)。

再现问题所需的最低代码如下:

<?php
/*
Plugin Name: PluginA
*/

register_activation_hook(__FILE__,\'PluginA_activation\');

function PluginA_activation()
    {
    add_rewrite_tag(\'%foo%\',\'([^&]+)\'); 
    add_rewrite_rule(\'foo/([^/]+)\',\'index.php?foo=$matches[1]\',\'top\');
    flush_rewrite_rules();
    }
知道我做错了什么吗?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

重写规则存储在选项中。什么时候flush_rewrite_rules() 调用时,此选项被删除,WordPress收集当前请求期间注册的所有规则,并将该选项新写入数据库。

您的注册并不是在每个请求上都运行,因此在重写选项时,注册并不存在。

在每次页面加载时注册规则,在激活时刷新重写规则。将注册和同花顺分开。

register_activation_hook(__FILE__,\'PluginA_activation\');
add_action( \'wp_loaded\', \'PluginA_rewrite_rules\' );

function PluginA_activation()
{
    PluginA_rewrite_rules();
    flush_rewrite_rules();
}

function PluginA_rewrite_rules()
{
    add_rewrite_tag(\'%foo%\',\'([^&]+)\');
    add_rewrite_rule(\'foo/([^/]+)\',\'index.php?foo=$matches[1]\',\'top\');  
}

结束

相关推荐