问题描述

我无法使用 WordPress 重写规则,并可以使用一些帮助。

我有一个名为_shows_的自定义帖子类型。

所有节目都有一个自定义分类类别_show-category_. A _show_将永远不会有多个_show-category_

我希望我的 URL 以这种方式路由:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

所以作为一个现实世界的例子,让我们说一个_show-category_ “Foo” 和一个_show_的标题为”Bar” 的帖子,它具有”Foo”,因为它是_show-category_。我会期望我的 WordPress 应用程序看起来像这样:

www.mysite.com/shows/foo/ => shows all posts under the foo category
www.mysite.com/shows/foo/bar => shows the indivual post

我尽可能避免插件,但是对任何解决方案都是开放的。

最佳解决方案

首先,register your taxonomyrewriteslug 参数设置为 shows

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

接下来,将 register your post type 设置为 shows/%show_category%,并将 has_archive 参数设置为 shows

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

最后,在 post_type_link 中添加一个过滤器来替换个人展示永久链接中的节目类别:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

编辑

忘了 has_archiveregister_post_type 参数,应该设置为 shows

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。