作为插件的一个特性,我试图定义一个自定义url结构,比如http://www.mysite.tld/foo/{action}。我在插件激活上使用了add_rewrite_rule()和flush_rewrite_rules(),这就像预期的那样。
直到flush_rewrite_rules()再次被调用,在另一个请求中,要么手动调用,要么启用另一个这样做的插件。当这种情况发生时,我的重写规则突然消失了(我正在使用重写规则检查器检查此规则)。
复制该问题所需的最低限度代码如下:
<?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();
}知道我做错什么了吗?
发布于 2014-02-08 16:13:18
重写规则存储在选项中。当调用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');
}https://wordpress.stackexchange.com/questions/133906
复制相似问题