问题描述
我无法使用 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 taxonomy 将 rewrite
的 slug
参数设置为 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_archive
的 register_post_type
参数,应该设置为 shows
。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。