在MU插件中,为定制帖子类型刷新_重写_规则的最好方法?

时间:2015-11-28 作者:C C

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

处理的最佳实践是什么flush_rewrite_rules() 在这种情况下?对于“普通”插件,您可以在激活挂钩中执行此操作——对于必须使用的插件,这是不可能的,因为这些挂钩不可用。

由于这应该是注册自定义post类型后的“一次性”事件,因此在注册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”操作上——但如果我有这个权利,重写规则刷新只发生一次。Ever.

我走对了吗?

(编辑):我刚试过;我的CPT出现404 not found错误,因此重写规则不起作用:-(

(编辑#2):我确实尝试了访问全局变量的解决方案,如此问题所示:How to reliably flush rewrite rules on multisite? - 我将更新上面的代码示例来说明这一点。不幸的是,我在尝试加载CPT时仍然遇到404错误。我看到重写规则存储在数据库中,似乎没有使用它们。我迷路了。

4 个回复
SO网友:Andrei

这个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 将起作用

Solution?

就个人而言,我认为删除rewrite\\u 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\' );
唯一的问题是性能,不要对每个请求都这样做,因为构建它们是一个困难的过程。正如我所见,你只想在第一次通话时冲洗它们,这是一件好事。

P、 S:我不太喜欢自我推销,但我也写过article 关于这件事很久以前了,我认为它仍然站得住脚

SO网友:svandragt

MU插件被认为始终处于激活状态,因此register_activation_hookregister_deactivation_hook 永远不会调用挂钩。

而是添加插件版本,每当发生任何影响重写规则的更改时,必须更新插件版本:

namespace My\\Namespace;

define( \'MY_CPTS_REWRITES\', \'2020-05-19.1\' );

function maybe_flush_rewrite_rules() {
    if ( update_option(\'MY_CPTS_REWRITES\', MY_CPTS_REWRITES) ) {
        flush_rewrite_rules(false);
    }
}

add_action( \'init\', __NAMESPACE__ . \'\\\\maybe_flush_rewrite_rules\', 11 );
挂钩优先级设置为11,以确保在注册post类型后运行(如果使用默认优先级10)。

请注意,通过测试update_option() 我们避免了在高流量站点上存在的竞争条件,其中get_option() 呼叫和anupdate_option() 调用值在另一个请求中更改,导致永久刷新。update_option() 包括对选项旧值的检查,仅当选项更改时才返回true。

要测试这一点,请将自定义post类型的重写slug更新为任何其他内容,然后查看前端中的一个项目,它应该包含更新的slug。如果它在更新时没有更新版本号,那么其他的东西正在更新应该调查的永久链接。

SO网友:Leon Francis Shelhamer

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

update_option( \'my_options\', $values );
// Flush rules after install
flush_rewrite_rules();

SO网友:OzzyCzech

我正在使用follow代码。检查当前文件是否已更改,然后刷新重写规则。

add_action(\'init\', function() {
   $md5 = md5_file(__FILE__);
   if (get_option(__FILE__) !== $md5) {
     update_option(__FILE__, $md5);
     flush_rewrite_rules();
   }
});

相关推荐

Post with Custom Permalinks

我的永久链接设置如下:http://myblog.com/%category%/%postname%/一切正常。但我正在寻找一种方法,只为一些帖子(10-11篇帖子)设置如下永久链接。http://myblog.com/%postname%/我之所以要这样做,是因为我正在合并两个WordPress网站,我不想失去另一个网站的帖子,这些帖子已经以旧的permalink结构发布在Facebook等网站上。