WordPressの検索結果から特定のページを除外する方法

WordPressの検索機能で、固定ページやカスタム投稿など特定のページを検索結果から除外する方法の備忘録です。
今回のコードは、検索結果を表示するテンプレートファイル「search.php」で作成したページでの使用を前提としています。
WordPressのテンプレートファイル「searchform.php」と「search.php」を使用した、検索フォームの作り方は下記の記事で紹介しています。
指定したページを除外する
指定した特定の投稿や固定ページを検索結果から除外する方法です。
WordPressのテンプレートファイル「functions.php」に以下のコードを追記します。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post__not_in', array( 13 ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
「functions.php」にエラーがあるとWebサイトが表示できなくなる可能性があるため、編集する際はバックアップを取るなど十分に注意してください。
if文の条件分岐でサイト内検索でのみ動作するように設定しています。$query->set()
に'post__not_in'
でarray
配列に設定したIDのページを検索結果から除外します。
上記のサンプルコードでは、IDが「13」のページが除外されます。
各ページのIDは管理画面のURLから確認できます。

ページの編集画面のURLに表示されている「..?post=89」の「89」がそのページのIDです。
特定の複数ページを除外する
複数のページを除外したい場合は、array
配列内にカンマ区切りで設定します。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post__not_in', array( 13, 24, 32 ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
上記のサンプルコードでは、IDが「13」「24」「32」の3ページが検索結果から除外されます。
特定のカテゴリーを除外する
指定した特定のカテゴリーに含まれるページを検索結果から除外する方法です。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'category__not_in', array( 1 ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
$query->set()
に'category__not_in'
でarray
配列に設定したIDのカテゴリーに含まれるページを検索結果から除外します。
カテゴリーのIDは、一覧から遷移したカテゴリーの詳細ページのURLから確認できます。

URLに表示されている「&tag_ID=5」の「5」がそのカテゴリーのIDです。
複数のカテゴリーを除外したい場合は、カンマ区切りでIDを設定します。
$query->set( 'category__not_in', array( 4, 12 ) );
上記のサンプルでは、IDが「4」「12」のカテゴリーに含まれる記事が検索結果から除外されます。
投稿ページ以外を除外する
投稿ページ以外のページを検索結果から除外する方法です。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post_type', 'post' );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
$query->set()
に'post_type'
で「post」を設定することで、投稿ページだけが検索の対象になり、他のページが検索結果から除外されます。
固定ページ以外を除外する
固定ページ以外のページを検索結果から除外する方法です。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post_type', 'page' );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
$query->set()
に'post_type'
で「page」を設定することで、固定ページだけが検索の対象になり、他のページが検索結果から除外されます。
カスタム投稿以外を除外する
特定のカスタム投稿タイプに含まれるページ以外を検索結果から除外する方法です。
表示するカスタム投稿タイプのタクソノミー名をコードに記入します。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post_type', 'stores' );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
上記のサンプルでは、$query->set()
に'post_type'
で「stores」を設定することで、「stores」タクソノミーを含むカスタム投稿以外のページが検索結果から除外されます。
カスタム投稿のみ除外する
特定のカスタム投稿タイプに含まれるページのみ検索結果から除外する方法です。
function search_pre_get_posts( $query ) {
if ( $query->is_search && $query->is_main_query() && !is_admin() ){
$query->set( 'post_type', array( 'post', 'page' ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );
$query->set()
の'post_type'
にarray
配列で「post」と「page」を設定することで、投稿と固定ページだけが検索の対象になり、カスタム投稿タイプのページが検索結果から除外されます。
カスタム投稿タイプを追加設定する
一部のカスタム投稿タイプも検索結果に含めたい場合は、配列にタクソノミー名を追加します。
$query->set( 'post_type', array( 'post', 'page', 'stores' ) );
上記のサンプルでは、投稿と固定ページに加え「stores」タクソノミーを含むカスタム投稿以外のページが検索結果の対象となります。