概要
WPで、スタッフ(カスタム投稿)のランク(タクソノミー)やら勤務店舗(タクソノミー)やらをOR検索したい。
【参考サイト】
https://works.coldsleep.jp/blog/search-method/
https://website-fun.com/wp-refine-search/
https://github.com/seebz/Snippets/blob/master/Wordpress/functions/wp_dropdown_taxonomies.php
https://qiita.com/ymeeto/items/7681db1f78d3e0e8301a
https://www.webopixel.net/wordpress/584.html
https://www.akaeho.net/wp-searchform/
やったこと
1.検索用のフォームが必要なのでフォームを作成します。
2.次に検索用フォームの表示。
3.配列の検索結果(メニューのような、いくつも選べるもの)がORで検索されないのでその修正。
4.検索結果を専用の表示ファイルに変更、という感じで作業します。
※検索結果の表示ファイルは(この記事では)作りません。通常だと検索結果はテーマの「search.php」か「archive-カスタム投稿タイプ名.php」とかになるはず。
検索フォーム
検索したい項目を並べた検索用フォームを作成します。
今回は自動でタクソノミーからひっぱってきてもらいます。
テーマ内に【searchform-staff.php】というファイルを作って保存。
<h4>スタッフ検索</h4> <form role="search" method="get" action="<?php echo esc_url(home_url('/')); ?>"> <!-- name="post_type"のvalueに、検索対象の投稿タイプを記入する。今回は【staff】 --> <input type="hidden" name="post_type" value="staff"> <input type="search" class="hidden-search-field" name="s" value="<?php echo get_search_query(); ?>"/> <!-- ラジオボタン --> <h4>スタッフランク</h4> <label><input type="radio" name="staff_rank" value="" checked="checked">指定なし</label><br/> <?php $taxonomy_name = 'staff_rank'; // 取得したいタクソノミー名を記入【staff_rank】 $args = array('hide_empty' => 0); // 紐づく投稿記事がなくても表示する $taxonomys = get_terms($taxonomy_name, $args); if (!empty($taxonomys) && !is_wp_error($taxonomys)): foreach ($taxonomys as $taxonomy): ?> <label><input type="radio" name="staff_rank" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label><br/> <?php endforeach; ?> <?php endif; ?> <!-- チェックボックス --> <h4>スタッフメニュー</h4> <?php $taxonomy_name = 'staff_menu'; // 取得したいタクソノミー名を記入【staff_menu】 $args = array('hide_empty' => 0); // 紐づく投稿記事がなくても表示する $taxonomys = get_terms($taxonomy_name, $args); if (!empty($taxonomys) && !is_wp_error($taxonomys)): foreach ($taxonomys as $taxonomy): ?> <label><input type="checkbox" name="staff_menu[]" value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></label><br/> <?php endforeach; ?> <?php endif; ?> <!-- ドロップダウンリスト --> <h4>スタッフ勤務店舗</h4> <select name="staff_location"> <option value="">すべての店舗</option> <?php $taxonomy_name = 'staff_location'; // 取得したいタクソノミー名を記入【staff_location】 $args = array('hide_empty' => 0); // 紐づく投稿記事がなくても表示する $taxonomys = get_terms($taxonomy_name, $args); if (!empty($taxonomys) && !is_wp_error($taxonomys)): foreach ($taxonomys as $taxonomy): ?><option value="<?php echo $taxonomy->slug; ?>"><?php echo $taxonomy->name; ?></option> <?php endforeach; ?> <?php endif; ?> </select> <!-- 検索ボタン --> <div> <input type="submit" value="検索する"> </div> </form>
検索用フォームを表示
検索フォームを表示する際はテーマ内のphpにrequire_onceで表示します。
<?php require_once('searchform-staff.php'); ?>
function.phpの変更
このままだとチェックボックスが配列でデータを渡しているせいかきちんと検索してくれないので「function.php」に下記を追加して文字列にして渡します。
function custom_request($query) { if (!empty($query['staff_menu']) && array_key_exists('s', $query)){ $query['staff_menu'] = implode(',', $query['staff_menu']); } return $query; } add_filter( 'request', 'custom_request' );
ここまでやると、メニューがOR検索で検索ができるようになりました。
検索結果を別のテンプレートに変更したい場合
スタッフの検索結果は別テンプレートで表示したいときは下記で変更できます。
検索対象のカスタム投稿に、専用のアーカイブがある人はコピーして作ってもいいかも?
「function.php」に下記を追加します。今回はpost typeが【staff】
検索結果表示用ファイルは【search-staff.php】としました。
/** * スタッフ検索用検索結果 */ add_filter('template_include','custom_search_template'); function custom_search_template($template){ if ( is_search() && is_post_type_archive('staff') ){ $templates[] = "search-staff.php"; $template = get_query_template('search',$templates); } return $template; }
おわり。
おまけ:ドロップダウンリストの並び順を指定する
ドロップダウンリストを指定の順番で表示させたい場合。
ついでに選択内容を自動選択する。
//選択した内容の取得 $staff_location = filter_input(INPUT_GET, 'staff_location', FILTER_SANITIZE_SPECIAL_CHARS); //このリストの順番でドロップダウンに表示される $staff_location_list = array( '愛知'=>'', '岐阜'=>'', '静岡'=>'', '徳島'=>'', ); function create_select_options($list,$taxonomys,$selected_target){ if (!empty($taxonomys) && !is_wp_error($taxonomys)){ foreach ($taxonomys as $taxonomy){ //リストに項目があるか存在チェックして、あればスラッグを入れる if(isset($list[$taxonomy->name])){ $list[$taxonomy->name] = $taxonomy->slug; } } //リストの順にオプションをつける foreach ($list as $key => $item){ //スラッグが空なら存在しないので、処理しない if(empty($item)){ continue; } //選択していたら「selected」をつける $selected = ''; if ($item === $selected_target) { $selected = ' selected'; } //オプション出力 echo '<option value="' .esc_attr($item). '"' .esc_attr($selected). '>' .esc_html($key). '</option>'; } } }
設置方法
<h4>スタッフ勤務店舗</h4> <select name="staff_location"> <option value="">すべての店舗</option> <?php $taxonomy_name = 'staff_location'; // 取得したいタクソノミーの情報 $args = array('hide_empty' => 0); // 紐づく投稿記事がなくても表示する $taxonomys = get_terms($taxonomy_name, $args); //選択項目の表示 create_select_options($staff_location_list,$taxonomys,$staff_location); ?> </select>
こんどこそおわり。