如何可靠地刷新多站点上的重写规则?


20

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

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

而不是像这样的简单方案:

  1. WordPress网站已创建
  2. 插件已安装并激活

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

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

从理论上讲它应该起作用,对吗?实际上,它以引人注目的方式出错:

  • $wp_rewrite 状态可能来自错误的站点
  • switch_to_blog() 也不跟踪重写状态
  • “后期”部分可能完全发生在不同的博客中
  • 您应该很好用的所有其他插件,可能未在其他站点上一致启用

例如,您可以看到此问题,每当创建新站点时,如何正确地尝试消除主站点上的永久链接

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

  1. 创建新站点时,该站点是什么?
  2. 当现有站点从非活动状态激活时,该站点是?
  3. 当插件被网络激活时,对于每个站点?
  4. 停用网络插件后,对于每个站点?
  5. 可能在其他情况下,涉及重写全局上下文而被更改?

Answers:


11

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


在多站点中刷新重写规则,而又不破坏主要和/或任何其他博客上下文的永久链接结构(取决于您切换的方式和方式)的唯一可靠方法是在给定上下文中刷新重写规则,如下所示:

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

上面的内容可以确保在构造重写规则并将更改提交到数据库之前,为给定上下文检索和设置正确的永久链接结构。

这不适用于上下文无关紧要的单个站点,因为只有一个上下文。

flush_rewrite_rules()我认为前提是它假定了正确的上下文,但没有考虑到我们的使用,switch_to_blog因为如果我们尝试刷新规则,它的使用会完全改变上下文并使我们陷入危险境地,这是有缺陷的。

这是的内部结构flush_rewrite_rules()

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

我不知道为什么它不应该像这样:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

...尤其是当您考虑的构造函数时会WP_Rewrite做什么?它做到了...

public function __construct() {
    $this->init();
}

谈及您的第一个关注点,以进一步推动这方面的发展,

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

  • 创建新站点时,该站点是什么?

让我们看一下在此过程中WordPress核心将调用什么:

  • 第一 wpmu_create_blog()
  • 然后调用install_blog(),依次调用populate_options()
  • 然后populate_options()在选项表中设置默认的永久链接结构
  • install_blog()有跑去,wp_install_defaults()然后被调用
  • 然后wp_install_defaults()刷新新建站点的重写规则,然后最终通过切换回当前博客restore_current_blog()

需要特别注意的是,wp_install_defaults()刷新规则与上面我上面建议的完全相同:

$wp_rewrite->init();
$wp_rewrite->flush_rules();

...因为这是确保正确的permalink_structure规则和针对当前上下文建立的唯一方法。

同样在Github问题中证明的问题中,用户经历以下行为的原因:

创建新站点时,它仅在顶级站点上破坏帖子级别的永久链接-在大多数永久链接配置中,但不是全部:

这两种格式可以正常工作。

默认-按预期工作

日期和名称-符合预期

...是因为如果主博客具有Day&Name永久链接结构/%year%/%monthnum%/%day%/%postname%/,则在创建新网站时/%year%/%monthnum%/%day%/%postname%/,默认情况下也具有Day&Name永久链接结构,这就是为什么Yoast SEO插件刷新重写时不会出现明显问题的原因规则shutdown


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

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

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