使用Wordpress 3.1和最新的高级永久链接和自定义帖子类型UI,我创建了一个名为“人物”的自定义帖子类型。这个帖子类型的所有孩子的url模式是people / jim,但是当我查看帖子时,我陷入无限重定向循环。这只发生在我使用漂亮的永久链接时,而不是在使用id时。
Advanced Permalinks上使用的永久链接结构是:
自定义结构:%postname%
%postname%
答案 0 :(得分:1)
经过大量的日志记录和调试后,我发现导致无限重定向的函数是function the_posts($posts)
。如果你评论从if (is_single () && count ($posts) > 0)
到remove_filter ('the_posts', array (&$this, 'the_posts'));
之前的所有内容,它会停止无限重定向,并且似乎仍能正常运行!唯一的副作用是,如果你转到/jim/
,它会将你重定向回/people/jim/
(而不仅仅是给你一个404)。对我来说,这很好,因为它解决了这个问题。
再次,在advanced-permalinks.php
内,搜索function the_posts
,然后对其进行评论,使其看起来像下面的代码。
为什么会破坏它?因为自定义帖子类型is_single并且与任何规则都不匹配,显然,这使得APL将其重新发送回去......无休止地。等等。也许有一种更聪明的方法可以做到这一点,检查它是否是一个自定义的帖子类型,或者其他什么,但只是禁用它似乎没关系。
/**
* Hook that is called when a post is ready to be displayed. We check if the permalink that generated this post is the
* correct one. This prevents people accessing posts on other permalink structures. A 301 is issued back to the original post
*
* @return void
**/
function the_posts ($posts)
{
/* DISABLED CODE BELOW:
// Only validate the permalink on single-page posts
if (is_single () && count ($posts) > 0)
{
global $wp, $wp_rewrite;
$id = $posts[0]->ID; // Single page => only one post
// Is this a migrated rule?
$migrate = get_option ('advanced_permalinks_migration_rule');
if ($migrate)
{
if (isset ($migrate[$wp->matched_rule]) && substr (get_permalink ($id), strlen (get_bloginfo ('home'))) != $_SERVER['REQUEST_URI'])
{
wp_redirect (get_permalink ($id));
die ();
}
}
else
{
// Get the permalink for the post
$permalink = $this->get_full_permalink ($id);
// Generate rewrite rules for this permalink
$rules = $wp_rewrite->generate_rewrite_rules ($permalink);
// THIS IS ESPECIALLY PROBLEMATIC PART FOR CUSTOM POSTTYPES
// If the post's permalink structure is not in the rewrite rules then we redirect to the correct URL
if ($wp->matched_rule && !isset ($rules[$wp->matched_rule]))
{
wp_redirect ( get_permalink ($id));
die ();
}
}
}
DISABLED CODE ABOVE */
remove_filter ('the_posts', array (&$this, 'the_posts'));
return $posts;
}