WordPressで投稿タイプとタームを含めたURLにしたいときの設定方法

例えばレシピ(recipe)というカスタム投稿タイプにジャンル(genre)というカスタムタクソノミーがあり、そのタームが和食(japanese)のすき焼き(sukiyaki)という投稿があるとします。

そのURLが、以下のようになるようなパーマリンク設定の方法です。

レシピ一覧:/recipe/
ジャンル別一覧(和食の場合):/recipe/japanese/
レシピ詳細:/recipe/japanese/sukiyaki/

一般的な名称でいうなこちら
/post_type/
/post_type/term/
/post_type/term/postname/

必要なのはカスタム投稿タイプとカスタムタクソノミーの設定と、functions.phpへの記載追加です。

設定はCustom Post Type UIで例示しています。

▼カスタム投稿タイプの設定

アーカイブあり:true
アーカイブURLに使うスラッグ:recipe (投稿タイプスラッグと同じもの)カスタムリライトスラッグ:recipe/%genre% (投稿タイプスラッグ/%タクソノミーのスラッグ%)

▼カスタムタクソノミーの設定

カスタムリライトスラッグ:recipe (投稿タイプスラッグと同じもの)

▼functions.php

function my_add_rewrite_rules( $rules ) {
  $new = array();

  /* 複数の投稿タイプで設定が必要な場合は以下4行を複製して調整 */
  $new['recipe/page/?([0-9]{1,})/?$'] = 'index.php?post_type=recipe&paged=$matches[1]';
  $new['recipe/([^/]+)/page/?([0-9]{1,})/?$'] = 'index.php?genre=$matches[1]&paged=$matches[2]';
  $new['recipe/([^/]+)/(.+)/?$'] = 'index.php?recipe=$matches[2]';
  $new['recipe/([^/]+)/?$'] = 'index.php?genre=$matches[1]';

  return array_merge( $new, $rules ); // Ensure our rules come first
}
add_filter( 'rewrite_rules_array', 'my_add_rewrite_rules' );

function my_filter_post_type_link( $link, $post ) {
  /* 複数の投稿タイプで設定が必要な場合は以下4行を複製して調整 */
  if ( $post->post_type == 'recipe' ) {
    if ( $cats = get_the_terms( $post->ID, 'genre' ) ) {
      $link = str_replace( '%genre%', current( $cats )->slug, $link );
    }
  }

  return $link;
}
add_filter( 'post_type_link', 'my_filter_post_type_link', 10, 2 );

テンプレートはarchive-recipe.phpやsingle-recipe.php、taxonomy-genre.phpが適用されるはずです。

バージョン等の違いでうまく動作しない可能性もありますのでご了承ください。

いいなと思ったら応援しよう!