WordPress
WordPressで投稿ページに紐づくなど指定した条件のタームを取得する方法
WordPressで、例えば「特定のタクソノミーに属する」「投稿ページに紐づく」などの指定条件でカスタムタクソノミーのタームを取得する様々な方法をご紹介します。
非常に似た名称の関数が多いので、頭がこんがらがります。なので、自分のためにも整理しました。全て覚える必要もなく、他の関数を用いても実現できるものも多いので、自分にあったものを見つけてそれを使う、という風に決めた方がよいかもしれません。
なお、この記事の中での記述の凡例です。
$taxonomy
:例えばblog_catなどのタクソノミー名。$taxonomies
:上述のタクソノミー名を配列で複数指定できる場合
タクソノミーとタームとは?
タクソノミーは、通常の投稿でいうカテゴリーやタグのことで、そのような器自体を指します。タームは、タクソノミーの中の項目のことです。
詳しくは次の記事で解説しています。
カテゴリー、タグ、タクソノミー、タームの違いについてどこよりも分かりやすい解説を試みる
投稿ページに応じたタームの取得
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[0] -> slug;
//複数を出力
foreach( $terms as $term ) {
echo $term->slug;
}
?>
上記のタームを出力する$term[0]
ですが、親タームがある場合はそちらを出力してしまいます。親タームを持つ可能性がある場合は次のようにすることで、子タームのみ出力することが可能です。
<?php
$children = get_term_children($term[0]->term_id, $taxonomy);
if( $children ):
echo $term[1]->slug;
else:
echo $term[0]->slug;
endif;
?>
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
<?php
$terms = wp_get_object_terms(
array( 1, 2 ), // ポストID
array( 'news_cat', 'news_tag' ), //タクソノミー名(スラッグ)を指定
$args
);
?>
オブジェクト(投稿)のIDとタクソノミー名を指定し、そのタームを取得する関数です。
the_terms
<?php
the_terms( $post->ID, 'タクソノミー名', 'カテゴリー: ', ' / ' );
// 出力結果 カテゴリー: SEO / UX / WordPress
?>
出力の文字列まで指定できる関数です。あまり使わなそうですね
アーカイブページ(archive.php/taxonomy.php)で取得
get_taxonomy
<?php
get_taxonomy( $taxonomy );
?>
タクソノミーのメタデータが入ったオブジェクトが取得されます。
例えば、ターム名を表示したい場合は次のようにします。
<?php
$obj = get_taxonomy( $taxonomy );
echo esc_html( $obj->singular_label);
?>
single_term_title
<?php
single_term_title( $prefix, $display );
?>
$prefix
には、タイトルの前に出力するテキストを指定します。何も出力しない場合は''
とします。$display
は、タイトルを表示する場合はtrue
、PHP で使えるようにタイトルを返す場合はfalse
とします。
その他の指定
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_term
とget_the_terms
があります。
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
<?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
<?php
get_the_term_list( $id, $taxonomy, $before, $sep, $after );
?>
指定された投稿IDとタクソノミーに対するタームのリストをul
, li
, a
の各要素付きで、各タームへのリンク付きリストをHTMLで出力してくれる関数です。
wp_get_object_terms
<?php
$terms = wp_get_object_terms(
array( 1, 2 ), // ポストID
array( 'news_cat', 'news_tag' ),
$args
);
?>
オブジェクト(投稿)のIDとタクソノミー名を指定し、そのタームを取得する関数です。
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_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
<?php
$term = get_term( 'ターム名', 'タクソノミー名' );
?>
ターム名とタクソノミー名を指定してそのタームの情報を取得します。
まとめ
WordPressでタームの一覧を取得する方法をご紹介しました。全て覚える必要はないので、自分にとって使い勝手の良いものを見つけるのが良いと思います。