get_termsでタームに属する記事が無い場合でも表示させる方法

車の修理代20万円を払うべきか、100万円くらいの中古車に買い換えるべきか悩んでいる板川です。
久しぶりの投稿すぎて変に緊張しています。

今回の目的

さて、今回はWordPressのget_terms関数です。get_termsでタームを取得する場合、デフォルトでは記事が存在するタームのみ表示されます。記事のアーカイブならそれでも良いのですが、タイトルのとおり、このターム一覧を表示させなければならない場合はそうもいきません。今回はその方法を記しておきます。

get_termsの概要

まずget_terms関数の簡単な説明です。get_terms関数は指定されたタクソノミー(カスタム分類)またはタクソノミーのリストについて、それに含まれるタームを取得します。返り値はタームのオブジェクトの配列で、 もしタクソノミーが存在しなければ WP_Error オブジェクトを返します。

get_termsの基本的な記法

<?php $terms = get_terms( $taxonomies, $args ); ?>
// $taxonomies、$argsはどちらも配列でもOK。

get_termsで記事がないタームも表示する場合

記事が無いタームを表示する場合は、get_termsの第2引数の配列でhide_emptyをfalseにします。

// 配列でオプションを設定します
<?php 

$args = array(
    'orderby' => 'id',
    'order' => 'ASC',
    'hide_empty' => false,
    // 引数「hide_empty」をfalseにすることで投稿がない場合でも表示させることができます
);

// 取得するタクソノミーが「original_taxonomy」の場合
$terms = get_terms('original_taxonomy', $args);
var_dump($terms);

?>

その他のget_terms第2引数

$args = array(
    'orderby'       => 'name',  // ソートするフィールド
    'order'         => 'ASC', // ソートの方向
    'hide_empty'    => true,  // 空のタームを返すかどうか
    'exclude'       => array(), // 除外するタームの ID の配列。
    'exclude_tree'  => array(), // 除外する親タームの ID の配列
    'include'       => array(), // 含めるタームの ID の配列。空文字列を指定するとすべてのタームを対象にします。
    'number'        => '',  // 返すタームの最大個数。デフォルトではすべてのタームを返します。
    'fields'        => 'all', // 返り値がどのような形式かを指定します
    'slug'          => '', // 指定した値がスラッグに一致するタームを返す。デフォルトは空文字列。
    'parent'        => '', // 直近の子タームを返す(指定された値が親タームの ID であるタームのみ)。
    'hierarchical'  => true, // 子タームを持つタームを含める 
    'child_of'      => 0, // 指定したタームの子孫をすべて取得します。
    'childless'     => false, // タクソノミーが階層有りの場合、子を持たないタームのみを返します。階層無しの場合、すべてのタームを対象とします。
    'get'           => '', // デフォルトは空文字列です。この値を 'all' にすると 'hide_empty' と 'child_of' が無効になります(すべてのタームを取得します)。
    'name__like'    => '', // ターム名にマッチさせたい文字列。ターム名に対してのみ、データベースクエリの LIKE '%string%' を実行します。
    'description__like' => '', // タームの説明に 'description__like' の文字列を含む(大文字小文字を区別して)タームを返します。
    'pad_counts'    => false, // true のとき、子孫タームすべてのカウント(投稿などのオブジェクトに付けられている回数)を合計します。
    'offset'        => '', // 見つかったタームの先頭から指定の個数を読み飛ばして返します。必ず 'number' と一緒に使ってください。そうしないと 'offset' は無視されて結果すべてが返されます。
    'search'        => '', // ターム名にマッチさせたい文字列。ターム名とスラッグに対して、データベースクエリの LIKE '%search_string%' を実行します。
    'cache_domain'  => 'core' // get_terms() が作成したクエリにユニークなキャッシュ用キーを付与できます。例えば、この関数のフィルターを使ってクエリを変更するとき(例えば 'terms_clauses')、'cache_domain' にユニークな値を指定しておけば、キャッシュにある同様のクエリを上書きせず残しておけます。デフォルト値は 'core' です。
); 

まとめ

カスタム投稿タイプを設定するときに、必ずと言っていいほどタクソノミーを設定します。get_termsは使用頻度が高いため、引数の配列名を覚えるまではしなくとも、どういったことが出来るかは把握しておくとより良いコードを書けるのではないでしょうか。

この記事を書いた人

keishiro

こんにちは、板川恵司朗です。