【開発方法】WordPressに簡単に全文検索を導入する!

WordPressのフリーワード検索機能を使ったことはありますか?
ブログを運営しているときなど、 簡単に記事を検索できる機能として非常に重宝します。

今日はそんなWordPressの検索機能を、
ちょっとした手間で非常に便利に作り替える方法をご紹介します!

標準検索機能の不便なところ

WordPressのフリーワード検索機能は、 投稿や固定ページの「タイトル」「本文」の中から、
文字列が存在するかをチェックして検索するだけで、 実はあまり複雑な検索ができません。

例えばカスタムフィールドなどで、 不動産情報やスタッフ紹介のようなコンテンツを作り、
カスタムフィールドで物件の詳細やスタッフのプロフィールを入れても、
WordPressのフリーワード検索機能では、 カスタムフィールドの中を検索してくれないのです。

プラグインで解決?

最近ではノーコードで、いろいろな条件を組み合わせて、
複雑な検索を実装するためのプラグインが発表されています。

ただ、どれもライセンスを購入する費用が発生したり、
単純なフリーワード検索で対応するというよりも、
複雑な検索条件を組み合わせた検索機能を実装するものが多いです。

単純なフリーワード検索の実装だけであれば、
わざわざプラグインを購入するような必要はありません!

フリーワード検索を改造しよう!

早速フリーワード検索を改造して、
カスタムフィールドやカテゴリ、タグの名前などに対応し、
より便利な機能に作り替えてみましょう。

投稿の保存時に検索キーワードを生成する

WordPressでは検索時に「タイトル」と「本文」を検索する、
というのは標準機能なのですが、 それ以外のフィールドもちゃんと検索できるように、
まずは検索するためだけのカスタムフィールドを1個作成して、
そこに検索したい情報が保存されるように対応します。

これには、WordPressのアクションフックという機能を利用します。
ここからはコードを書いていきますね。

以下のようなコードをfunctions.phpに追記します。
カスタムフィールドの名前のところなどは、含めたいフィールド名などに、
適宜変更して対応してください。

add_action( 'save_post', function( $post_id, $post, $update ) {
	// 投稿が公開状態以外、またはpost以外は対応しない
	if ( $post->post_status !== 'publish' || $post->post_type !== 'post' ) {
		return;
	}

	// タイトルを取得
	$keywords[] = $post->post_title;
	// 本文を取得
	$keywords[] = $post->post_content;
	
	// カテゴリーを全て取得
	$categories = get_the_terms( $post->ID, 'category' );
	// タグを全て取得
	$post_tags  = get_the_terms( $post->ID, 'post_tag' );

	if ( $categories ) {
		// カテゴリーの名前をキーワードに追加
		$keywords = array_merge( $keywords, wp_list_pluck( $categories, 'name' ) );
	} 

	if ( $post_tags ) {
		// タグの名前をキーワードに追加
		$keywords = array_merge( $keywords, wp_list_pluck( $post_tags, 'name' ) );
	} 

	// 検索に含めたいカスタムフィールドを取得1
	$keywords[] = get_post_meta( $post->ID, 'some_field_1' );
	// 検索に含めたいカスタムフィールドを取得2
	$keywords[] = get_post_meta( $post->ID, 'some_field_2' );
	// キーワードを掃除
	$keywords = array_filter( array_unique( $keywords ) );

	// カスタムフィールドにキーワードを保存
	update_post_meta( '_keywords', implode( ' ', $keywords ), true );
}, 10, 3 ); 

検索時に追加したカスタムフィールドを参照するように

さらに検索時の動きを改良するコードをfunctions.phpに追加しましょう。

以下のコードで、検索時に先ほど追加したカスタムフィールドを検索し、
そちらの内容で記事を絞り込んでくれるようにしています。

add_action( 'pre_get_posts', function( $the_query ) {
	if ( $the_query->is_main_query() && $the_query->is_search() ) {
		$query = get_search_query( false );

		$the_query->set( 'meta_query', [
			[
				'key'   => '_keyword',
				'value' => $query,
				'compare'  => 'LIKE'
			]
		] );
	}
}

手軽に実装できるフリーワード検索

いかがだったでしょうか?

上記のようなシンプルなコードをいくつか追加するだけで、
手軽にWordPressの標準機能であるフリーワード検索を、 高機能な検索に作り替えることができます。

ただ、上記のコードではコードを追加してから、
投稿した記事だけが対象になってしまうため、 それ以前の記事などが対象に含まれなくなってしまいます。

次回、こちらを改良するために、
WordPressでバッチ処理を実装する方法について、
詳しく紹介をしていきたいと思います!

この記事を書いた人

家富正幸

インスパイアデザインの取締役兼、エンジニア。WordPressのテーマ・プラグイン開発を年間100件以上、独自のフレームワークを用いて開発をしています。