このページの本文へ移動

blog

program

1行書くだけ!WordPressで検索ボックスを複数設置して投稿タイプごとに検索する方法

WordPressの構築時に少し苦戦しました。
というのも、インバウンドとヒルメシマエ、両方のサイドナビにそれぞれの検索ボックスを設置すべし! という代表からのお達しがあったのです。

ご存知の通りWordPressの検索ボックスは「searchform.php」を読み込めば表示されるものが1つ準備されているのみ……。
検索結果ページについても、search-post.phpのようなテンプレートは残念ながら準備されていません。

これはちょっと厳しいんじゃないか、なんて思って調べてみたら、ありました。get_search_formにしっかりと。
いやぁ~知らんかったぁ~

唐突に回答コード

<form role="search" method="get" action="<?php bloginfo('url'); ?>">
	<input type="text" name="s" id="s" value="" placeholder="検索">
	<input type="hidden" value="post" name="post_type" id="post_type">
	<input type="submit" value="検索">
</form>

3行目に注目です。
なんと、hiddenフィールドで投稿タイプを指定するだけでOKなんですね。

この「投稿タイプを指定するだけ」というのがミソで、

  1. value属性とname属性の値が検索結果URLのクエリパラメータに渡される
  2. パラメータがWP_Queryのpost_typeオプション値に渡される

という段階を経て検索されるため、「post」を指定しても固定ページは含まれないし、カスタム投稿タイプにも対応できるという親切設計。
なんて優しいんだWordPress!

記述を1回で済ませる

上記のコードのままでは投稿タイプの数だけvalue属性の値を変えた検索ボックスのソースを記述する必要がありますが、
下記のコードをsearchform.phpに書いておけば使いまわしが利きます。

//searchform.phpとして保存
<form role="search" method="get" action="<?php bloginfo('url'); ?>">
	<input type="text" name="s" id="s" value="" placeholder="検索">
	<input type="hidden" value="<?php echo get_post_type(); ?>" name="post_type" id="post_type">
	<input type="submit" value="検索">
</form>

get_post_type()」は、現在表示されているページの投稿タイプを取得します。