【WordPress】カスタムフィールドの値からセレクトボックスを作る

同じ名前のカスタムフィールドでも入力する値は異なります。たぶん。

・カスタムフィールドの値を絞り込み検索に使いたい

と思うことがあり、何なら動的にセレクトボックスが生成するようにしようかと。

get_posts()を使う

カスタムフィールドの値の呼び出しは、get_post_meta()を使用しますが。

引数で投稿IDが必要となります。

なので、get_posts()を使って取得します。

//投稿の取得条件
$args = array(
    'post_type' => 'test_post',
    'post_publish' => 'publish',
    'orderby' => 'ID',
    'posts_per_page' => -1,
    'meta_key' => 'test_field',
);

//get_posts()で取得
$test_posts = get_posts($args);

カスタム投稿タイプの’test_post’から、カスタムフィールド’test_field’の値を、公開('publish’)されてるものを’ID’順に全件('posts_per_page’ => -1)取得してね!

という指定です。

どの投稿のカスタムフィールドの値をセレクトボックスに入れるかは未定なので、カスタムフィールドの値を全投稿分取得できるようにしています。

foreach内でセレクトボックスにする

get_posts()は投稿データを配列で取得するので、配列内のデータを実行するforeachを利用します。

セレクトボックスのHTML文と合わせて書きます。

<label for="test_post_values">セレクトボックス</label>
  <select name="test_post_values">
    <option value="" >選択</option>
      <?php
                //配列の値をセレクトボックスの要素に
        foreach( $test_posts as $post ){
                echo '<option value="' . $post . '">' . $post . '</option>';
        }
      ?>
  </select>

セレクトボックスのvalue属性に配列の値を入れてもらい、全投稿分を入れてます。

・・・が。

そうすると怖いのは、空白や重複。

選択肢の中に同じモノが3つ4つある必要はないですし。

カスタムフィールドに値が入力されずに表示される空白も不要(入れるのであれば、一番最初ぐらい)です。

配列をarray_unique()してarray_filter()する

そこで、配列を整理してくれるPHP関数を利用します。

今回の場合は配列内の重複を削除してくれるarray_unique()と、空要素を削除してくれるarray_filter()を利用します。

対象となる配列は、get_posts()で取得する投稿データなので。

$test_posts = get_posts($args);

//配列の要素の整理
$test_posts_array = array_filter( array_unique( $test_posts ) );

とこんな感じです。

コード全体

<?php
//投稿の取得条件
$args = array(
    'post_type' => 'test_post',
    'post_publish' => 'publish',
    'orderby' => 'ID',
    'posts_per_page' => -1,
    'meta_key' => 'test_field',
);

//get_posts()で取得
$test_posts = get_posts($args);

//配列の要素の整理
$test_posts_array = array_filter( array_unique( $test_posts ) );
?>

<label for="test_post_values">セレクトボックス</label>
  <select name="test_post_values">
    <option value="" >選択</option>
      <?php
                //配列の値をセレクトボックスの要素に
        foreach( $test_posts_array as $post ){
                echo '<option value="' . $post . '">' . $post . '</option>';
        }
      ?>
  </select>

動的なセレクトボックスの作成

これで、カスタムフィールドの値の種類で動的に変わるセレクトボックスができました。

何種類入るのか未定だったのでセレクトボックスにしましたが。

使いにくければHTML部分をチェックボックスに変えたりもできます。