Advanced Custom Fields(ACF)の値で絞り込み検索を実装したので備忘録として残します。
世の中にはカスタムフィールドの値を検索できるプラグインはたくさんありますが、継続したサポートを行っていないプラグインはWordpressのアップデートされたタイミングで使えなくなるリスクがあります。個人的には仕事として受けた案件なら極力使いたくないです。後々面倒なことになりそうなので。
有料プラグインのFE Advanced SearchもACFには対応していないようです。( ACF対応でしっかりとサポートされている検索プラグインあるなら知りたい)
ACFの値で絞込検索機能を実現するには、アクションフック「pre_get_posts」でメインクエリーの検索条件を変更することで実現できました。
Advanced Custom Fieldsの設定値
今回は、「 基本情報 」フィールドを作成し、フィールドタイプを「 Group 」にして、サブフィールドには「勤務地(都道府県)」「募集職種」「雇用形態」などのフィールドを作成しています。

検索フォームのHTML
検索対象とする「勤務地(都道府県)」「募集職種」「雇用形態」の項目で検索フォームを作成。
職種と雇用形態のチェックボックスはOR検索で実装していきます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
<form action="/jobs/" method="get"> <table class="table is-bordered"> <tr> <th width="150">勤務地(都道府県)</th> <td> <select name="prefecture" class="input"> <option value="">未選択</option> <option value="北海道">北海道</option> <option value="青森県">青森県</option> <option value="岩手県">岩手県</option> <option value="宮城県">宮城県</option> <option value="秋田県">秋田県</option> <option value="山形県">山形県</option> <option value="福島県">福島県</option> <option value="茨城県">茨城県</option> <option value="栃木県">栃木県</option> <option value="群馬県">群馬県</option> <option value="埼玉県">埼玉県</option> <option value="千葉県">千葉県</option> <option value="東京都">東京都</option> <option value="神奈川県">神奈川県</option> <option value="新潟県">新潟県</option> <option value="富山県">富山県</option> <option value="石川県">石川県</option> <option value="福井県">福井県</option> <option value="山梨県">山梨県</option> <option value="長野県">長野県</option> <option value="岐阜県">岐阜県</option> <option value="静岡県">静岡県</option> <option value="愛知県">愛知県</option> <option value="三重県">三重県</option> <option value="滋賀県">滋賀県</option> <option value="京都府">京都府</option> <option value="大阪府">大阪府</option> <option value="兵庫県">兵庫県</option> <option value="奈良県">奈良県</option> <option value="和歌山県">和歌山県</option> <option value="鳥取県">鳥取県</option> <option value="島根県">島根県</option> <option value="岡山県">岡山県</option> <option value="広島県">広島県</option> <option value="山口県">山口県</option> <option value="徳島県">徳島県</option> <option value="香川県">香川県</option> <option value="愛媛県">愛媛県</option> <option value="高知県">高知県</option> <option value="福岡県">福岡県</option> <option value="佐賀県">佐賀県</option> <option value="長崎県">長崎県</option> <option value="熊本県">熊本県</option> <option value="大分県">大分県</option> <option value="宮崎県">宮崎県</option> <option value="鹿児島県">鹿児島県</option> <option value="沖縄県">沖縄県</option> </select> </td> </tr> <tr> <th>職種</th> <td> <div> <label><input type="checkbox" name="occupations[]" value="ピットスタッフ(バイク整備士)">ピットスタッフ(バイク整備士)</label> <label><input type="checkbox" name="occupations[]" value="販売・レジスタッフ">販売・レジスタッフ</label> <label><input type="checkbox" name="occupations[]" value="事務スタッフ">事務スタッフ</label> </div> </td> </tr> <tr> <th>雇用形態</th> <td> <div> <label><input type="checkbox" name="employment_statuses[]" value="正社員">正社員</label> <label><input type="checkbox" name="employment_statuses[]" value="パート・アルバイト">パート・アルバイト</label> </div> </td> </tr> </table> <input type="submit" value="検索する" accesskey="f" class="button is-primary" /> </form> |
functions.phpに記述するメインクエリを書き換える処理
functions.phpにアクションフック「pre_get_posts」を使ってメインクエリを書き換えます。
肝は「$query->set(‘meta_query’, 【カスタムフィールドの条件】);」です。
meta_queryの指定方法はこちらが参考になりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
function change_pre_get_posts($query) { // 管理画面,メインクエリ以外に干渉しないため if ( is_admin() || ! $query->is_main_query() ){ return; } // カスタム投稿タイプが「jobs」の場合 if($query->is_post_type_archive( 'jobs' )) { $meta_query = [ 'relation' => 'AND', ]; // 勤務地(都道府県) if(!empty($_GET['prefecture'])) { $meta_query[] = array( 'key' => '基本情報_勤務地_都道府県', 'value' => $_GET['prefecture'], 'compare' => '=' ); } // 職種 if(!empty($_GET['occupations']) and is_array($_GET['occupations'])) { $sub_meta_query = [ 'relation' => 'OR', ]; foreach ($_GET['occupations'] as $index => $occupation) { $sub_meta_query[] = [ 'key' => '基本情報_募集職種', 'value' => $occupation, 'compare' => '=' ]; } $meta_query[] = $sub_meta_query; } // 雇用形態 if(!empty($_GET['employment_statuses']) and is_array($_GET['employment_statuses'])) { $sub_meta_query = [ 'relation' => 'OR', ]; foreach ($_GET['employment_statuses'] as $index => $employment_status) { $sub_meta_query[] = [ 'key' => '基本情報_雇用形態', 'value' => $employment_status, 'compare' => '=' ]; } $meta_query[] = $sub_meta_query; } $query->set('meta_query', $meta_query); } } add_action( 'pre_get_posts', 'change_pre_get_posts' ); |
meta_queryのkeyに何を入れればいいのかを調べる
meta_queryの「key」に指定する値はデータベースのwp_postmetaテーブルのmeta_keyの値を見ればわかります。

条件分岐の一例
今回は「if( $query->is_post_type_archive( ‘jobs’ ) ) {… 」でカスタム投稿タイプの名前が「jobs」のものだけに条件を適用しています。条件分岐タグは色々用意されているので、詳しくは参考サイトを見てみてください。
参考:qiita.com/_ruka_/items/e14280d34eddf49efad1
参考:公式ドキュメント|条件分岐タグ
1 2 3 4 5 6 7 8 9 10 11 |
$query->is_home() $query->is_single() $query->is_page() $query->is_archive() $query->is_post_type_archive( 'post_type' ) $query->is_category() $query->is_tag() $query->is_tax() $query->is_search() $query->is_feed() $query->is_404() |