这不容易吗?自定义帖子类型/自定义分类法永久链接


11

因此,这绝对让我发疯。我花了几天的时间来解决这个问题,但我无法弄清楚为什么如此困难,因为这肯定是一个非常常见的永久链接结构!

我浏览了数百个答案和帖子,但似乎都无法解决问题。

我只是想要这种结构:

mysite.com/custom-post-type/custom-taxonomy-term/post-name

因此,我实现了以下目标:

mysite.com/literature - all literature posts
mysite.com/literature/fiction - all literature posts with 'fiction' term
mysite.com/literature/fiction/mybook - the post

每次尝试尝试时,都会出现404错误,或者无法进行分页。

我不明白为什么这么难!

任何帮助真的很感激!

谢谢

================================================== ==== ================== 附加信息 ==================

目前,我正在按以下方式注册帖子类型和分类:

register_post_type('literature',$args);
'rewrite' => array('slug' => 'literature/books','with_front' => false),

register_taxonomy('literature_category',array('literature'), array(
'rewrite' => array( 'slug' => 'literature','with_front' => false ),

如果我都注册为“文学”,则会在mysite.com/literature页面上获得404,但这将我的永久链接显示为: mysite.com/literature/books/mybook

遵循此问题的建议 - 自定义帖子类型,分类法和固定链接

我已将此添加到我的函数中:

function filter_post_type_link($link, $post) {
    if ($post->post_type != 'literature')
        return $link;

    if ($cats = get_the_terms($post->ID, 'literature_category'))
        $link = str_replace('%literature_category%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

并将我的帖子类型'slug' => 'literature/%literature_category%' 更改为并将我的分类法更改为'slug' => 'literature'

这很好用,但是mysite.com/literature分页不起作用,所以我在以下URL上收到404错误:

mysite.com/literature/page/2/


出于好奇,您到目前为止尝试了什么?
马修·博伊斯

这个答案让我最接近- wordpress.stackexchange.com/questions/5308/... -但是它没有与分页和建议的插件没有工作,要么工作
fxfuture

酷,很高兴我问,这为我节省了一些时间!
马修·博伊尼斯

Answers:


6

按照您已经做过的关于这个问题的建议,但是将其添加到您的代码中:

add_action( 'generate_rewrite_rules', 'fix_literature_category_pagination' );
function fix_literature_category_pagination( $wp_rewrite ) {
    unset($wp_rewrite->rules['literature/([^/]+)/page/?([0-9]{1,})/?$']);
    $wp_rewrite->rules = array(
        'literature/?$' => $wp_rewrite->index . '?post_type=literature',
        'literature/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=literature&paged=' . $wp_rewrite->preg_index( 1 ),
        'literature/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?literature_category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
    ) + $wp_rewrite->rules;
}

最后,转到设置>永久链接,然后点击保存。如果仍然无法使用,请再次保存您的永久链接。有时我觉得您必须保存两次,但是谁知道呢。无论如何,请让我知道您的成绩。请注意,适用计算机科学标准答案#1:它对我有用... ;-)

来自TMI的土地...

作为参考,其原因为何页面默认情况下不工作是WordPress的看跌期权在文学重写规则/%literature_category%/%本书%/%页%,这非常有意义,如果你考虑一下吧。因此,您的默认永久链接具有以下竞争规则:

[literature/([^/]+)/([^/]+)(/[0-9]+)?/?$] => index.php?literature_category=$matches[1]&book=$matches[2]&page=$matches[3]
[literature/([^/]+)/page/?([0-9]{1,})/?$] => index.php?literature_category=$matches[1]&paged=$matches[2]

我们在这里真正要做的就是通过取消设置后者的顺序来改变它们的顺序(我们可以保留它,但是此后的每次重写都会有一个正则表达式在页面加载时运行)并将其添加到数组的开头。

有趣的事实:如果您有一本名为“ page”的“ book”并且有多个页面,则此顺序将发生冲突,其后续页面将无法使用!


天哪,这只是我的语法错误。很有趣,它对我有用,当我修复它时,它不起作用。当我找出答案时,我会一直保持下去并更新我的答案...
Matthew Boynes'1

感谢您的帮助,马修。我尝试过,但不幸的是它没有用。我在问题中添加了更多信息,希望可以更好地解释它!
fxfuture 2012年

1
好的,对于造成混乱,我深表歉意。那里有一点脑气(最近一定要吃些脑豆)。我的答案已经更新,再次对我有用。记住要保存您的永久链接。
马修·博伊斯

1
哦,好的,我看到了您更新的问题。所以不是/ literature / fiction / page / 2不起作用,不是/ literature / page / 2不起作用,对吗?如果是这样,那么这很容易解决,我们将在同一水平上做同样的事情
Matthew Boynes 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.