この記事では、カスタム投稿のターム名(カテゴリ名)を取得して表示させる方法について解説します。
カスタム投稿のターム名(カテゴリ名)を取得して表示させる場合、主に次の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つです。
- ループ内で使用
- 投稿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: 降順)
- hide_empty
上記オプションを両方指定すると、下記になります。
<?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;?>