WordPressの検索フォームは、テーマ側で用意しなくてもデフォルトが表示されるようになっている。もちろんカスタマイズも可能だ。
検索フォームのテンプレート
もし検索フォームのカスタマイズが必要であれば、テーマにsearchform.phpというテンプレートを用意すれば、こちらが優先して表示される。
TORIYAMAHONPOS WordPressのまめ知識
の記事
TORIYAMA Yuko
WordPressの検索フォームは、テーマ側で用意しなくてもデフォルトが表示されるようになっている。もちろんカスタマイズも可能だ。
もし検索フォームのカスタマイズが必要であれば、テーマにsearchform.phpというテンプレートを用意すれば、こちらが優先して表示される。
TORIYAMA Yuko
一覧の表示条件にキーワードを含めるとは、指定のキーワードでの検索結果つまり、
ブログのURL?s=キーワード
をやりたいのである。これを検索フォームを使わずに、query_posts()でやってみた。
[PHP]
query_posts(array(‘s’=>’キーワード’));
if (have_posts()){
while (have_posts()) : the_post();
// 処理
endwhile;
}
wp_reset_query();
[/PHP]
Codexには、query_posts()のパタメータとしてキーワードは記載されていないものの、検索フォームのパラメータであるsを使ってみたらうまくいった。あたりまえといえばあたりまえなのか、こんなことやる必要のある人がいないだけか。
TORIYAMA Yuko
日本語ページと英語ページに対応した企業サイトを作成した際に、検索フォームをそのまま使うと検索結果に日本語と英語が混在してしまい悩んだことがある。もちろん日本語ページで検索した場合には日本語のみ、英語ページでは英語のみの結果がヒットしなければならない。
検索フォームにhiddenパラメータを追加することで、検索範囲を絞ることができる。前述の企業サイトではデフォルトは日本語の記事で、英語の記事には”英語”というカテゴリをチェックする決まりにしていたので、検索範囲としてカテゴリを指定すればよいことが分かった。
具体的には、英語ページのみ対象としたい場合は検索フォームの中に以下を追加する。
[PHP]
term_id; ?>” name=”cat” />
[/PHP]
カテゴリ以外にも投稿タイプなどを指定することができる。例えばデフォルトでは記事とページが検索対象となっているので、記事のみ検索したい場合は、以下の指定になる。
[PHP]
[/PHP]
これらを組み合わせて指定することもできる。ただしこのように検索フォームに記述した場合は、GETパラメータとしてURLに見えてしまう。これが格好悪いとするなら、search.phpのループ前にquery_posts()で条件を加える方法もあるだろう。
検索結果をソートするには、通常query_posts()で”orderby”を指定する。
ただし指定できる項目は、投稿テーブル(wp-posts)のフィールドに限られる。
他の項目(カスタムフィールドや、カテゴリ順など)でソートした場合には、
フィルターフックでSQLに手を加えるとよい。
たとえばカテゴリのid順にソートした場合は、
[sourcecode language=’php’]
add_filter(‘posts_join’, ‘my_join’);
add_filter(‘posts_orderby’, ‘my_orderby’);
function my_join($query){
global $wpdb;
if(is_search()){
$query .= ” JOIN $wpdb->term_relationships AS tr ON tr.object_id=$wpdb->posts.ID JOIN $wpdb->term_taxonomy AS tt ON tt.term_taxonomy_id=tr.term_taxonomy_id JOIN $wpdb->terms AS t ON t.term_id=tt.term_id”;
}
return $query;
}
function my_orderby($query) {
global $wpdb;
if(is_search()){
$query = ” t.term_id DESC, $wpdb->posts.post_date DESC”;
}
return $query;
}
[/sourcecode]
独自に作成したテーブルを追加することも可能だ。ただしやりすぎと負荷がかかるので、様子を見ながら対応すること。