自定义类别的默认类别链接是断开的链接

时间:2012-08-24 作者:mltsy

我正在开发一个多任务插件,该插件应该使用特定的模板来设置站点,包括设置几个静态页面和菜单项,以及博客帖子的“博客”类别。

该类别创建得很好,其中有一篇文章,我已经知道如何使用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规则时,如何找出哪些变化使其正常工作?

谢谢

2 个回复
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操作中说明的内容(除非您有很多分类法):)

SO网友:sanchothefat

尝试使用稍微不同的方法编辑新站点选项表中的选项,而不是刷新重写规则。

这可能是因为新站点开始时没有设置使用永久链接选项,因此在使用永久链接结构集的值保存重写规则之前,不会识别好的URL。

尝试以下操作:

//Filename: wp-admin/debug.php

require_once(\'./admin.php\');

switch_to_blog(84); //this is the created blog in question

// add permalink option and remove rewrite rules so they get rerun
update_option( \'permalink_structure\', \'/%year%/%monthnum%/%postname%/\' );
update_option( \'rewrite_rules\', array() );

// flush_rewrite_rules(); // if it doesn\'t work with the above try uncommenting this

restore_current_blog();

结束

相关推荐

Keep permalinks in Wordpress

有没有办法设置我的永久链接以保持其精确链接。如果我有这样的帖子http://blog.rigo.ro/?p=11, 然后我希望每次我编辑帖子时都能保留这个链接。我已经安装了修订控制插件,并将其设置为不保留修订。有什么办法吗?我想保留这种格式的链接。编辑:我又看了一遍,永久链接保持着它们的链接,但每次我编辑它时,它都会向数据库中添加一个新版本,下一篇文章的编号会更高。如果我编辑当前帖子3次(blog.rigo.ro/?p=11),下一篇帖子将是blog。里戈。ro/?p=14。现在,我的问题是如何保持所有帖