在404中,在POST永久链接中包含类别基础

时间:2012-07-14 作者:semyonfilippov

我有静态首页和单独的页面/news/ 作为Posts页面。我希望有这样的单贴URL:

www.example.com/news/categoryname/subcategory/postname/
对于类别档案:

www.example.com/news/categoryname/
我已经尝试过的:

如果我添加news 作为我的类别库和/news/%category%/%postname%/ 作为定制的permalink结构,我得到了所需的URL,但404 单篇文章错误(两篇都有news/ 在URL中或不在URL中)。所有其他页面(如类别档案、页面等)均可访问。

如果我将category base留空并将permalinks作为/news/%category%/%postname%/, 有no 404 错误,但类别URL还包含默认URLcategory slug,就像这样:www.example.com/news/category/categoryname/

如果我使用插件删除默认类别库,或只是将类别库设置为. 它与news 部分

如果我将永久链接设置为/%category%/%postname%/ 并仅添加类别库news, 还有no 404 错误,但到帖子的链接不是以news: www.example.com/categoryname/subcategory/postname/

还有一些类似的未回答的问题:Posts not showing with custom categorybase and subcategorieswordpress permalinks tweeks

4 个回复
最合适的回答,由SO网友:semyonfilippov 整理而成

我最近又回到这个问题上,终于找到了解决办法!它可能对您有效,也可能无效-有两种可能的情况:

如果您网站上的某些帖子位于父类别下,而某些帖子位于子类别(子类别)下,或者这些类别具有不同的嵌套级别(一些父类别只有子类别,而另一些则是子类别),则there is no solution. 无法区分news/category/post-name/ 从…起news/category/subcategory/ 在重写规则中使用regex。

如果所有类别都有固定的嵌套级别,并且只在最后一个级别的子类别中发布,那么你就很幸运了!There is quite simple solution:

这404页news 在类别库和自定义永久链接结构中,类别库内部重写规则优先于永久链接结构规则。所以news/category/subcategory/postname/ 被解释为index.php?category_name=category/subcategory/postname 很明显,WordPress找不到这样的类别,返回404页。

您需要做的是在规则列表的顶部添加新的重写规则。将此代码放入functions.php 或任何你认为合适的地方:

add_action( \'init\', \'wpa58471_category_base\' );
function wpa58471_category_base() {
    // Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
        // The regex to match the incoming URL
        \'news/([^/]+)/([^/]+)/([^/]+)(/[0-9]+)?/?$\',
        // The resulting internal URL
        \'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]\',
        // Add the rule to the top of the rewrite list
        \'top\' );
}
然后从WordPress常规选项页面更新permalink结构。上面的代码用于两级嵌套,如果您有或多或少的嵌套类别结构,则相应地编辑regex和生成的URL。

P、 感谢这些有用答案的贡献者:help with add_rewrite_ruletool to analyze rewrite rules.

SO网友:Piotr Markiełaŭ

您只需添加“/”在类别基础之后:

类别基础:news/. (/。是必需的,因为它可以防止404s用于post)。

这对我来说非常有效:)

编辑:除非包含“.”,否则此字段将删除尾随或前导斜杠

SO网友:Leo Eidinov

自定义permalink结构:/media/%category%/%postname%/类别基础:.

为我工作,WordPress 3.4.1,没有任何相关插件。

更新:后来我注意到wp_list_categories 输出URL中没有“媒体”的链接。但是帖子可以通过所需的URL结构访问,类别档案也在正确的位置。现在,我正在研究更改wp\\u list\\u类别行为。

SO网友:Lanius

我最好发表评论,但现在不行。您的代码工作得很好,但如果您不想破坏每个类别的RSS提要,它应该如下所示:

add_action( \'init\', \'wpa58471_category_base\' );
function wpa58471_category_base() {
// Remember to flush the rules once manually after you added this code!
    add_rewrite_rule(
    // The regex to match the incoming URL
    \'news/([^/]+)/([^/]+)/([^/][^f][^e][^e][^d]+)(/[0-9]+)?/?$\', //here my changes to exclude \'feed\'
    // The resulting internal URL
    \'index.php?category_name=$matches[1]/$matches[2]&name=$matches[3]&paged=$matches[4]\',
    // Add the rule to the top of the rewrite list
    \'top\' );
}
无论如何,感谢您提供了一个很棒的代码示例。:)

结束

相关推荐

Page Name and Permalinks

我正在使用WordPress 3.2.1,刚刚在我的网站上添加了一个名为“中心管理”的页面,这反过来又创建了一个永久链接:http://localhost:8888/mysite/centre-management/对于我刚刚创建的页面。之后,我把这个页面弄得一团糟,想重新开始。因此,当我现在创建另一个与上述名称相同的新页面时,即“中心管理”,WordPress现在为我创建一个永久链接:‎http://localhost:8888/mysite/centre-管理-2/这不是我想要的。我希望它显示为:ht