🚀

【wordpress】ループ内でいろんな投稿タイプのカテゴリー、タームの表示したい

2022/06/07に公開

概要

なんだかんだで、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_typepostだった場合、「通常の投稿」となるので、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って使えると思った。

参考サイト

https://teratail.com/questions/89090
https://www.imamura.biz/blog/function_reference/get_post_type
https://wpdocs.osdn.jp/関数リファレンス/get_the_terms
https://wpdocs.osdn.jp/関数リファレンス/get_post_type#.E8.AA.AC.E6.98.8E

Discussion