カスタム投稿のターム(カテゴリ)を取得して表示する方法

WordPress
記事内に商品プロモーションを含む場合があります。

この記事では、カスタム投稿のターム名(カテゴリ名)を取得して表示させる方法について解説します。

カスタム投稿のターム名(カテゴリ名)を取得して表示させる場合、主に次の2つのパターンがあると思います。

  1. 投稿に紐付いたターム名を取得
  2. すべてのターム名を取得

この記事では上記2パターンを、それぞれ具体例を交えながら解説しています。

ご自身の知りたい方だけ読んでいただいても大丈夫ですし、もちろん詳しく知りたい方は最初から目を通してもらってもOKです。

またコードはコピペしやすいようなるべく簡素に書いていますので、ご自由にお使いください。

なお今回の具体例では、下記の前提条件を用いて解説を進めていきます。

前提条件

  • 使用プラグイン
    :Custom Poso Type UI(CPT UI)
  • カスタム投稿タイプ
    :メニュー(menu)
  • タクソノミー
    :料理のジャンル(genre)
  • ターム(カテゴリー)
    :イタリア料理(italian)
    :インド料理(indian)
    :フランス料理(french)
    :中華料理(chinese)
    :日本料理(japanese)
    :韓国料理(korean)
スポンサーリンク

カスタム投稿の個別投稿に紐付いたターム名(カテゴリ名)を取得して表示する

まずは投稿に紐付いたターム名(カテゴリ名)を取得・表示する方法から解説します。

具体例

実務では「カード型コンポーネント」が頻出パターンですね。

ターム名(カテゴリ名)はオレンジ色の部分で、「その投稿がどのカテゴリー(ターム)に属しているか」を表しています。

タイトルや画像の左上に配置されることが多いと思います。

使用するWordPress関数

get_the_termsを使います。

get_the_terms: 投稿に紐付くタームを取得する

コード解説

<div class="cards">
  <?php
       $menu_query = new WP_Query(
         array(
           'post_type' => 'menu',
           'posts_per_page' => 3,
           )
          );
          ?>
    <?php if($menu_query->have_posts()):?>
      <?php while($menu_query->have_posts()):?>
        <?php $menu_query->the_post();?>
        <div class="card">
          <div class="card__image">
            <?php the_post_thumbnail();?>
          </div>
          <div class="card__genre">
            <?php echo get_the_terms(get_the_ID(), 'genre')[0]->name;?> //←これ
          </div>
          <div class="card__title">
            <?php the_title() ;?>
          </div>
          <div class="card__description">
            <?php the_content() ;?>
          </div>
        </div>
       <?php endwhile;?>
    <?php endif;?>
    <?php wp_reset_postdata();?>
</div>

ターム(カテゴリ)名を取得・表示しているのが18行目です。

get_the_terms投稿に紐付くターム情報を取得し、echoで表示しています。

なお表示させたいのは「タームの名前」なので、末尾に[0]->nameと書けばOKです([0]は書かないとエラーになります)。

ポイントは2つです。

  1. ループ内で使用
  2. 投稿idとタクソノミー名を引数に書く

まず投稿に紐付く情報が欲しいので、get_the_termsはループ内に書きましょう。

またget_the_termsの引数には「投稿ID」と「タクソノミー名」を書く必要があります。

get_the_terms(投稿ID, タクソノミー名)

投稿IDはget_the_IDで取得可能で、タクソノミー名は「genre」なので、以下の書き方になります。

<?php echo get_the_terms(get_the_ID(), 'genre')[0]->name;?>
スポンサーリンク

カスタム投稿のすべてのターム名を取得

2つめが「すべてのターム名(カテゴリ名)を取得・表示する」パターンです。

具体例

例えばメニュー一覧ページがあって、「クリックすると該当のジャンルに絞って表示される」みたいな使い方が多いかと思います。

またはリンクになっていて「該当のジャンルのページにジャンプする」のようなパターンもあります。

ページやセクションの先頭に置かれるケースが多いかと思います。

使用するWordPress関数

get_termsを使用します。

get_terms: タクソノミーに紐付いたタームを取得する

先ほどのget_the_termsは「投稿」に紐付いたタームを取得しますが、get_termsは「タクソノミー」に紐付いたタームを取得するWordPress関数です。

コード解説

<div class="genres">
  <?php
    $terms = get_terms('genre',  //←これ
      array(
      'hide_empty' => false,
      'order' => 'DESC'
      )
    );
  ?>

  <?php foreach($terms as $term):?>
      <div class="genre">
        <?php echo $term->name;?>
      </div>
  <?php endforeach;?>
</div>

タームを取得しているのが3行目以降ですね。

get_termsで取得した情報を、あとで使いやすいように$termsという変数に格納しました。

get_termsは次の書き方をします。

get_terms('タクソノミー名', array(オプション))

タクソノミー名は必須です。

あとget_termsはタームを取得するための「オプション」をいろいろ書くことができまして、もしオプションを追加したい場合はarrayの中に書きます(書かなくてもOK)。

オプションはたくさんあるのですが、よく使うのは次の2つかなと思います。

get_termsでよく使う「オプション」(※印はデフォルトです)

  • hide_empty
    :投稿がないタームも表示するか?(true: 表示しない※ / false: 表示する)
  • order
    :並び順(ASC: 昇順※ / DESC: 降順)

上記オプションを両方指定すると、下記になります。

<?php
   $terms = get_terms('genre',
    array(
     'hide_empty' => false,
     'order' => 'DESC'
    )
  );
?>

これでタクソノミー「料理ジャンル(genre)」のタームはすべて取得できたので、あとは表示させるだけです。

取得したタームを全て表示させるにはforeach文を使うと便利です。

<?php foreach($terms as $term):?>
    <div class="genre">
      <?php echo $term->name;?>
    </div>
<?php endforeach;?>

あとは$term(単数形)の末尾に->nameを付けてechoすれば、すべてのターム名(カテゴリ名)を表示させることができます。

もしターム名の部分をリンクにして該当するターム(カテゴリ)のページに飛ばしたい場合は、下記の書き方をすればOKです。

<?php foreach($terms as $term):?>
    <div class="genre">
       <a href="<?php echo get_term_link($term, 'genre');?>"><?php echo $term->name;?></a>
    </div>
<?php endforeach;?>