WordPressでサイト内検索を実行する際、プラグインなどを入れていない状態だとタイトルと本文(content)から検索することになります。
商品カタログ的なサイトの場合、タイトルのみを対象としてよりシビアな結果を返したい場合もあるでしょう。
ADs
一番簡単な検索フォームは以下のとおりです。これにタイトルのみ検索するという機能を追加したいと思います。
1 2 3 4 |
<form action="./" method="get"> <input type="text" name="s" /> <input type="submit" value="検索" /> </form> |
検索キーワードのみを渡してもタイトルのみか全文検索なのかが判断できませんので、name="target"で値を渡して判定しようと思います。
1 2 3 4 5 6 |
<form action="./" method="get"> <input type="text" name="s" /> <input type="submit" value="検索" /> <input type="text" name="target" value="title" />タイトルのみ <input type="text" name="target" value="all" />全文 </form> |
ここからが本題なのですが、上記のname="target"の値を元にタイトルのみの検索かそうでないかを判定します。
まずは「target」というクエリは本来WordPressが持っていませんので、それを追加します。
1 2 3 4 |
function add_query_vars( $public_query_vars ) { return array_merge( $public_query_vars, array('target')); } add_filter( 'query_vars', 'add_query_vars' ); |
次に、検索実行時に対象をタイトルのみとするアクションフックを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
function custom_search($search, $wp_query){ //var_dumpで結果を出力してみると分かりやすい //var_dump($search); //検索じゃなかったらそのままリターン if (!$wp_query->is_search){ return; } //上記のadd_query_varsでクエリを追加しているので、getで取れる //get_query_var('target');でも同様です。 $target = $wp_query->get('target'); $s = $wp_query->get('s'); //検索時に発行されるSQLを置換 if($target == 'title'){ $temp = explode(' ',$s); foreach($temp as $val){ $search = str_replace(" OR (wp_posts.post_content LIKE '%".$val."%')",'',$search); } } //全文検索の時(今回は何もしないのでそのままreturn) if($target == 'all'){ return; } return $search; } add_filter('posts_search','custom_search', 10, 2); |
上記の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など検索結果に手を入れるプラグインを導入している場合は上記結果と異なる場合があるかもしれません(未検証)。適宜確認しながら実装してみてください。
ADs
コメントはまだありません。