假设您有一个需要刷新重写规则的插件。您可以使用激活钩正确地完成所有操作,并在以后添加刷新,因此一切都平滑且兼容。

然后有一天,有人尝试在多站点上运行它。

一个简单的场景,如:


创建了WordPress网站
已安装并激活插件

您现在遇到了噩梦般的场景:

已安装插件并激活了网络
在多站点中创建了新的WordPress站点(或一百个)

从理论上讲,它应该可以工作,对吗?实际上,它以一种引人注目的方式出错: br />“后期”部分可能完全发生在不同的博客中
您应该很好用的所有其他插件,可能未在不同的站点上始终启用
可以看到此问题,如何在每次创建新站点时正确地执行操作会破坏主站点上的永久链接。

那么插件将如何可靠地刷新多站点中的重写规则: />
创建新站点时是针对该站点的?停用网络插件后,对于每个站点?
在其他情况下是否可能需要更改重写全局上下文?


#1 楼

注意:这是一个不完整的答案,将逐步扩展

刷新多站点中重写规则的唯一可靠方法,而又不会破坏主要和/或其他博客上下文的永久链接结构(取决于如何以及在什么情况下切换)是在给定的上下文中刷新重写规则,如下所示:重写规则并将更改提交给数据库。
这不适用于上下文无关紧要的单个站点,因为只有一个上下文。
我认为flush_rewrite_rules()在假设它的前提下存在缺陷正确的上下文,但没有考虑到我们使用switch_to_blog的情况,因为如果可能尝试刷新规则,则flush_rewrite_rules()的使用会完全改变上下文并使我们陷入危险的境地。
这是WP_Rewrite的内部结构如下:
q431207 8q
我想不出它为什么不应该是这样的原因:
global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

...尤其是当您考虑到wpmu_create_blog()的构造函数会做什么时?它会执行此操作。
function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

谈到您的第一个关注点,以进一步推动这一点,

那么,插件如何可靠地刷新多站点中的重写规则:

创建新网站时,该网站是该网站吗? >首先install_blog()

,然后调用populate_options(),然后依次调用populate_options()

,然后install_blog()wp_install_defaults()运行后在选项表中设置默认的永久链接结构
,然后调用wp_install_defaults()
然后restore_current_blog()刷新新创建的站点的重写规则,然后最终通过wp_install_defaults()切换回当前博客。 :
function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

...,因为这是确保为当前上下文构建正确的permalink_structure和规则的唯一方法。行为:

创建新网站时,它仅在顶级网站上破坏帖子的永久链接-在大多数永久链接配置中,但并非全部:
这2种格式可以正常工作。
默认-按预期工作
日期和名称-按预期工作

...是因为如果主博客具有“日期和名称”永久链接结构/%year%/%monthnum%/%day%/%postname%/,则在创建新网站时,默认情况下,它也具有“日期和名称”永久链接结构/%year%/%monthnum%/%day%/%postname%/,这就是为什么当Yoast SEO插件刷新shutdown钩子上的重写规则时,不会出现明显问题的原因。

评论


听起来不错。安装新站点的烦人之处在于,只有在该站点完成后,您才能在该过程中进行挂接。因此,规则将被刷新两次。

–安东·蒂默曼斯(Anton Timmermans)
2015年5月11日19:44



赏金时间用完了,所以要在这里落剑。 :)仍然有很多要弄清楚的。 :(

–稀有
2015年5月18日20:00

是否无法手动设置$ wp_rewrite的上下文,以便您可以遍历并重置每个网络站点?我有一个大型网站,该网站在自定义插件上存在一些永久链接问题。制作一个添加cron的插件似乎是过分的,因为它总是会重置它们。用自定义URL对其进行循环将是理想的选择,但我不知道该如何在所有网站上使用。

–亚当·帕特森(Adam Patterson)
17 Mar 1 '17在3:24