ACFカスタムフィールドの値で管理画面記事一覧を絞り込み検索

- WordPress -
2020.11.17
WordPress/ワードプレス

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」をクリック
    ACFで管理画面絞り込み検索
  • 検索対象としたいカスタムフィールドを含むフィールドグループにチェックをいれ「Generate PHP」をクリック
    ACFで管理画面絞り込み検索

すると、以下のように "field_xxxx" の文字列が見つかります。これに置き換えましょう。

Advanced Custom Fields

7、12、26行目の ★stock_status 部分

カスタムフィールドの以下「フィールド名」に記述した文字列と置き換えます。

Advanced Custom Fields

※ 8行目の"在庫情報の指定なし"というテキストも状況に合わせ適当に書き換えてください

④ 36行目 'compare' => 'LIKE' のコメントアウト部分

検索対象としたいACFフィールドタイプを"チェックボックス"で利用している時にコメントアウトしてください。

ACFで管理画面絞り込み検索

セレクトボックス・ラジオボタンの場合はコメントアウトしたままで大丈夫です。

これで、

  1. 管理画面の記事一覧でカスタムフィールドによるセレクトボックスが表示されていること
  2. 選択して「絞り込み検索」をすると、絞り込まれた結果が表示されること

を確認して意図した通りに動作すれば完了です!

参考Taiyo Blog:キーワードとカスタムフィールドの絞り込み検索

↑TOP