中級者~上級者向け

【有用】特定のページを検索結果から除外する方法

文中の説明画像をクリックすると拡大します。

LINEで送る
Pocket

WordPressのサイト内検索で、特定のページを検索対象外にしたい

WordPressには、サイト内検索の機能があります。これはGoogleやYahooなどとは異なり、運営しているWebサイト内のページを検索対象とした機能です。

WordPressのサイト内検索は、検索におけるメインループを利用して検索結果を表示させています。

ところで、検索結果から一覧を表示するとき、除外したいページがあるかも知れません。

例えば、固定ページであれば、お問い合わせフォームのページや、送信内容確認画面、送信完了画面(サンクスページ)、そして、キャンペーンなどで一時的に公開したランディングページなどです。

検索結果を表示させるメインループを改変することで、検索結果一覧から特定のページを除外することができます。

具体的には、以下の2つの方法があります。

  1. functions.phpを編集する方法
  2. プラグインを使う方法(※初心者の方はこちらをお勧めします

WordPressのループについては、以下の記事をご確認ください。

【知識】WordPressループって何?どうやってどう使うの?

functions.phpを編集して、特定のページを検索対象外とする方法

functions.phpの編集は、自作テーマ(オリジナルテーマ)のときか、既存のテーマでは子テーマを使って行なう

まず、functions.phpを編集してメインループを改変して特定の投稿や固定ページを検索対象外とする方法を紹介します。

この方法は、市販のテーマや公式ディレクトリからダウンロードしたテーマではなく、自作のテーマを使用している場合にのみ推奨できる方法です。

なぜなら、市販のテーマや公式ディレクトリのテーマは、テーマのバージョンアップに伴って、編集されたfunctions.phpが上書きされてしまう可能性があるからです。

ただし、市販のテーマや公式ディレクトリから入手したテーマに対して子テーマを作って、その中にあるfunctions.phpを編集する分には問題ありません

子テーマについて、詳しくはこちらをご覧ください。

【基本】WordPressの親テーマと子テーマって何?

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のリストです。

投稿や固定ページの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」を使うと特定のページを簡単に検索結果から除外できる。
LINEで送る
Pocket