検索時にタイトルのみを対象とする

WordPressでサイト内検索を実行する際、プラグインなどを入れていない状態だとタイトルと本文(content)から検索することになります。
商品カタログ的なサイトの場合、タイトルのみを対象としてよりシビアな結果を返したい場合もあるでしょう。

AD

基本の検索フォーム

一番簡単な検索フォームは以下のとおりです。これにタイトルのみ検索するという機能を追加したいと思います。

ラジオボタンでタイトルか全文かを選択する

検索キーワードのみを渡してもタイトルのみか全文検索なのかが判断できませんので、name="target"で値を渡して判定しようと思います。

フィルターフック・アクションフックの追加

ここからが本題なのですが、上記のname="target"の値を元にタイトルのみの検索かそうでないかを判定します。

まずは「target」というクエリは本来WordPressが持っていませんので、それを追加します。

次に、検索実行時に対象をタイトルのみとするアクションフックを追加します。

SQL文の置換について

上記のstr_replaceで置換している部分については、$searchを出力してみると分かりやすいです。
たとえば「篠崎愛」と検索したときの$searchをvar_dumpで出力した結果は以下のようになります。

[text]
string(96) " AND (((wp_posts.post_title LIKE '%篠崎愛%') OR (wp_posts.post_content LIKE '%篠崎愛%'))) "
[/text]

「篠崎 愛」を検索した場合は以下のようになります。スペースなしのときと結果が異なる(「篠崎」と「愛」のAND検索なので)点に注意が必要です。

[text]
string(171) " AND (((wp_posts.post_title LIKE '%篠崎%') OR (wp_posts.post_content LIKE '%篠崎%')) AND ((wp_posts.post_title LIKE '%愛%') OR (wp_posts.post_content LIKE '%愛%'))) "
[/text]

デフォルトではwp_posts.post_titleとwp_posts.post_contentを検索キーワードで検索していますので、このwp_posts.post_contentから検索している部分を消せばタイトルのみの検索が実現できることが予想できると思います。

そこで$searchから以下の文を取り除く(空文字で置換)することでタイトルのみの検索を実現しています。

[text]
//上記SQLから以下の箇所が取り除ければタイトル検索ができる!
OR (wp_posts.post_content LIKE '%検索キーワード%')
[/text]

Search Everythingなど検索結果に手を入れるプラグインを導入している場合は上記結果と異なる場合があるかもしれません(未検証)。適宜確認しながら実装してみてください。

AD

Share

Commentsコメント

メールアドレスは公開されません。コメントは必ずご入力ください。

HTMLタグは使用できません。ソースコードを書き込みたい場合はCodetterGistCodePenなどのご利用が便利です。

コメントはまだありません。