WordPressプラグイン「Search Everything」を使ってキーワード検索をカスタマイズ

WordPressプラグイン「Search Everything」を使ってキーワード検索をカスタマイズ

WordPressのキーワード検索機能について

WordPressのデフォルトのキーワード検索機能は、投稿記事のタイトルと本文を対象として検索しているようです。ちなみにキーワードはスペースで区切ると複数検索が出来ます。
(例:「カフェ ドーナツ」→「カフェ+ドーナツ」で複数検索)

キーワード検索した際にURLに付いてくるパラメータをみれば分かりやすいと思います。

http://hogehoge.com/?s=カフェ+ドーナツ

複数キーワード検索で気を付けておきたい点としては、プラグインの「WP Multibyte Patch」が有効化していないと全角スペースを使った場合キーワードを区切ってくれません。全角スペースを含めた一つのキーワードとして検索します。
(例:「カフェ ドーナツ」で一つのキーワードとして検索してしまう)

あとデフォルトの検索機能はAND検索であるという点も抑えておきたいところです。「カフェ+ドーナツ」で検索した場合、ヒットさせるには「カフェ」と「ドーナツ」どちらのキーワードもタイトルか本文に含む必要があります。

まずはカスタムフィールドも検索範囲に含めたい

さて、WordPressがタイトルと本文を検索してくれるのは分かりますが、カスタムフィールドは???残念ながらデフォルトでは検索範囲に含んでおりません。

functions.phpにコードを加えてカスタムフィールドを検索範囲に含める方法がありましたが、とある案件でREST APIを使うとうまく機能せず、いろいろと試したところ「Search Everything」を使うと簡単にカスタムフィールドを検索範囲に含めることが出来ました。

プラグインをインストールして有効化にし、設定画面から「すべてのカスタムフィールドを検索」にチェックをして保存するだけですので簡単です。しかしWordPressはデフォルトではAND検索です。このプラグインにANDとORの切り替え機能まで入っていれば万々歳でしたが、そこまで世の中あまくありませんでした。

他の手段も模索しましたが、REST APIを使った検索でカスタムフィールド含めてといった情報が乏しく「Search Everything」をカスタマイズすることを決意しました。

「Search Everything」のAND検索をOR検索に

こちらのブログで「Search Everything」のカスタマイズが掲載されてましたので参考にさせていただきました。

プラグインのディレクトリの中にあるarchive-recipe.phpを変更します。

	// create the search meta data query
	function se_build_search_metadata() {
		global $wpdb;

			//省略

			foreach ( $search_terms as $term ) {
				$term = $wpdb->prepare("%s", $exact ? $term : "%$term%");
				if ( $this->wp_ver23 ) {
					$search .= "{$searchand}(m.meta_value LIKE $term)";
				} else {
					$search .= "{$searchand}(meta_value LIKE $term)";
				}
				//$searchand = ' AND ';
				$searchand = ' OR ';
			}

			//省略

		return $search;
	}

se_build_search_metadata関数の中にある「$searchand = ‘ AND ‘;」を「$searchand = ‘ OR ‘;」に変更でOK。

こうしてみると、あらかじめ変更しやすいようにコードを書いてくれているようです。

しかし、これだけではまだ完璧ではありませんでした。カスタムフィールドはOR検索になってるのですが、タイトルと本文に関してはAND検索で行っているようです。

コードを眺めてたらse_search_defaultという関数を見つけました。見るからに初期設定に関わってきそうなコードです。

function se_search_default(){
		global $wpdb;

		//省略してます。

			//$seperator = ' AND ';
			$seperator = ' OR ';
		}

		$search_sql_query .= ')';
		return $search_sql_query;
	}

「$seperator = ‘ AND ‘;」を「$seperator = ‘ OR ‘;」に変更して試したところ見事にタイトルと本文もOR検索になりました。

これでようやくREST APTで複数キーワードを使ってタイトルと本文とカスタムフィールドからOR検索することが出来ました。