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

- WordPress -
2019.11.25
WordPress

WordPress管理画面の記事一覧で、Advanced Custom Fieldsで作ったカスタムフィールドの値を選択して絞り込み検索をしたい!

そんな人へ向けてメモ。

完成イメージは以下で、例えばカスタムフィールドで登録した「在庫状況」がまず選択できるようにして、そして「絞り込み検索」をクリックするとその在庫状況の記事のみ表示されるようにしたい、という感じです。

これがやりたかったこと

以下のようにフィールドタイプ「Select」でカスタムフィールドを作って商品に在庫情報を紐づけている、という前提で話を進めます。

Advanced Custom FieldsのフィールドタイプがSelectではなくチェックボックスやラジオボタンだとしても、「選択肢」が「値 : ラベル」の形式で保存されていればそのまま使えると思うので、参考にしてみてください。

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

functions.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
            );
            $query->set( 'meta_query', $meta_query );
        }
    }
}
add_action( 'pre_get_posts', 'pre_get_posts_admin_custom_field' );

以下内容を書き換えます。

5、23行目の ★product 部分

意図する投稿タイプの名前(スラッグ)に書き換えます。

10行目の ★field_xxxxxxxxx 部分

ここはちょっと手間ですが、以下手順で、xxxx部分に入れるべき文字列を探してください。

  • 管理画面左バー「カスタムフィールド」> 「Tools」をクリック
  • 検索対象としたいカスタムフィールドを含むフィールドグループにチェックをいれ「Generate PHP」をクリック

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

Advanced Custom Fields

12、25行目の ★stock_status 部分

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

Advanced Custom Fields

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

これで、

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

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

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