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」の方法で解決したほうがいいように思います。
以上、参考になれば幸いです。