web-dev-qa-db-ja.com

パラレル:カスタム投稿の種類 - >カスタム分類法 - >投稿

私はWordPressの書き換え規則の処理に問題があり、助けを借りることができます。

_shows_というカスタム投稿タイプがあります。

すべての shows には、単一のカスタム分類カテゴリがあります_show-category_._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_として "Foo"を含む "Bar"という_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

可能な限り私はプラグインを避けようとしますが、どんな解決策にも自由です。

38
Paul T

まず、 分類法を登録して そしてslugrewrite引数をshowsに設定します。

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

次に、 投稿タイプを登録します そして、スラッグを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に設定する必要があります。

65
Milo