今回の記事ですが、WordPressで投稿をループした時などに、
記事の属する、2パターンのカスタムタクソノミーを出力してリンクも貼るといった内容です。

まず、記事の属するタクソノミー出力で一番(?)一般的な例。

ID,'タクソノミ名');   foreach($terms as $term1) :   echo $term1->name;  if ($term1 !== end($terms)) {    echo ', ';  }  endforeach;  ?>

投稿記事のタクソノミー情報を取得するget_the_termsの引数に、ループ中の投稿記事のIDをpost->IDで取得して指定し、
‘タクソノミ名’にあたるところに「出力したいタクソノミ名」を指定して一覧で出力します。
get_the_terms:WordPress私的マニュアル

その後のifは、出力中のタクソノミ情報が、最後でない場合は「,」で区切る、という条件分岐でしょうか。

別にこれでも大いに正解なのですが、今回は仮に以下の条件下だとします。

  • カスタム投稿タイプを2種類作成している
  • その両方に任意のクラスを指定して出力する
  • アーカイブページへのリンクも欲しい

カスタム投稿タイプ、カスタムタクソノミの定義

カスタム投稿タイプとタクソノミーを定義します。

function make_tax_n_cat() {    $ArrCarrs = array(//トレーニング動画のタクソノミ1  'labels' => array(  	'name' => 'カリキュラム別(1st~3rd)' ,  	'singular_name' => 'カリキュラム別' ,  	'all_items' => 'すべて見る' ,  	'add_new_item' => 'カリキュラム分類を追加'  ,  	'edit_item' => 'カリキュラムを編集' ,  	'search_item' => '探す' ,  	'parent_item' => 'トレーニング動画' ,  	'not_found' => 'ありません'  ) ,  'public' => true ,  'hierarchical' => true ,  );  register_taxonomy('curriculum' , 'trainingmovie' , $ArrCarrs);    $ArrSteps = array(//トレーニング動画のタクソノミ2  	'labels' => array(  	'name' => 'メニュー別' ,  	'singular_name' => 'メニュー別' ,  	'all_items' => 'すべて見る' ,  	'add_new_item' => 'メニュー分類を追加' ,  	'edit_item' => 'メニュー分類を編集' ,  	'search_item' => '探す' ,  	'parent_item' => 'トレーニング動画' ,  	'not_found' => 'ありません'  	),  'public' => true ,  'hierarchical' => true ,    );  register_taxonomy('menus' , 'trainingmovie' , $ArrSteps);    $ArrMovies = array(  	'labels' => array(    	'name' => 'トレーニング動画' ,  	'singular_name' => 'トレーニング動画' ,  	'add_new_item' => '動画を追加' ,  	'add_new' => '新しい動画を追加' ,  	'edit_item' => '動画Pを編集' ,  	'search_item' => '動画を探す' ,  	'view_item' => '動画を表示' ,  	'not_found' => '動画はみつかりませんでしとぅあ' ,  	'not_found_in_trash' => '動画はゴミ箱にはありませんが汚れた靴下があります' ,  	) ,  'description' => 'このページから動画を投稿して下さい' ,  'has_archive' => true ,  'public' => true ,  'supports' => array('title' , 'editor' , 'revision' , 'page-attributes' , 'thumbnail' , 'comments' , 'custom-fields') ,  'can_export' => true ,  'query_var' => true ,  'menu_position' =>5  );  register_post_type('trainingmovie' , $ArrMovies);    }    add_action('init' , make_tax_n_cat());

カスタム投稿タイプ「トレーニング動画」(trainingmovie)に、カスタムタクソノミ「メニュー別」(menus)と、「カリキュラム別」(curriculum)が紐付けられている状態です。

「トレーニング動画」(trainingmovie)をquery_postsとかWP_Queryとかでループするとして(カスタム投稿のループについては割愛。)、1記事あたりが属するカスタムタクソノミ「メニュー別」(menus)と、「カリキュラム別」(curriculum)を、クラスとリンク付きで出力します。
理想の出力結果は以下の様な感じになります。

今回は、同時に2つのタクソノミを出力したいということで、「タクソノミを出力するループ」を2つ同時に扱います。
2つ同時にループさせる場合は、foreachではなく、whileで出力します。

while((list( , $termCurri) = each($termCurriculums)) &&  (list(, $termMenu) = each($termMenus))) {

【PHP】2つ以上の変数、配列、クラスでforeach: ないなら作ればいい。

なんだか難しくてよく解りませんが、下記のような解釈でそのまま覚えることにします。

while((list( , $配列1が吐き出す個別の値) = each($配列1)) &&  ((list( , $配列2が吐き出す個別の値) = each($配列2))    

タクソノミ名を出力する

そのあとの{}から「タクソノミを出力するループ」に入ります。
任意のクラスを指定したHTML要素で囲み、get_the_termsでそれぞれのタクソノミの情報を格納した配列の値($termCurri , $termMenu)から、まずはタクソノミ名を取得します。
これが記事の所属するタクソノミ名になります。

 echo '
  • ' . $termCurri->name . '
  • '; echo '';

    get_the_termsで指定したタクソノミ名だけなら、ループ中でこの記述だけでOK!

    タクソノミのアーカイブページへのリンクも取得してみる

    次に、アーカイブページへのリンクも出力して回遊性を高めます。
    上記のコードに、

     echo '
  • ' . $termCurri->name . '
  • '; echo '';

    get_the_termsで取得したタクソノミ情報を利用して、メンバ変数のterm_id(タクソノミのID)を呼び出します。
    それを使い、get_term_linkで、リンクの文字列を取得します。ここで出力したリンクがアーカイブページヘのリンクです。
    get_term_link:WordPress私的マニュアル

    書いてあるとおりなのですが、タクソノミ名などの指定を誤ると、WP Errorが出てエラー箇所以降が真っ白になるので、注意しましょう。とても焦ります。

    以上を踏まえて、全部書くとこんな感じです

    独特なwhileの使い方がポイントです!

    TOPページや記事一覧ページで、タクソノミを色分けしたい場合なんかに使えるのではないでしょうか?

    でわ!

    投稿者 satohmsys