文中の説明画像をクリックすると拡大します。
WordPressのサイト内検索で、特定のページを検索対象外にしたい
WordPressには、サイト内検索の機能があります。これはGoogleやYahooなどとは異なり、運営しているWebサイト内のページを検索対象とした機能です。
WordPressのサイト内検索は、検索におけるメインループを利用して検索結果を表示させています。
ところで、検索結果から一覧を表示するとき、除外したいページがあるかも知れません。
例えば、固定ページであれば、お問い合わせフォームのページや、送信内容確認画面、送信完了画面(サンクスページ)、そして、キャンペーンなどで一時的に公開したランディングページなどです。
検索結果を表示させるメインループを改変することで、検索結果一覧から特定のページを除外することができます。
具体的には、以下の2つの方法があります。
- functions.phpを編集する方法
- プラグインを使う方法(※初級者の方はこちらをお勧めします)
WordPressのループについては、以下の記事をご確認ください。

functions.phpを編集して、特定のページを検索対象外とする方法
functions.phpの編集は、自作テーマ(オリジナルテーマ)のときか、既存のテーマでは子テーマを使って行なう
まず、functions.phpを編集してメインループを改変して特定の投稿や固定ページを検索対象外とする方法を紹介します。
この方法は、市販のテーマや公式ディレクトリからダウンロードしたテーマではなく、自作のテーマを使用している場合にのみ推奨できる方法です。
なぜなら、市販のテーマや公式ディレクトリのテーマは、テーマのバージョンアップに伴って、編集されたfunctions.phpが上書きされてしまう可能性があるからです。
ただし、市販のテーマや公式ディレクトリから入手したテーマに対して子テーマを作って、その中にあるfunctions.phpを編集する分には問題ありません。
子テーマについて、詳しくはこちらをご覧ください。

functions.phpについては、詳しくはこちらをご覧ください。

それでは、functions.phpの編集方法です。
メインクエリーを改変するためには、WordPressのアクションフックという機能を使います。
アクションフックとは、WordPressにもともと存在している機能に対して、開発者のオリジナルの機能を割り込ませるような機能です。
メインクエリーの改変は「pre_get_posts」というアクションフックを利用します。
functions.phpに記述する具体的なコードは、以下の通りです。
IDを指定して除外する方法
【PHP】
function search_pre_get_posts( $query ) { if ( $query->is_search && !is_admin() ){ $query->set( 'post__not_in', array(111,222,333) ); } return $query; } add_action( 'pre_get_posts', 'search_pre_get_posts' );
functions.phpに記述するコードの例です。
ポイントは「$query->set」で始まる箇所です。
$query->set( 'post__not_in', array(111,222,333) );
の行に記述されている「111,222,333」の箇所が、検索対象外としたい投稿ページや固定ページのIDのリストです。
アクションフック「pre_get_posts」はサイト全体に影響するので注意が必要です。
ここでは、if ( $query->is_search && !is_admin() ) の部分でこのコードが実行される場面を制限しています。
投稿や固定ページのIDについては、WordPressの標準の機能でデフォルトでは明示的に表示させる方法はありません。
しかし、投稿や固定ページを編集するページをブラウザで開いて、アドレスバーを見るとIDっぽい数字が書かれている箇所があります。
例えば、「マークップ:画像の配置」というページのIDはブラウザのアドレスバーから「1177」であることがわかります。
あるいは、「投稿一覧」などから該当の「投稿名」をマウスオーバーすると、画面下に同様のIDっぽい数字を含んだコードが表示されます。
functions.phpに記載するIDは、このように取得します。
ちなみに、検索結果から特定のカテゴリーに所属する記事を除外する方法も、同じように設定できます。
カテゴリーのIDを取得する方法は、管理画面から「投稿」→「カテゴリー」を開き、IDを調べたいカテゴリーをクリックして、「カテゴリーの編集」を開きます。
上記の画像のように、「投稿フォーマット」というカテゴリーには「51」というIDが割り振られていることがわかります。
あとは、先ほどと同じようにすればいいのですが、カテゴリーの場合はパラメーターの設定の仕方が少し異なります。
【PHP】
function search_pre_get_posts( $query ) { if ( $query->is_search && !is_admin() ){ $query->set('category__not_in', array(51)); } return $query; } add_action( 'pre_get_posts', 'search_pre_get_posts' );
カテゴリーID「51」に所属している記事を検索結果から除外する設定が、上記の記述です。
カテゴリーの時のコードは、以下のように「category__not_in」というパラメーターに、カテゴリーIDの数字を渡しています。
$query->set('category__not_in', array(51));
ここまで紹介したメインループの改変は、組み合わせて設定することもできます。
例えば、「カテゴリーIDが30のものと、投稿のIDが50のものを検索結果から除外する」というコードは以下の通りです。
【PHP】
function search_pre_get_posts( $query ) { if ( $query->is_search && !is_admin() ){ $query->set('category__not_in', array(30)); $query->set( 'post__not_in', array(50) ); } return $query; } add_action( 'pre_get_posts', 'search_pre_get_posts' );
ここまで紹介したコードをfunctions.phpに記述することで、検索結果から特定のページや特定のカテゴリーに所属する記事や固定ページを除外できます。
スラッグを指定して除外する方法
投稿や固定ページのIDではなく、スラッグを指定して検索対象から除外させることも可能です。
この場合は、スラッグからIDを求めて、そのIDに対してメインループを改変します。
具体的なコードは以下の通りです。
function search_pre_get_posts( $query ) { if ( $query->is_search && !is_admin() ){ // 投稿のスラッグから検索結果を除外する $post_slug = "post_slug1"; // ←ここに投稿のスラッグを入れる $post_id = get_page_by_path($post_slug, "OBJECT", "post"); $post_id = $post_id->ID; // 固定ページのスラッグから検索結果を除外する $page_slug = "page_slug1"; // ←ここに固定ページのスラッグを入れる $page_id = get_page_by_path($page_slug); $page_id = $page_id->ID; // 検索結果から除外する(投稿と固定ページの2つの場合) $query->set('post__not_in', array($post_id ,$page_id)); } return $query; } add_action( 'pre_get_posts', 'search_pre_get_posts' );
投稿の場合は、「$post_slug」に投稿のスラッグを設定して「$post_id」にスラッグに対応した投稿のIDが設定されます。
固定ページの場合は、「$page_slug」に固定ページのスラッグを設定して「$page_id」に固定ページのIDが設定されます。
そして、求められたIDに対して「$query->set」をします。
プラグイン「Search Exclude」で特定のページを検索結果から除外する
プラグインを使って特定のページを検索結果から除外する方法を、紹介します。
この方法は、いちいちIDを調べたり、functions.phpを編集したりする必要がなく、さらに管理画面上で直感的に操作できるため、おすすめの方法です。
使用するプラグインは、「Search Exclude」です。このプラグインは、WordPressのプラグイン新規追加画面よりインストールできます。
プラグインをインストールしたら、有効化しましょう。
このプラグインを導入すると、投稿や固定ページの編集画面に、「Search Exclude」というボックスが表示され、中に「Exclude from Search Results」というチェックボックスが表示されます。
編集中の投稿や固定ページを検索対象から除外したい場合は、チェックを入れて「公開」ボタンをクリックしましょう。
Search Excludeの機能で、プラグインの設定画面で、検索結果の対象外とした記事の一覧を確認できます。
検索対象外にしたけど、やはり検索対象に戻したい場合は、記事のタイトルの左にあるチェックボックスをオフにして「変更を保存」ボタンをクリックしましょう。
検索対象に戻された記事のタイトルが一覧から消えていることが、確認できるはずです。
まとめ
- WordPressの検索結果は、検索結果を表示させるメインループで制御されている。
- 検索結果から特定の投稿や固定ページを除外するには、functions.phpでメインループを書き換える必要がある。
- プラグイン「Search Exclude」を使うと特定のページを簡単に検索結果から除外できる。