我正在开发一个多任务插件,该插件应该使用特定的模板来设置站点,包括设置几个静态页面和菜单项,以及博客帖子的“博客”类别。
该类别创建得很好,其中有一篇文章,我已经知道如何使用page_for_posts
选项但是,WordPress会在博客的侧栏中的“类别”下创建指向每个类别的默认链接。它在那里建立的链接被破坏了。
It链接到/category/blog
, 但当你点击链接时,你会得到一个404——“好吧,这太尴尬了……”。相同的链接显示在默认404模板的页脚中,但仍然断开(很明显)。
我不知道为什么这个链接不起作用,但我已经知道如果我访问permalink设置页面(或者简单地运行flush_rewrite_rules();
) 在创建的站点中,它可以正常工作。因此,我使用switch\\u to\\u blog从插件的安装脚本运行了它,但由于某些原因,由于插件脚本在主站点上运行,所以它不起作用。在我从创建的站点运行该URL(或访问创建的站点上的permalink structures页面)之前,我仍然会得到该URL的404。以下是我创建的调试脚本,如果我从创建的站点访问它,而不是从主站点访问它,它会正常工作:
//Filename: wp-admin/debug.php
require_once(\'./admin.php\');
global $wp_rewrite;
switch_to_blog(84); //this is the created blog in question
$wp_rewrite->init(); //JUST to make sure it\'s initialized for the correct blog
$wp_rewrite->flush_rules();
restore_current_blog();
$wp_rewrite->init(); //To make sure it\'s set back to where it should be.
所以很明显,在主站点和创建的站点上运行它是有区别的。我不知道重写规则如何与wordpress multisite一起工作。。。所以我不知道如何在一个案例中发现变化,但在另一个案例中却不知道。从返回的规则
get_option(rewrite_rules)
因为blog 84在这两种情况下几乎都是相同的,所以我觉得当我从创建的站点(blog 84)运行它时,必须有另一个步骤来刷新一些重写缓存或其他东西,而当我从主站点运行它时,不会发生这种情况。
有什么想法吗?在新创建的网站上插入自定义类别对您有用吗?当我从创建的站点运行flush\\u rewrite\\u规则时,如何找出哪些变化使其正常工作?
谢谢
SO网友:mltsy
我发现flush_rewrite_rules();
不起作用是因为switch_to_blog
不会重新初始化的某些属性$wp_rewrite
(更不用说WP的其他部分),所以flush_rewrite_rules
仍在根据当前博客的永久链接结构生成一些规则(这不一样),而不是切换到博客(84)。甚至打电话$wp_rewrite->init();
不更新$extra_permastructs
wp\\u rewrite的属性-这是所有默认分类法路径所在的位置!
我必须追查到$extra_permastructs
设置,结果是通过调用$wp_rewrite->add_permastruct
- 幸运的是,由于我们没有安装太多插件,对该函数的唯一相关调用来自一个名为create_initial_taxonomies
. 所以这就成功了:
add_action(\'switch_blog\', function() {
global $wp_rewrite;
$wp_rewrite->init();
create_initial_taxonomies();
});
//[...]
switch_to_blog($new_blog_id);
flush_rewrite_rules();
restore_current_blog();
但是。。。正如WP的@skeltoac刚刚通知我的,只需删除
rewrite_rules
选项使WordPress在下次有人加载该博客上的任何页面时自动重新生成规则(并且由于它位于新博客上,所以它们是从正确的永久链接结构生成的)。因此,更简单的解决方案是:
switch_to_blog($new_blog_id);
delete_option(\'rewrite_rules\');
// This option is automatically regenerated the next time someone loads the new blog!
restore_current_blog();
事实上,我甚至不知道为什么
flush_rewrite_rules
方法存在-它应该只删除
rewrite_rules
.
然而,如果任何人真的需要在另一个博客上编辑规则,而不是出于某种原因刷新规则,那么上述内容可能会有所帮助。
例如,如果您可能有数百次重写,并且您不想让下一个不幸的访问者在其请求的init阶段等待它们全部重新生成,那么可能会发生这种情况。然而,如果你有那么多,很有可能你还有其他的$extra_permastructs
您需要在switch\\u blog操作中说明的内容(除非您有很多分类法):)