WordPress

WordPressで投稿ページに紐づくなど指定した条件のタームを取得する方法

WordPressで、例えば「特定のタクソノミーに属する」「投稿ページに紐づく」などの指定条件でカスタムタクソノミーのタームを取得する様々な方法をご紹介します。

非常に似た名称の関数が多いので、頭がこんがらがります。なので、自分のためにも整理しました。全て覚える必要もなく、他の関数を用いても実現できるものも多いので、自分にあったものを見つけてそれを使う、という風に決めた方がよいかもしれません。

なお、この記事の中での記述の凡例です。

$taxonomy:例えばblog_catなどのタクソノミー名。
$taxonomies:上述のタクソノミー名を配列で複数指定できる場合

タクソノミーとタームとは?

タクソノミーは、通常の投稿でいうカテゴリーやタグのことで、そのような器自体を指します。タームは、タクソノミーの中の項目のことです。

詳しくは次の記事で解説しています。

カテゴリー、タグ、タクソノミー、タームの違いについてどこよりも分かりやすい解説を試みる

投稿ページに応じたタームの取得

get_the_terms

関数リファレンス/get the terms

<?php
$terms = get_the_terms( $post->ID, 'タクソノミー名' );
$terms = get_the_terms( $post->ID, array( 'タクソノミー名1', 'タクソノミー名2' ) );
?>

投稿ページ(single.php)において、その投稿に関連するタームを取得する関数として、get_the_termsがあります。
タクソノミー名は、例えばnews_catなどです。スラッグ名なので、タクソノミースラッグとも呼ばれます。
出力は次のように行います。[0]というのは配列の1つ目を取り出す記述です。当該ページ関連のものはWordPressの仕様として、配列の1つ目に格納されているということです。

<?php
//単体を出力
echo $terms&#91;0&#93; -> slug;
//複数を出力
foreach( $terms as $term ) {
   echo $term->slug;
}
?>

上記のタームを出力する$term[0]ですが、親タームがある場合はそちらを出力してしまいます。親タームを持つ可能性がある場合は次のようにすることで、子タームのみ出力することが可能です。

<?php
$children = get_term_children($term&#91;0&#93;->term_id, $taxonomy);
if( $children ):
   echo $term[1]->slug;
else:
   echo $term[0]->slug;
endif;
?>

wp_get_post_terms

関数リファレンス/wp get post terms

<?php
$terms = wp_get_post_terms( $post->ID, $taxonomy, $args );
?>

$argsは指定しなくても大丈夫ですが、それだとget_the_termsと変わりません。$argsを指定することで表示順を変えることができます。$args省略できるんだから、get_the_termsいる?という疑問があります。

wp_get_object_terms

関数リファレンス/wp get object terms

<?php
$terms = wp_get_object_terms( 
     array( 1, 2 ),  // ポストID
     array( 'news_cat', 'news_tag' ),  //タクソノミー名(スラッグ)を指定
     $args
);
?>

オブジェクト(投稿)のIDとタクソノミー名を指定し、そのタームを取得する関数です。

the_terms

関数リファレンス/the terms

<?php
the_terms( $post->ID, 'タクソノミー名', 'カテゴリー: ', ' / ' );
 // 出力結果 カテゴリー: SEO / UX / WordPress
?>

出力の文字列まで指定できる関数です。あまり使わなそうですね

アーカイブページ(archive.php/taxonomy.php)で取得

get_taxonomy

関数リファレンス/get taxonomy

<?php
get_taxonomy( $taxonomy );
?>

タクソノミーのメタデータが入ったオブジェクトが取得されます。
例えば、ターム名を表示したい場合は次のようにします。

<?php
$obj = get_taxonomy( $taxonomy );
echo esc_html( $obj->singular_label);
?>

single_term_title

関数リファレンス/single_term_title

<?php
single_term_title( $prefix, $display );
?>

$prefixには、タイトルの前に出力するテキストを指定します。何も出力しない場合は''とします。
$displayは、タイトルを表示する場合はtrue、PHP で使えるようにタイトルを返す場合はfalseとします。

その他の指定

get_terms

関数リファレンス/get terms

<?php
$taxonomies = array( 
    'blog_cat',
    'blog_tag',
);
$terms = get_terms( $taxonomies, $args );
?>

タクソノミーを配列で複数指定してターム一覧を取得できます。
1つだけ指定の場合は配列ではなくて大丈夫です。
$argsは省略可能で、省略しない場合は取得順や、項目が一つもないタームを取得するかどうか、などを指定できます。

例えば、項目が一つもない(中身が空の)タームを取得する場合は次のように書きます。

<?php
get_terms( $taxonomy, 'hide_empty=0' );
?>

または、次のように書いても中身が空のタームの取得がされます。

<?php
$args = array(
    'orderby' => 'id',
    'order' => 'ASC',
    'hide_empty' => false
);
get_terms( $taxonomy, $args );
?>

よく似た関数名に上記でご紹介済みのget_termget_the_termsがあります。

get_categories

関数リファレンス/get categories

<?php
$args = array(
   'orderby' => 'name',
   'order' => 'ASC',
   'taxonomy' => 'blog_cat'
);
$terms = get_categories($args);
foreach($terms as $term): ?>
   echo $term->name;
<?php endforeach; ?>
?>

こちらは結論、使う場面はないと思います。何故なら、配列の$argsで指定できる条件がget_termsより少ないためです。タクソノミーの指定も配列の中で行わなければいけません。

wp_list_categories

テンプレートタグ/wp list categories

<?php
wp_list_categories( $args );
?>

こちらは、ul, li, aの各要素付きで、各タームへのリンク付きリストをHTMLで出力してくれる関数です。クラス名も勝手に付与されます。カスタマイズ可能ですが、結局get_terms使った方が勝手が良いので、私は使ったことがありません。

例えば特定のタクソノミーのターム一覧を、項目の有無に関わらず取得する場合は次の記述になります。

<?php
wp_list_categories ( array(
   'taxonomy' => 'blog_cat',
   'hide_empty' => 'false'
));
?>

get_the_term_list

関数リファレンス/get the term list

<?php
get_the_term_list( $id, $taxonomy, $before, $sep, $after );
?>

指定された投稿IDとタクソノミーに対するタームのリストをul, li, aの各要素付きで、各タームへのリンク付きリストをHTMLで出力してくれる関数です。

wp_get_object_terms

関数リファレンス/wp get object terms

<?php
$terms = wp_get_object_terms( 
     array( 1, 2 ),  // ポストID
     array( 'news_cat', 'news_tag' ), 
     $args
);
?>

オブジェクト(投稿)のIDとタクソノミー名を指定し、そのタームを取得する関数です。

get_term_by

関数リファレンス/get term by

<?php
$term = get_term_by( $field , $value , $taxonomy ); 
?>

$fieldには、 ‘id’, ‘slug’, ‘name’, ‘term_taxonomy_id’のいずれかを指定できます。
$valueは、$fieldで指定した値です。例えばslugを指定したら、slugの名称が入ります。
以下は、news_catというタクソノミーの中でirというスラッグのついたタームを取得する例です。

<?php
$term = get_term_by( 'slug' , 'ir' , 'news_cat' ); 
?>

子タームを取得する場合について

子タームの取得には、上記で紹介済みのget_termsが利用できます。

get_terms

出力例:

<?php
$term_children = get_terms( $taxonomy, array(
   'child_of' => $term_id,
   'orderby' => 'none'
));
foreach( $term_children as $term_child ): ?>
   echo esc_html($term_child->name);
endforeach;

get_term_children

関数リファレンス/get term children

子タームの取得には、このget_term_childrenという関数が用意されてますが、これだと取得の順番の指定ができません。

また、こちらの関数を用いた場合は、get_term_byを用いなければタームの取得までできません。

現在表示中のページにおける子タームを取得する場合は、get_the_termsのところに記載していますので、そちらをご参照ください。

<?php
$term_childeren = get_terms_children( $term->term_id, $taxonomy );
foreach( $term_children as $child ):
$term_child = get_term_by( 'id', $child->term_id, $taxonomy );
   echo esc_html($term_child->name);
endforeach;

子タームのみ出力する

上記のget_terms_childrenを用いて次のようにして子タームのみ出力するということができます。

<?php
$check = get_term_children( $term->term_id, $taxonomy );
if ( empty($check) ):
   echo esc_html($term->name);
endif;

紛らわしい関数

次のget_termはタームを取得できそうな関数名ですが、タームを指定してそのタームの情報を取得できる関数ということで、紛らわしいので整理のため、ここに掲載しておきます。

get_term

関数リファレンス/get term

<?php
$term = get_term( 'ターム名', 'タクソノミー名' );
?>

ターム名とタクソノミー名を指定してそのタームの情報を取得します。

まとめ

WordPressでタームの一覧を取得する方法をご紹介しました。全て覚える必要はないので、自分にとって使い勝手の良いものを見つけるのが良いと思います。

著者のイメージ画像

株式会社BringFlower
稲田 高洋(Takahiro Inada)

2003年から大手総合電機メーカーでUXデザインプロセスの研究、実践。UXデザイン専門家の育成プログラム開発。SEOにおいても重要なW3Cが定めるWeb標準仕様策定にウェブアクセシビリティの専門家として関わる。2010~2018年に人間中心設計専門家を保有、数年間ウェブアクセシビリティ基盤委員も務める。その後、不動産会社向けにSaaSを提供する企業の事業開発部で複数サービスを企画、ローンチ。CMSを提供し1000以上のサイトを分析。顧客サポート、サイト運営にも関わる。
2022年3月にBringFlowerを開業し、SEOコンサル、デザイン、ウェブ制作を一手に受ける。グッドデザイン賞4件、ドイツユニバーサルデザイン賞2件、米国IDEA賞1件の受賞歴あり。