在mu-plugins插件中为flush_rewrite_rules自定义帖子类型的最佳方法?


9

我正在编写一个实例化自定义帖子类型的插件(除其他外)。它是一个多站点插件,位于目录mu-plugins中

在这种情况下处理flush_rewrite_rules()的最佳实践是什么?对于“普通”插件,您可以在激活钩子中进行此操作-对于必需使用的插件将无法实现,因为这些钩子不可用。

由于这应该是在注册自定义帖子类型之后的“一次性”事件,因此在我注册CPT的类中做这样的事情是否有意义:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

因此,CPT注册发生在每个“ init”操作上-但如果我有此权利,则重写规则刷新仅发生一次。 曾经

我在正确的轨道上吗?

(编辑):我刚刚尝试过;我的CPT显示404错误,因此重写规则不起作用:-(

(编辑#2):我确实尝试了访问全局变量的解决方案,如以下问题所示: 如何可靠地刷新多站点上的重写规则?-我将更新上面的代码示例以显示这一点。不幸的是,尝试加载CPT时仍然出现404错误。我看到重写规则正在存储在数据库中,似乎它们没有被使用。我迷路了。



确实没有适当的方法来执行此操作。在撰写此评论时,基本上是最好的。
Pieter Goosen

@PieterGoosen-谢谢,我的确见过,我更新了问题以考虑其他解决方案。还是行不通。我想知道在看到其他答案之前是否通过执行flush_rewrite_rules()破坏了某些内容?也许我必须删除测试站点并重新建立它,才能正确测试正确的过程?
CC

那可能是可能的。在多站点中错误地执行刷新重写规则可能会破坏网络中的所有重写规则。如果我在你那里,我会重新开始。只是希望这是本地安装而不是现场站点;-)
Pieter Goosen

对...我会尝试的。不,这是一个测试站点,我认为我现在可以清除数据库并在睡眠中重新设置网络配置!:-)
CC

Answers:


2

flush_rewrite_rules功能在某些情况下是可靠的,例如主题或基于挂钩的插件,但我不确定它是否适用于mu-plugin

我的陈述基于以下事实:WordPress是通过以下方式初始化的:

  • 呼叫wp-settings.php档案
  • 调用do_action( 'muplugins_loaded' );钩子,这里您的插件已初始化
  • $GLOBALS['wp_rewrite'] = new WP_Rewrite();在这里调用方法flush_rules已初始化,从现在开始可用
  • do_action( 'setup_theme' );被称为,我下注我所有的钱,在这个钩子flush_rewrite_rules上将起作用

解?

我个人认为删除rewrite_rules选项确实可靠。

delete_option('rewrite_rules');

要么

update_option('rewrite_rules', '' );

每当WordPress缺少时,rewrite_rules它将重新构建它们,这也是该flush_rules方法的作用。

WordPress执行流程中有些地方无法使用此类功能。即使在WordPress的核心中,我也发现了这句话

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

唯一的问题就是性能,不要对每个请求都执行此操作,因为将它们重新构建是一个艰巨的过程。如我所见,您只想在第一次调用时刷新它们,这是一件好事。

PS:我不是那种自我宣传的粉丝,但很久以前我也写过一篇文章,我认为它仍然可以支持


0

如果您的mu插件有选项,我会在更新它们后立即将其刷新:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.