【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部分をチェックボックスに変えたりもできます。
ディスカッション
コメント一覧
まだ、コメントがありません