カスタム投稿タイプ ターム毎の一覧ページを作る

wordpressのカスタム投稿タイプ、便利ですよね。
オリジナルの投稿タイプを作成する事によって
通常の投稿(ブログ)とは別で且つ個別ページではなく
投稿する感じで簡単にページを増やす事ができたり。

カスタム投稿タイプの導入方法や個別ページへの表示方法
及び一覧ページ(アーカイブページ)への表示方法は沢山の素晴らしいサイトが
とても分かり易くご教示くださっているのでここでは省きます。

でですね。
今回私がやりたかった事は
カスタム投稿タイプのアーカイブ及び個別ページにパンくずを付けたんですよ。
でね、パンくずって事は

HOME > カスタム投稿タイプアーカイブページ > ターム > 個別ページタイトル

多少違いがあれどこんな感じになりますよね?

で、『カスタム投稿タイプアーカイブページ』と『個別ページタイトルのページ』はいいんですよ。

多くのサイトがそう言っている様に
archive-カスタム投稿名.php
single-カスタム投稿名.php
を作成している状態ならそこをリンク先として貼ればOK。

で、問題は『ターム』をクリックした時。

例えばカスタム投稿タイプがアーティスト
タクソノミーを音楽の種類
タームにROCK・POPSと作成
The BeatlesというアーティストをROCKのタームに指定して作成したとします。

とすると

HOME > 音楽 > ROCK > The Beatles

となる訳ですね。

で、パンくずの『ROCK』をクリックしたら
『ROCK』というタームを指定したアーティストの一覧が出て欲しい!ですよね?

私の理解力が低いのか検索能力が低いのか
これに相当する記述を教えてくださるサイトが見付からなく・・・。

指定したターム用テンプレートなどの書き方は
多くのサイトでお見かけしたのですが
ターム毎にテンプレートを作ってたらファイル量がどんどこ増えるし
何より新しくタームを作成したら一々それ用のテンプレートも作成なきゃならないなんて
そんな面倒な事やってられません!

参考サイトを色々と巡って組み合わせてなんとか実装できましたので
自分用にメモ。


今回の例として

カスタム投稿タイプを音楽(music)
タクソノミーを音楽の種類(music_type)
タームにROCK・POPS(スラッグをそれぞれrock・pops)

まずは上記にもある様に
archive-カスタム投稿名.php
single-カスタム投稿名.php
は作成しておきます。

例で言うと
archive-music.php
single-music.php
ですね。

archive-music.phpには
カスタム投稿タイプ「音楽」に投稿した記事一覧が表示され
single-music.phpには
カスタム投稿タイプ「音楽」に投稿した記事そのものが表示されます。
今回の例で言うと「The Beatles」の個別ページです。

タームの一覧ページ(タクソノミーページ)を作成する

タームの一覧ページ(タクソノミーページ)の適用テンプレートの優先順位は
以下の様になります。

  1. taxonomy-タクソノミー名-ターム.php
  2. taxonomy-タクソノミー名.php
  3. taxonomy.php
  4. archive.php
  5. index.php

taxonomy-タクソノミー名-ターム.phpを作成すれば
そのターム専用のアーカイブページを作成する事ができます。

そして今回の目的、タクソノミーページ用に
taxonomy-タクソノミー名.php
を作成します。

タクソノミー名を当てはめるので
taxonomy-music_type.php
となります。

そしてtaxonomy-music_type.phpに記述する内容ですが
archive-music.phpと似た作りではいいのですが
ループの内容を同じにしてしますとタームで分けられた内容にはなりません。(当然ですね

そこで
ループの開始箇所を下記の様にしました。

PHP

<?php
            $変数 = get_query_var( 'タクソノミー名' ); //指定したいタクソノミーを指定
            $args = array(
                'post_type' => array('カスタム投稿タイプ'), 
                'tax_query' => array(
                    'relation' => 'OR',
                    array(
                        'taxonomy' => 'タクソノミー名',
                        'field' => 'slug',
                        'terms' => $変数, /* 上記で指定した変数を指定 */
                    ),
                ),
                'paged' => $paged,
                'posts_per_page' => '数字' /* 1ページに表示させたい件数 */
            ); ?>
            <?php query_posts( $args ); ?>
            <?php if (have_posts()) : ?>
            <?php while (have_posts()) : the_post(); /* ループ開始 */ ?>

            コンテンツ

            <?php endwhile; else: ?>
           <p><?php echo "お探しの記事、ページは見つかりませんでした。"; ?></p>
            <?php endif; ?>

例で置き換えるとこんな感じです。
PHP

<?php
            $type = get_query_var( 'music_type' ); //指定したいタクソノミーを指定
            $args = array(
                'post_type' => array('music'), /* 投稿タイプを指定 */
                'tax_query' => array(
                    'relation' => 'OR',
                    array(
                        'taxonomy' => 'music_type', /* 指定したい投稿タイプが持つタクソノミーを指定 */
                        'field' => 'slug',
                        'terms' => $type, /* 上記で指定した変数を指定 */
                    ),
                ),
                'paged' => $paged,
                'posts_per_page' => '5' /* 5件を取得 */
            ); ?>
            <?php query_posts( $args ); ?>
            <?php if (have_posts()) : ?>
            <?php while (have_posts()) : the_post(); /* ループ開始 */ ?>

            コンテンツ

            <?php endwhile; else: ?>
            <p><?php echo "お探しの記事、ページは見つかりませんでした。"; ?></p>
            <?php endif; ?>

後は通常のループと同じ様にコンテンツの箇所に

<?php the_title(); ?>

<?php the_post_thumbnail(); ?>

など必要なものを書いていけばOK。

これで「ROCK」をクリックしたら
「ROCK」に分類されている記事が一覧表示された!


いや〜苦労した!
私の能力不足が招いた事だと分かってはいますが
これ!って情報を探し出す事ができないし分かんないしで
危うく逃げ出すとこだったわ←

でも自分の思い通りに表示された時の爽快感ったらないよね!



参考サイト

複数のカテゴリ(ターム)に属する投稿を抽出してアーカイブに表示する方法 | ふくどん
カスタム投稿タイプとカスタムタクソノミーまとめ
条件分岐タグ - WordPress Codex 日本語版
[WordPress]カスタムタクソノミーで分類した特定のタームに所属するカスタム投稿記事を取得し表示する – WordPressサイト制作 / システム開発 / UIデザイン ハイファイブクリエイト