WordPressで指定したタクソノミーに含まれるタームを取得できるget_terms()を使ってみます。
タクソノミーが存在しない場合
今回は例として、genreというタクソノミーを作成して、それに含まれるタームを取得するようにしてみます。
genreを作成する前に取得しようとした場合、指定したタクソノミーは存在しないのでWP_Errorを返すようになっています。
PHP
<?php $terms = get_terms( 'genre' ); var_dump($terms); ?>
以下のような内容が出力されました。
HTML
object(WP_Error)#277 (2) { ["errors"]=> array(1) { ["invalid_taxonomy"]=> array(1) { [0]=> string(42) "不正なタクソノミー分類です。" } } ["error_data"]=> array(0) { } }
基本的にはタクソノミーが存在しない場合というのは無いと思いますが、以下のように取得内容をチェックしてから出力処理に進むようにするとよさそうです。
<?php $terms = get_terms( 'genre' ); // 取得した内容が空でない、またはWP_Errorでない場合のみ処理を行う if( !empty( $terms ) && !is_wp_error( $terms ) ) { var_dump($terms); } ?>
パラメータを設定しない場合
では実際にgenreというタクソノミーを作成して、get_terms()を使ってみます。
今回は以下のようなタームを設定しました。
- ジャンルA(ID:7, slug:genrea) 投稿数: 2件
- ジャンルA-1(ID:10, slug:genrea-1) 投稿数: 1件
- ジャンルB(ID:8, slug:genreb) 投稿数: 1件
- ジャンルB-1(ID:11, slug:genreb-1) 投稿数: 0
- ジャンルC(ID:9, slug:genrec) 投稿数: 0件
- ジャンルD(ID:12, slug:genred) 投稿数: 0件
- ジャンルD-1(ID:14, slug:genred-1): 投稿数1件
実際に指定をしてみます。
PHP
<?php $terms = get_terms( 'genre' ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li> ターム名: <?php echo $term->name; ?> スラッグ: <?php echo $term->slug; ?> ID: <?php echo $term->term_id; ?> 投稿数: <?php echo $term->count; ?> 親カテゴリーID: <?php echo $term->parent; ?> </li> <?php endforeach; ?> </ul> <?php endif; ?>
以下のように出力されました。(改行位置など調整しています。)
HTML
<ul> <li> ターム名: ジャンルA スラッグ: genrea ID: 7 投稿数: 2 親カテゴリーID: 0 </li> <li> ターム名: ジャンルA-1 スラッグ: genrea-1 ID: 10 投稿数: 1 親カテゴリーID: 7 </li> <li> ターム名: ジャンルB スラッグ: genreb ID: 8 投稿数: 1 親カテゴリーID: 0 </li> <li> ターム名: ジャンルD スラッグ: genred ID: 12 投稿数: 0 親カテゴリーID: 0 </li> <li> ターム名: ジャンルD-1 スラッグ: genred-1 ID: 14 投稿数: 1 親カテゴリーID: 12 </li> </ul>
設定できるパラメータ
get_terms( $taxonomies, $args ) | $taxonomiesで指定したタクソノミーを、$argsで指定した内容に基づいて取得する。 $taxonomiesは文字列または配列形式で指定できて、複数のタクソノミーも指定できる。 $argsは配列形式もしくはクエリ文字列形式で指定できる。 |
---|
$argsで指定できる引数は以下になります。
orderby | 並び替えの基準になるフィールドを指定。 設定できる値はid,count,name,slug,term_group,noneで、初期値はname。 |
---|---|
order | 並べ替えの昇順・降順を指定。 設定できる値はASC,DESCで、初期値はASC。 |
hide_empty | 記事のないタームを排除するかどうかを指定。 初期値はtrue。 |
exclude | 指定した一つまたは複数のタームを除外する。 配列またはコンマ区切りの文字列で指定で、初期値はarray()。 |
exclude_tree | 指定した一つまたは複数の親タームとその子孫タームを除外する。 初期値は。array() |
include | 指定したタームのみを含めるようにする。 初期値はarray()。 |
number | 取得するターム数の上限を指定。 初期値は”。 |
fields | 取得するフィールドの指定。 all: タームオブジェクトの配列を返す。初期値。 ids: タームIDの配列を返す。 names: ターム名の配列を返す。 count: 見つかったタームの個数を返す。(バージョン 3.2 以上) id=>parent: 連想配列を返す。キーはタームID、値は親タームのID(親がない場合は0) id=>slug: 連想配列を返す。キーはタームID、値はスラッグ id=>name: 連想配列を返す。キーはタームID、値はターム名 |
slug | 指定したスラッグに一致するタームを取得。 初期値は”。 |
parent | 指定したタームIDの直接の子タームのみを取得。 子孫すべてのタームを取得する場合はchild_ofを使用。 初期値は”。 |
hierarchical | 子タームを持つタームを含めるかどうか。 初期値はtrue。 |
child_of | 指定したタームの子孫をすべて取得。 子タームのみを取得する場合はparentを使用。 初期値は0。 |
childless | タクソノミーが階層ありの場合に、子タームを持たないタームのみを取得。 階層なしの場合はすべてのタームが対象。 バージョン4.2からの追加で、初期値はfalse。 |
get | 値にallを指定すると、hide_emptyとchild_ofを無効にする。 初期値は”。 |
name__like | ターム名にマッチさせたい文字列を指定。 バージョン3.7からの追加で、初期値は”。 |
description__like | タームの説明文にマッチさせたい文字列を指定。 初期値は”。 |
pad_counts | 子孫タームを含めて、リンクまたは投稿の数を計算するかどうか。 初期値はfalse。 |
offset | 見つかったタームの先頭から指定した値までを飛ばして取得する。 numberと合わせて使用する必要がある。 初期値は”。 |
search | ターム名またはスラッグにマッチさせたい文字列を指定。 初期値は”。 |
cache_domain | get_terms()が作成したクエリにユニークなキャッシュ用キーを付与する。 バージョン3.2からの追加で、初期値はcore。 |
実際にget_terms()にパラメータを設定してみます。
PHP
<?php $arr = array( 'child_of' => 7, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
タームIDが7のジャンルAの子孫要素に当たるジャンルA-1が取得できました。
HTML
<ul> <li>ジャンルA-1</li> </ul>
投稿のないタームも取得する
投稿のないカテゴリタームも取得したい場合、hide_empty:0を指定します。
PHP
<?php $arr = array( 'hide_empty' => 0, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
genreに含まれる全てのタームが取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルA-1</li> <li>ジャンルB</li> <li>ジャンルB-1</li> <li>ジャンルC</li> <li>ジャンルD</li> <li>ジャンルD-1</li> </ul>
並び順を変更する
並び順の基準になるフィールドを指定したい場合はorderbyを、昇順・降順を指定したい場合はorderを使用します。
PHP
<?php $arr = array( 'orderby' => 'count', 'order' => 'DESC', ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
記事の投稿数を基準にして、降順の並びになりました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルB</li> <li>ジャンルA-1</li> <li>ジャンルD-1</li> <li>ジャンルD</li> </ul>
最上位のタームのみ取得する
最上位のタームのみ取得する場合、parent:0を指定します。
PHP
<?php $arr = array( 'parent' => 0, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
最上位のタームのみを取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルB</li> <li>ジャンルD</li> </ul>
子タームを持たないタームのみ取得する
子タームを持たないタームのみ取得したい場合、childlessをtrueに設定します。
PHP
<?php $arr = array( 'childless' => true, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
子タームを持たないジャンルA-1とジャンルD-1のみ取得できました。
HTML
<ul> <li>ジャンルA-1</li> <li>ジャンルD-1</li> </ul>
タームIDを指定して取得・除外する
指定したタームIDのみの取得や除外をすることができます。
取得する場合はincludeを使用します。
PHP
<?php $arr = array( 'include' => array(7, 12), ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
タームIDが7,12のジャンルAとジャンルDのみ取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルD</li> </ul>
slugを使うと、タームIDではなくスラッグ名で指定することもできます。
PHP
<?php $arr = array( 'slug' => array('genrea', 'genred'), ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
先ほどと同様に、ジャンルAとジャンルDのみ取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルD</li> </ul>
除外したい場合はexcludeやexclude_treeを使用します。
excludeは指定したタームを除外します。
PHP
<?php $arr = array( 'exclude' => array(7, 12), ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
ジャンルAとジャンルDを除外して取得しました。
HTML
<ul> <li>ジャンルA-1</li> <li>ジャンルB</li> <li>ジャンルD-1</li> </ul>
exclude_treeは指定したタームとその子孫タームを除外します。
PHP
<?php $arr = array( 'exclude_tree' => array(7, 12), ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
ジャンルAとジャンルDと、その子孫タームに当たるジャンルA-1とジャンルD-1が除外されました。
HTML
<ul> <li>ジャンルB</li> </ul>
取得上限数や取得範囲を指定する
タームの取得上限数を設定したい場合、numberを指定します。
PHP
<?php $arr = array( 'number' => 3, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
取得できる5件のうち、先頭から3件が取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルA-1</li> <li>ジャンルB</li> </ul>
取得開始位置を先頭以外にしたい場合、numberと合わせてoffsetを指定します。
PHP
<?php $arr = array( 'number' => 3, 'offset' => 1, ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
取得できる5件のうち、2番目から3件が取得できました。
HTML
<ul> <li>ジャンルA-1</li> <li>ジャンルB</li> <li>ジャンルD</li> </ul>
取得する内容を変更する
デフォルトだとタームオブジェクトを取得できますが、項目を絞りたい場合はfieldsで取得する内容を指定できます。
PHP
<?php $arr = array( 'fields' => 'names', ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <?php var_dump( $terms ); ?> <?php endif; ?>
ターム名のみを取得できました。
HTML
array(5) { [0]=> string(13) "ジャンルA" [1]=> string(15) "ジャンルA-1" [2]=> string(13) "ジャンルB" [3]=> string(13) "ジャンルD" [4]=> string(15) "ジャンルD-1" }
指定した文字列にマッチするタームのみ取得する
指定した文字列に部分一致するタームのみ取得したい場合、name__likeや、description__likesearchなどを使用します。
ターム名のみで部分一致を調べたい場合、name__likeを使用します。
PHP
<?php $arr = array( 'name__like' => 'b', ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
ターム名に「b」が含まれるジャンルBのみ取得できました。
HTML
<ul> <li>ジャンルB</li> </ul>
ターム名とスラッグで部分一致を調べたい場合、searchを使用します。
PHP
<?php $arr = array( 'search' => 'genrea', ); $terms = get_terms( 'genre', $arr ); if( !empty( $terms ) && !is_wp_error( $terms ) ): ?> <ul> <?php foreach($terms as $term) : ?> <li><?php echo $term->name; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
スラッグに「genrea」が含まれるジャンルAとジャンルA-1のみ取得できました。
HTML
<ul> <li>ジャンルA</li> <li>ジャンルA-1</li> </ul>
【参考サイト】
コメントが承認されるまで時間がかかります。