Flush_rewrite_rules()在插件激活时不起作用

时间:2013-10-13 作者:Philip Benton

我正在尝试创建一个简单的插件来创建一个名为project的自定义帖子类型,但在激活时没有刷新重写规则方面遇到了一些问题。

我有这个功能的主插件文件:

register_activation_hook( __FILE__, \'Project_Custom_Post_Type::activate\' );
在我的课堂上,我有这样一个问题:

public function activate() {
  flush_rewrite_rules();
}
我的班级结构如下:

public function __construct() {
  add_action( \'init\', array( $this, \'register_post_type\' ), 0 );
}
我不明白为什么它不起作用?我的停用刷新工作正常。

3 个回复
SO网友:fuxia

字符串未作为回调读取。您应该传递一个数组:

$pcpt = new Project_Custom_Post_Type;
register_activation_hook( __FILE__, array( $pcpt, \'activate\' ) );
请注意init 发生before 插件激活,因此不会执行来自类的回调。

SO网友:Otto

激活时,“init”操作已运行。因此,您的刷新实际上进行得很好,但在刷新发生之前,您的帖子类型没有被注册。在刷新重写规则之前,向激活函数添加用于注册帖子类型的代码。

此外,是的,正如托肖所指出的,您的激活挂钩调用是不正确的。

SO网友:Johansson

这可能不是这个问题的直接答案。然而,我已经看到了处理此问题的多种变通方法(flush_rewrite_rules() 首先执行)。

解决方法是设置标志(使用add_option() ) 然后钩住init, 如果标志存在,则刷新重写规则。有点恶心。

如果你想注册的任何东西都可以在插件激活后注册,你可以尝试另一种方法。

register_activation_hook() 在内部注册操作挂钩activate_PLUGIN_NAME. 因此,您可以做的是以更高的优先级在同一挂钩上注册代码。

例如:

// __FILE__ is the main plugin file that contains the plugin headers.
$activation_hook = plugin_basename( __FILE__ );

// Register your stuff here, using a lower priority.
add_action( "activate_{$activation_hook}", "your_callback_to_register", 1, 1 );
现在,您可以使用register_activation_hook() 免费,因为它将以更高的优先级运行。尽管要注意,这个钩子注册某些东西可能为时已晚,但它可以很好地为插件激活添加重写规则。

结束