🚀
【wordpress】ループ内でいろんな投稿タイプのカテゴリー、タームの表示したい
概要
なんだかんだで、Wordpressの案件が多い。
ふと検索結果に記事の一覧を表示させる時に通常の投稿とカスタム投稿タイプの投稿のデータを取り出して、所属してるカテゴリーなりタームを出力しようとする際に、どうするのか?
という事を調べていて記事を見つけたので忘備録として残す。
最終目的
今回の最終目標は以下とする。
またカスタム投稿タイプを「itemlist」とし、タクソノミーを「itemlist_terms」とする。
- 通常の記事とカスタム投稿タイプの記事の混在した一覧を表示させる際にカテゴリー・タームを出力させる
get_the_termsを使う
ループ内で使用するのでコード全体は以下となる。
<?php
if (have_posts()) : while (have_posts()) : the_post();
$terms = get_the_terms(get_the_ID(),(get_post_type()=='post' ? 'category' : 'itemlist_terms'));
?>
<p><?php echo $terms[0]->name; ?></p>
<?php
endwhile;
wp_reset_postdata();
endif;
?>
ポイント
get_the_terms
の引数は第1引数が投稿IDで第2引数がタームを取得するタクソノミーの名前となるが、第2引数でget_post_type
を使うのがポイント。
$terms = get_the_terms(get_the_ID(),(get_post_type()=='post' ? 'category' : 'itemlist_terms'));
通常の投稿で所属してるカテゴリーを取得する場合はget_the_category
を使うのだが、実はget_the_terms
の第2引数にcategory
を指定すると通常の投稿のカテゴリーが取得できる。
そこでget_post_type
でpost
だった場合、「通常の投稿」となるので、category
を指定する。そうでない場合はカスタム投稿タイプのタクソノミーである「itemlist」を指定すれば、その情報が取得できる。
今回はあくまで「通常の投稿」とカスタム投稿タイプ(itemlist)と2つだけだが、複数の場合はif文などで分けて処理してもいいかと。
//現在表示している投稿の投稿タイプ名が「product」かどうかで条件分岐
if(get_post_type( get_the_ID() ) == 'product'){
//「product」の時の処理
} elseif( get_post_type( get_the_ID() ) == 'food') {
//「food」の時の処理
}else{
//通常の投稿や固定ページなど、その他。
}
まとめ
wordpressって似たような関数が多いので困る。
確か、get_the_category
の内部的にget_the_terms
を使っていたような気がする。
また今更ながらget_post_type
って使えると思った。
参考サイト
Discussion