カスタムフィールドの検索に対応してみたWordPressプラグイン「Simplicity Add Fields Search Engine」
WordPressのサイト内検索のプラグイン「Simplicity Add Fields Search Engine」は、WordPressで制作したサイトの検索ページ(search.phpの検索結果)を拡張します。
サイト内検索において、以下の検索や条件指定に対応しています。
- カスタムフィールド内の検索(どのカスタムフィールドを対象にするかはオプションで指定可能)
- 標準投稿タイプ、カスタム投稿タイプ内の全検索(どの投稿タイプを対象にするかはオプションで指定可能)
- タームの複数指定での検索(チェックボックス形式)
- 検索に表示される投稿のソート(カスタムフィールドもソート可能。カスタムフィールドが後付けされた場合にも対応しています。通常のWP_Queryを用いたカスタムフィールドのソートの際にありがちな検索結果の不自然な除外を、このプラグインは行いません。)
- プラグインを導入した際の検索の拡張は、プラグインの有効パラメータにより行っているので、通常検索における検索結果を汚染しません。
また、このプラグインは、以下の内容を想定して開発しています。
- 不動産サイトなどの物件・宅地のサイト内検索
- 企業・お店サイトなどの商品・製品のサイト内検索
- 他、それに類する検索を行うとき
とある案件で、これらの要件を満たすようなサイトを作ろうとしたので、先駆けとしてプラグインにしました。
(一応、カスタムフィールドはAdvanced Custom Fieldsで作ることを想定。でもカスタムフィールドそのものの仕組みは同じ(はず)なので普通のカスタムフィールドも大丈夫です。)
割と気合を入れて作り込んだので、手元で腐らせるのがもったいないため公開。
プラグインはもともとオリジナルテーマなどの制作者向けにテンプレートの編集前提で作っていましたが、Ver 0.9.4から表示周りだけメインループを書き換えて、テーマの検索ループを編集しなくても使えるようにしました。(無改造の公式テーマや野良テーマでもある程度は使える・・・と思う。)
Ver 0.9.3以前の従来どおり、テーマの検索ループ(search.php)のテンプレートファイルを編集することもできます。(この場合、編集形態は親テーマ・子テーマは問いません。)
この辺りに関しては、プラグインのダッシュボード([サイト内検索]メニュー)に書いている説明書を読んでいただければ、どの程度の変更になるのかがわかると思います。(このページの少し下にもその内容の抜粋があります。)
検索条件、取得する投稿タイプ、ソートのセレクトボックスに表示する項目などは管理画面の[サイト内検索の設定]のオプション値より変更可能です。
以下の画像は、Simplicity Add Fields Search Engineのサイト内検索の設定画面の一部です。(Ver 0.9.0時点)
利用・再配布・改変等はご自由にどうぞ。
でも、それに伴うトラブルには腐れコーダーのcattlemuteは一切関与しません。自己責任でお願いします。
あと、プラグインの著作権は放棄していません。プラグイン内での著作権の明記を守っていただければ幸いです。
ダウンロードはこちらから
現在のバージョン: Ver 0.9.8(2021/02/22更新)
導入方法は[プラグイン] > [新規追加] > [プラグインのアップロード]より、ダウンロードしたZIPファイルをそのままアップロードして下さい。
その後、通常通りプラグインを有効化して、プラグインのダッシュボード([サイト内検索]メニュー)の手順で設定することで先に触れた内容のサイト内検索が実装可能です。
プラグインの更新履歴
- 2021/02/22 プラグインをアップデートしました。以下の機能追加と不具合修正を行っています。
- タイトル及び本文を投稿タイプの検索から除外する機能を追加しました。
- カスタムフィールドのプリフィックスをカンマ区切りで複数指定ができるようにしました。
- カスタムフィールドのプリフィックスを指定したときに余計な限定条件が発生するバグを修正しました。…スミマセン。
- プラグインチェッカーを新しいバージョンに挿げ替えました。アップデートに失敗する場合はダウンロードし直してみて下さい。
- 2019/06/12 190610のアップデート内容からの一部修正。及び機能を追加・変更。
- safse_add_param()の関数に引数$inc_keyword_method_userを追加しました。
関数を使用してフォームパーツを出力する際に、その中でAND/OR検索を表示するかどうかを指定できます。 - safse_add_param()とsafse_sort_select()の両関数に出力文字列を変更するためのフィルターフックを追加しました。
フィルターフックの名称はプラグイン内の説明に書いてあります。 - safse_sort_select()の関数より、$script_appendの引数を削除しました。
検索ページ以降でのソート用の単独セレクトボックスを出力する関数に、スクリプトの出力・非出力はあまり意味ないなーと思ったので・・・。
一応、引数そのものは残してあるので指定していても問題ありませんが、ver 0.9.7以降(今回のアップデート)から、この引数指定でスクリプトの出力・非出力を制御することはできません。 - ver 0.9.6での説明の表記内容にゆらぎがあったので一部修正
- その他、コードフィックス等
- safse_add_param()の関数に引数$inc_keyword_method_userを追加しました。
- 2019/06/10 色々機能を変更・追加。
軽く収めるつもりがそれなりの変更になったので細分化して書きます。- これまでデフォルトで書き出していたプラグインの検索フォームテンプレートを任意での書き出しに変更。
これまでどおりテーマへプラグインの検索フォームテンプレートを書き出したい場合、設定画面から「プラグインの検索テンプレートをテーマに書き出す」を「はい」にして「保存」して下さい。保存した際に書き出されます。 - 過去バージョンでテーマ側に書き出していた検索フォームテンプレート(searchform-safse.php)がある場合はそれを優先します。
ウィジェットやショートコードのパラメータでテーマ側のテンプレートを直接指定している際は更にそれを優先して読み込みます。 - 上記の変更中、テーマ側に書き出した検索フォームテンプレートが正常に読み込まれないバグに気づいたので修正しました。今までごめんね!
- プラグイン内部に備え付けた規定の初期検索フォームテンプレートが使用されているとき(つまり、プラグインでテーマ側に内部的に設置される検索フォームテンプレートを書き出しておらず、searchform-safse.phpがテーマ内にないときに読み込まれるプラグイン内のテンプレート)は、プレースホルダーとボタンの文言を変更可能にしました。
最低限、ウィジェットやショートコードは設置するだけで使えるようにするため、今後はこれが標準になってくると思います。 - 閲覧者サイドで任意にAND・OR検索を行えるように設定機能を追加。(ver 0.9.5からの拡張)
設定画面でこれまでどおりAND・ORをサイト運営者サイドで操作するか、閲覧者サイドで操作してもらうか選べるようになりました。
前回追加したkmethのパラメータの挙動はとりあえずそのままにしています。 - 出力関数系が一部おかしかったので修正
- その他のいくつかのバグを修正
- 説明表記の校正と修正
- 【重要】将来的なバージョンアップで、「ループモード」のデフォルトを「メインループを書き換え」に変更することを予定してます。これについてのアップデート時期は未定ですが、そう遠くない将来かもしれないしそうじゃないかもしれない。
- これまでデフォルトで書き出していたプラグインの検索フォームテンプレートを任意での書き出しに変更。
- 2019/05/09 隠し機能としてキーワードの検索方式の論理演算子を強制的に書き換える機能を追加。(つまり、よくある任意のAND又ORの検索に対応しました。)
使用する場合はSafse用の検索フォームテンプレートにラジオボタンなりセレクトボタンなりで取っ付けて下さい。 - 2018/11/06 検索ページテンプレートを編集せずにプラグインを利用できるように改修。他、一部バグフィックス。
- 2018/05/24 データの保存方式を変更し、その他少しだけ調整。
- 2018/03/14 隠し機能としてタクソノミー間の検索論理、及び、ターム間の検索論理を強制的に書き換える機能を追加。とりあえず入れたかった機能はこれで全部です。
- 2018/03/07 ページネーション時の挙動を修正しました。
- 2018/03/03 バージョン0.9.0を公開。
その他
このプラグインはいわゆる野良プラグインです。
ですが、一応のところ開発には極力WordPressの定める形を目指して万全を期して作成をしています。
ただし、アップデートについてはサードパーティ製のライブラリ「Plugin Update Checker Library」を利用しています。
※このブログで後発で作成したプラグインとは互換性はありません。
**********
プラグインのダッシュボード([サイト内検索]メニュー)より。
Simplicity Add Fields Search Engine Ver 0.9.7
このプラグインは有効にした後、すぐに機能を利用できます。(ただし、基本的にはテーマ制作者向けに作っています。)
サイトで物件や商品などの検索を行う際に、それらのカスタムフィールドの情報を検索に含めるようにします。
このプラグインから行われる検索は、デフォルト設定では検索テンプレートのメインループを直接変更しません。
その場合、プラグインを利用して表示される検索テンプレートを作るのは * あなた * です。
メインループを変更して検索ページを表示する場合は、「サイト内検索設定」より「ループモード」を「メインループを書き換え」に設定して下さい。
「メインループを書き換え」に設定している場合、テーマのテンプレートの編集は必要ありません。
使い方
その後、ウィジェットやショートコードで検索フォームを表示します。
[safse_search]
以下の設定は「ループモード」が「WP_Query(従来のモード)」に設定されている場合に行います。
「メインループを書き換え」に設定している場合、この作業は不要です。
親テーマ、または子テーマのsearch.phpを編集します。以下のような形になるようにして下さい。
<?php get_header(); ?> <?php if( safse_is_search() ) : // Simplicity Add Fields Search Engineのループ $safse_query = safse_get_query(); // プラグインで生成するオブジェクト safse_sort_select(); // ソートのセレクトボックスの関数 if ( $safse_query->have_posts() ) : while ( $safse_query->have_posts() ): $safse_query->the_post(); // -------------------- endwhile; endif; else : // search.php本来のループ if ( have_posts() ) : while ( have_posts() ): the_post(); // -------------------- endwhile; endif; endif; ?> <?php get_footer(); ?>
プラグインの仕様
以下は利用可能な関数、ウィジェットとショートコードの仕様です。
検索(Simplicity Add Fields Search Engine) | ウィジェット | タイトル ウィジェットのタイトルを入力します。テーマ上のPHPファイル テンプレートのファイル名を入力します。利用中のテーマ以下のパスとファイル名のパスを指定して下さい。 |
---|---|---|
[safse_search] | ショートコード | 検索フォームテンプレートを[safse_search templatefile=”xxxx.php”]のような形で指定します。 |
safse_add_param( $inc_term_checkbox, $inc_sort_hidden, $inc_sort_select, $inc_keyword_method_user ); | 関数 | 検索パラメータを読み込みます。 引数を付けた場合はオプションの設定を無視します。$inc_term_checkboxでタームのチェックボックスを表示するか指定します。’yes’ か ‘no’で指定して下さい。 $inc_sort_hiddenでソートを引き継ぐかを指定します。’yes’ か ‘no’で指定して下さい。 $inc_sort_selectで検索フォームにソートのセレクトボックスを表示するか指定します。’yes’ か ‘no’で指定して下さい。 $inc_keyword_method_userで検索者側にAND/OR検索を任せるかどうか指定します。’yes’ か ‘no’で指定して下さい。この関数から出力される文字列は’safse_add_param’フィルターフックで変更可能です。 |
safse_sort_select( $script_append ); | 関数 | ソートのセレクトボックスを表示します。 検索ページ以降のソートの選択に利用できます。 ※$script_appendは関数の用途的にあまり意味を持たないパラメータだったため、形だけ残して削除しました。(ver 0.9.7以降)この関数から出力される文字列は’safse_sort_select’フィルターフックで変更可能です。 |
safse_is_search() | 関数 | Simplicity Add Fields Search Engineでの検索形式かどうかを判定します。 |
送信パラメータ
Simplicity Add Fields Search Engineは以下の送信パラメータを持ちます。
mode | Simplicity Add Fields Search Engineでの検索モードです。 |
---|---|
sort | ソートの指定です。ソート条件(例:post_title)とソート順序(asc、またはdesc)をカンマ区切りで指定します。 |
tid[] | タームIDを指定します。配列形式のフォーマットです。 |
pt[] | 隠し機能です。検索結果に表示する投稿タイプを強制的にここで指定したものに書き換えます。 |
fp[] | 隠し機能です。検索結果に表示するカスタムフィールドのプリフィックスを強制的にここで指定したものに書き換えます。 |
btax | 隠し機能です。検索結果に表示するタクソノミー同士の論理演算子を強制的にここで指定したものに書き換えます。「and」または「or」を設定できます。 |
bterm[XXX] | 隠し機能です。検索結果に表示するタクソノミー内のターム同士の論理演算子を強制的にここで指定したものに書き換えます。XXXの部分にはタクソノミーのスラッグが入ります。「in」または「notin」または「and」を設定できます。 |
kmeth | 隠し機能です。検索結果に表示するキーワードの検索方式の論理演算子を強制的にここで指定したものに書き換えます。「and」または「or」を設定できます。 |
出力されるファイルについて
Simplicity Add Fields Search Engineは「サイト内検索の設定」で「プラグインの検索フォームテンプレートをテーマに書き出す」を「はい」にして保存するとsearchform-safse.phpをお使いのテーマ側に書き出します。(ファイルが存在しない場合のみ)
ウィジェットやショートコードで検索フォームを指定する場合、ご活用下さい。
HTMLのハードコーディング
検索結果は全てSimplicity Add Fields Search Engineの送信パラメータを元に生成されます。
そのため、検索フォームはHTMLのハードコーディングでも行うことができます。
<form method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>"> <input type="text" placeholder="<?php echo _e( 'Search', 'safse' ); ?>" value="<?php echo esc_html( get_search_query() ); ?>" name="s" /> <?php echo safse_get_mode(); ?> <input type="hidden" name="pt[]" value="post" /> <input type="hidden" name="pt[]" value="page" /> <input type="hidden" name="btax" value="or" /> <input type="hidden" name="bterm[category]" value="in" /> <input type="hidden" name="sort" value="post_date,desc" /> <input type="radio" name="kmeth" value="and"<?php echo 'and' == $_GET['kmeth'] ? ' checked="checked"' : ''; ?> /> AND <input type="radio" name="kmeth" value="or"<?php echo 'or' == $_GET['kmeth'] ? ' checked="checked"' : ''; ?> /> OR <select name="sort" class="safse-sort-select"> <option value="post_date,desc"><?php _e( 'Post Date - Descending', 'safse' ); ?></option> <option value="post_date,asc"><?php _e( 'Post Date - Ascending', 'safse' ); ?></option> </select> <label class="safse-term-label"><input type="checkbox" name="tid[]" value="1" class="safse-term-checkbox" /><?php _e( 'Category1', 'safse' ); ?></label> <label class="safse-term-label"><input type="checkbox" name="tid[]" value="2" class="safse-term-checkbox" /><?php _e( 'Category2', 'safse' ); ?></label> <label class="safse-term-label"><input type="checkbox" name="tid[]" value="3" class="safse-term-checkbox" /><?php _e( 'Category3', 'safse' ); ?></label> <button type="submit" class="search-submit"><?php echo _e( 'Search', 'safse' ); ?></button> </form>
**********