WordPress 4.6.0から追加されたWP_Term_Queryを使う

WordPress 4.6.0から追加されたクラスの WP_Term_Query を使って、タームを取得する方法を紹介します。

meta_query を使用する場合は注意が必要なので、そのあたりも書きました。

  

WP_Term_Query の使い方

基本的な使い方ですが、get_terms とほとんど変わりません。

// WP_Term_Query arguments
$args = array(
  // タクソノミー(カスタム分類)を指定
  'taxonomy' => array( 'taxonomy_name' ),
   // 投稿のないターム(カスタム分類のカテゴリ)も取得
  'hide_empty' => false,
);

// The Term Query
$term_query = new WP_Term_Query( $args );


// The Loop
if ( ! empty( $term_query ) && ! is_wp_error( $term_query ) ) {
    // do something
  foreach ( $term_query->get_terms() as $term ) {
  }
} else {
    // no terms found
}

WP_Term_Query Generator を使用してコードを生成してみました。

meta_query について

$args = array(
  'taxonomy' => array( 'taxonomy_name' ),
  'hide_empty' => false,
  'meta_query' => array(
    array(
      'key' => 'キー',
      'value' => '値',
    )
  ),
);

このように、WP_Term_Queryクラスでは meta_query を指定することができます。

$args = array(
  'taxonomy' => array( 'taxonomy_name' ),
  'hide_empty' => false,
  'meta_key' => 'キー',
  'meta_value' => '値',
);

meta_keymeta_value を用いて指定しても同じです。

get_terms では WordPress 4.4.0から meta_query を指定することができます。
また、WordPress 4.5.0から meta_keymeta_value の指定も可能です。

WP_Queryクラスで meta_query を指定すると、投稿のカスタムフィールドを取得しますが(データベース上のテーブルでいうと wp_postmeta)WP_Term_Queryクラスの場合は注意が必要です。

Database Description – WordPress Codex によると、WordPress 4.2.2で wp_termmeta というテーブルが追加されています。

※WP_Term_Queryクラスで取得するメタ情報はこの wp_termmeta テーブルから取得するため、投稿のカスタムフィールドとは違います。

また WordPress 4.4.0 では wp_termmeta テーブルへアクセスするための、以下の関数が追加されました。

タームに紐づくメタ情報(カスタムフィールドといっていいのでしょうか)を作成できるようになったということですね。
これらの WordPress の API を使用してない、カスタムフィールドのプラグインなどでは wp_termmeta テーブルにデータが保存されない場合があります。

ちなみに var_dump( $term_query ); してみたところ、このようなSQLが実行されていました。

SELECT
    DISTINCT t.*,
    tt.*
FROM
    wp_terms AS t
    INNER JOIN
        wp_termmeta
    ON  (
            t.term_id = wp_termmeta.term_id
        )
    INNER JOIN
        wp_term_taxonomy AS tt
    ON  t.term_id = tt.term_id
WHERE
    tt.taxonomy IN('taxonomy_name')
AND ((
            wp_termmeta.meta_key = 'キー'
        AND wp_termmeta.meta_value = '値'
        ))
ORDER BY
    t.name ASC

参考

  

共有やブックマークなど