WordPress で構築したサイトで、基本機能の[サイト内検索]を使ったとき、検索結果から「固定ページ」を除外する方法を紹介します。
コレ、かなり需要があるテクニックなんですよね。
いくつか方法がありますが、今回提案する方法は3つ。
「query_posts」を使う方法と、「input type=”hidden”」を使う方法、「functions.php」を使う方法です。
1.「query_posts」を使う方法
デフォルトの仕様では検索結果に「投稿」だけでなく「固定ページ」も表示されるようになっています。そこで、ループ処理の直前で[query_posts]を使い、検索結果から「投稿」のみを表示するように設定します。
通常、テンプレートの「search.php」などで、ループ処理は以下のように記述されていると思います。
<?php if (have_posts()) : ?> <ul> <?php while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <?php endwhile; ?> </ul> <?php endif; ?>
このコードの前に[query_posts]の処理を挿入します。
<?php // 検索結果からページを除外 global $query_string; query_posts($query_string . "&post_type=post"); ?> <?php if (have_posts()) : ?> <ul> <?php while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> <?php endwhile; ?> </ul> <?php endif; ?> <?php wp_reset_query(); ?>
このように、「post_type=post」と指定することで「投稿」のみを表示させることができます。
ちなみに「post_type」で指定できる引数には、他に以下のようなものがあります。
- any
- 初期値。リビジョン以外の投稿タイプを取得
- post
- 投稿
- page
- ページ
- attachment
- 添付ファイル
- revision
- 変更履歴
注意点として、「query_posts」を使うときは、ループ処理の最後に必ず「<?php wp_reset_query(); ?>
」と記述してクエリーをリセットしましょう。
2.「input type=”hidden”」を使う方法
続いて紹介するのは、検索フォームの中に「input type=”hidden”」という隠し要素を埋め込んでしまう方法です。
ループ処理を弄らずに解決できるので、もしかするとコチラのほうがスマートかもしれません。
やり方は簡単で、検索フォームを以下のように書き換えるだけで済みます。
<form method="get" action="<?php bloginfo('url'); ?>"> <input type="hidden" name="post_type[]" value="post"> <input name="s" id="s" type="text"> <input id="submit" type="submit" value="検索"> </form>
検索結果に含めたい「post_type」を「value」要素で指定しています。
デメリットとしてはURLに「&post_type」と表示されてしまうことでしょうか。
3.「functions.php」を使う方法
「検索結果に固定ページを含めない」ために、他の代替案として[functions.php]で処理を行う方法もあります。
function mySearchFilter($query) { if ( !is_admin() && $query->is_main_query() && $query -> is_search() ) { $query->set( 'post_type', 'post' ); } } add_action( 'pre_get_posts','mySearchFilter' );
この[functions.php]に記述する方法もオススメですが、個人的には「search.php」内で完結できる「1」の方法で解決したほうがいいように思います。
以上、参考になれば幸いです。