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なんですね。
この「投稿タイプを指定するだけ」というのがミソで、
- value属性とname属性の値が検索結果URLのクエリパラメータに渡される
- パラメータが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()」は、現在表示されているページの投稿タイプを取得します。