注意:这是不完整的答案,将逐步扩展
在多站点中刷新重写规则,而又不破坏主要和/或任何其他博客上下文的永久链接结构(取决于您切换的方式和方式)的唯一可靠方法是在给定上下文中刷新重写规则,如下所示:
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
。