【Word Press】セレクトボックスの選択値をカスタムタクソノミーのタームで分けて表示する

カスタムフィールドに登録されている値を使って実装しているセレクトボックスにて。

投稿が月1で1本ずつ程度増えるので、あんまり気にせずにいたらものすごく長くなってしまいました。

選択をするのにも一苦労なので。

タームを目印にして簡易的な分類にしようかとやってみました。

状況

今回取得したい情報はターム名と。

そのタームに分類されている投稿のカスタムフィールドの値です。

投稿はカスタム投稿タイプを使用しています。

なのでタームはカスタムタクソノミーで設定したタームの情報です。

ここらへんの情報を取得し、セレクトボックスの値に設定できれば良い。

そんな感じです。

タームのIDを取得

まずは、カスタムタクソノミーからタームのIDを取得します。

以前にタームの値を表示する方法について書きましたが、その応用・・・とはちょっと違いますが。

似たような感じです。

タームの情報を取得するには、get_terms()を使用します。

//get_terms('取得するタームの情報を配列で指定');
//get_term_by('検索する値のフィールド名', '検索する値', '検索対象のタクソノミー')

$parent_categories = get_terms(array(
    'taxonomy' => 'parent-cat', //カスタムタクソノミー名を指定
    'parent' => get_term_by('slug', 'child-term', 'parent-cat')->term_id, //chilr-termという値をスラッグから探すという指定
    'hide_empty' => false
));

まずは、get_terms()で検索するタクソノミーの条件を指定します。

'parent-cat’というタクソノミーに登録されているタームの中から、’child-term’という値をスラッグから探し、IDに変換する。

という内容です。

これでタームのIDの配列を取得できました。

ループでタームに分類される投稿のデータを取得する

先ほど取得したタームIDの配列から、そのタームIDに分類されている投稿のデータを取得します。

今回の場合だと、タームIDに分類されていて、投稿に登録されているカスタムフィールドの値、ということになります。

言葉にするとまどろっこしいですねw

簡単に流れを書くと。

・foreachで配列を展開し、タームIDごとのクエリを作る
・foreach内でループを展開
・カスタムフィールドの値を連想配列にいれる

という感じです。

//配列を格納する変数の作成
$post_categoried = array();

foreach ($parent_categories as $child) {
    //クエリの指定
    //タームIDの配列なのでタームIDで探す
    $child_args = array(
        'post_type' => 'カスタム投稿名',
        'posts_per_page' => -1,
        'tax_query' => array(
            array(
                'taxonomy' => 'parent-cat',
                'field' => 'term_id',
                'terms' => $child->term_id
            )
        )
    );
    //WPループ
    $child_query = new WP_Query($child_args);
    if ($child_query->have_posts()) {
        while ($child_query->have_posts()) {
            $child_query->the_post();
            //カスタムフィールドの値を取得
            $text_value = get_post_meta(get_the_ID(), 'item-name', true);
            //カスタムフィールドが空じゃなければ
            if (!empty($text_value)) {
                //配列の中にターム名がなければ
                if (!isset($post_categories[$child->name])) {
                    //ターム名の配列を作成
                    $post_categories[$child->name] = array();
                }
                //ターム名の配列の中に$test_valueがなければ
                if (!in_array($text_value, $post_categories[$child->name])) {
                    //カスタムフィールドの値を連想配列に追加
                    $post_categories[$child->name][] = $text_value;
                }
            }
        }
        wp_reset_postdata();
    }
}

// カテゴリーごとにソートして整える
foreach ($post_categories as $child_name => $post_list) {
    sort($post_categories[$child_name]);
}
ksort($post_categories);

使用したいカスタムフィールドの値は、ターム名の配列の中に連想配列で格納されます。

これで、タームに分類されている投稿のデータを取得できたことに。

カスタムフィールドの値とかではなく、投稿IDで良ければthe_ID() あたりにすれば良いかと。

最後に、取得した値をタームごとに整理し、ターム自体も整理してあります。

あとはセレクトボックスに突っ込むだけ

この取得した連想配列を、HTMLで作成したセレクトボックスのタグ内でforeachで展開すれば、タームごとに分けられた選択肢になるはずです。

以前にカスタムフィールドの値でセレクトボックスを作る記事を書きましたが、これのforeach部分で今回の$post_categoriesを使用してもらえればOKです。

たぶん、こういう実装の場合、JavaScriptを使って。

タームの選択→動的にカスタムフィールドの値を絞り込み→カスタムフィールドの値を選択

という方がUI的には良いとは思ったんですが。

たまに見かけるドロップダウンリストの中のカテゴリ分けを、自分でも実装したくなったという。

ただのワガママの解決策は、連想配列だった。

という話です。