ACFカスタムフィールドの値で管理画面記事一覧を絞り込み検索
WordPress管理画面の記事一覧で、Advanced Custom Fieldsで作ったカスタムフィールドの値を選択して絞り込み検索をしたい。
そんな人へ向けてメモです。
完成イメージは以下。
たとえば、ある商品に対してカスタムフィールドで登録した「在庫状況」が紐づいていて、在庫状況をプルダウンメニューで選択できるようにする → 「絞り込み検索」をクリックするとその在庫状況の商品(記事)のみ表示されるようにしたい、という感じです。
以下のようにフィールドタイプ「Select」でカスタムフィールドを作って商品に在庫情報を紐づけている、という前提で話を進めます。この辺の細かな設定はご自身の環境に読み替えてください。
上記ではAdvanced Custom Fieldsのフィールドタイプが"Select"の例ですが、
- チェックボックス
- ラジオボタン
など「選択肢」が「値 : ラベル」の形式で保存されていればそのまま使えるので、参考にしてみてください。
Advanced Custom Fieldsのカスタムフィールド値で管理画面記事一覧を絞り込み検索
functions.phpへ貼り付け
後で細かな中身は書き換えるので、以下コードをそのままfunctions.phpへコピペします。
※ 以下冒頭のPHP開始タグ<?phpがすでに既存ファイル内にある場合は削除してください
<?php
// 管理画面 投稿タイプ"product"一覧で、カスタムフィールドによる記事絞込
function my_add_filter() {
global $post_type;
if ( '★product' === $post_type ) {
?>
<select name="★stock_status">
<option value="">在庫状況の指定なし</option>
<?php
$field = get_field_object("★field_xxxxxxxxx");
foreach ($field['choices'] as $value => $label) { ?>
<option value="<?php echo $value; ?>" <?php if ( filter_input( INPUT_GET, '★stock_status' ) === $value ) { print 'selected'; } ?>><?php echo $label; ?></option>
<?php } ?>
</select>
<?php
}
}
add_action( 'restrict_manage_posts', 'my_add_filter' );
// カスタムフィールド(stock_status)での絞込検索
function pre_get_posts_admin_custom_field( $query ) {
global $post_type;
// 管理画面 / 投稿タイプがproduct / メインクエリ、のすべての条件を満たす場合
if ( is_admin() && '★product' === $post_type && $query->is_main_query() ) {
// カスタムフィールドのキー
$meta_key = '★stock_status';
// 選択されている値
$meta_value = filter_input( INPUT_GET, $meta_key );
// クエリの検索条件に追加
if ( strlen( $meta_value ) ) {
$meta_query = $query->get( 'meta_query' );
if ( ! is_array( $meta_query ) ) $meta_query = array();
$meta_query[] = array(
'key' => $meta_key,
'value' => $meta_value,
// 'compare' => 'LIKE' // ★フィールドタイプが"チェックボックス"の場合コメントアウト
);
$query->set( 'meta_query', $meta_query );
}
}
}
add_action( 'pre_get_posts', 'pre_get_posts_admin_custom_field' );
コピペ後、以下に従って内容を書き換えていきます。
① 5、24行目の ★product 部分
意図する投稿タイプの名前(スラッグ)に書き換えます。WordPressデフォルトの"投稿"の場合は"post"です。
② 10行目の ★field_xxxxxxxxx 部分
ここはすこし手間ですが、以下手順で、xxxx部分に入れるべき文字列を探してください。
- 管理画面左バー「カスタムフィールド」> 「Tools」をクリック
- 検索対象としたいカスタムフィールドを含むフィールドグループにチェックをいれ「Generate PHP」をクリック
すると、以下のように "field_xxxx" の文字列が見つかります。これに置き換えましょう。
③ 7、12、26行目の ★stock_status 部分
カスタムフィールドの以下「フィールド名」に記述した文字列と置き換えます。
※ 8行目の"在庫情報の指定なし"というテキストも状況に合わせ適当に書き換えてください
④ 36行目 'compare' => 'LIKE' のコメントアウト部分
検索対象としたいACFフィールドタイプを"チェックボックス"で利用している時にコメントアウトしてください。
セレクトボックス・ラジオボタンの場合はコメントアウトしたままで大丈夫です。
これで、
- 管理画面の記事一覧でカスタムフィールドによるセレクトボックスが表示されていること
- 選択して「絞り込み検索」をすると、絞り込まれた結果が表示されること
を確認して意図した通りに動作すれば完了です!
参考Taiyo Blog:キーワードとカスタムフィールドの絞り込み検索