カスタムフィールドの検索に対応してみたWordPressプラグイン「Simplicity Add Fields Search Engine」

カスタムフィールドの検索に対応してみた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)のテンプレートファイルを編集することもできます。(この場合、編集形態は親テーマ・子テーマは問いません。)

 

この辺りに関しては、プラグインのダッシュボード([サイト内検索]メニュー)に書いている説明書を読んでいただければ、どの程度の変更になるのかがわかると思います。(このページの少し下にもその内容の抜粋があります。)

 

search.phpに設置後、検索条件、取得する投稿タイプ、ソートのセレクトボックスに表示する項目などは管理画面の[サイト内検索の設定]のオプション値より変更可能です。

 

以下の画像は、Simplicity Add Fields Search Engineのサイト内検索の設定画面の一部です。(Ver 0.9.0時点)

 

 

利用・再配布・改変等はご自由にどうぞ。

でも、それに伴うトラブルには腐れコーダーのcattlemuteは一切関与しません。自己責任でお願いします。

あと、プラグインの著作権は放棄していません。プラグイン内での著作権の明記を守っていただければ幸いです。

 

ダウンロードはこちらから

 

アップロード方法は[プラグイン] > [新規追加] > [プラグインのアップロード]より、ダウンロードしたZIPファイルをそのままアップロードして下さい。

その後、通常通りプラグインを有効化して、プラグインのダッシュボード([サイト内検索]メニュー)の手順で設定することで先に触れた内容のサイト内検索が実装可能です。

 

プラグインの更新履歴

  • 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

 

このプラグインは有効にした後、すぐに機能を利用できます。(ただし、基本的にはテーマ制作者向けに作っています。)

サイトで物件や商品などの検索を行う際に、それらのカスタムフィールドの情報を検索に含めるようにします。
このプラグインから行われる検索は、デフォルト設定では検索テンプレートのメインループを直接変更しません。
その場合、プラグインを利用して表示される検索テンプレートを作るのは * あなた * です。
メインループを変更して検索ページを表示する場合は、「サイト内検索設定」より「ループモード」を「メインループを書き換え」に設定して下さい。
「メインループを書き換え」に設定している場合、テーマのテンプレートの編集は必要ありません。

 

使い方

 

その後、ウィジェットやショートコードで検索フォームを表示します。

 

[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_term_checkboxでタームのチェックボックスを表示するか指定します。’yes’ か ‘no’で指定して下さい。
$inc_sort_hiddenでソートを引き継ぐかを指定します。’yes’ か ‘no’で指定して下さい。
$inc_sort_selectで検索フォームにソートのセレクトボックスを表示するか指定します。’yes’ か ‘no’で指定して下さい。
safse_is_search() 関数 Simplicity Add Fields Search Engineでの検索形式かどうかを判定します。
safse_sort_select( $script_append ); 関数 ソートのセレクトボックスを表示します。
$script_appendで、ソートのセレクトボックスを選択した後でページを遷移するかを指定します。’yes’ か ‘no’で指定して下さい。

 

送信パラメータ

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」を設定できます。

 

出力されるファイルについて

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" />
	<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>

 

**********