中級者~上級者向け 有用

【有用】WordPressサイト内検索で特定ページを結果から除外する

WordPressの知識
この記事は約22分で読めます。

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

Pocket

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

WordPressには、サイト内検索の機能があります。

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

テーマによって異なりますが、大半は右サイドバー(スマートフォン表示の場合はメインコンテンツの次のブロック)にあります。

閲覧者がサイト内のコンテンツを探すのに便利な機能ですが、サイト内のページには、検索結果に表示させたくない(除外したい)ものもあるでしょう。

例えば以下のようなページです。

  • お問い合わせの確認画面
  • お問い合わせの送信完了画面(サンクスページ)
  • 外部からのキャンペーンで用意したランディングページ

サイト内検索は、WordPressのサイトを表示させる仕組みのメインループを利用して実現していますので、メインループを改変することで、サイト内検索結果一覧から特定のページを除外することができます。

以下の2つの方法があります。

  1. プラグインを使う
  2. functions.phpを編集する

functions.phpの編集は、失敗するとサイトが表示されなくなるなどのリスクがあるため、扱いに慣れてない方はまずはプラグインを使う方法をおすすめします。

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

【知識】WordPressループって何?どうやってどう使うの?
WordPressにおけるループとは、WordPressの管理画面で作成したページのコンテンツ(投稿や固定ページ)の中身を呼び出すために使われ、メインループとサブループがあります。

 

プラグインで特定のページをサイト内検索結果から除外する

プラグインを使った方法です。

サイト内検索をカスタマイズできるプラグインは、いくつかあります。

その中で、サイト内検索結果から除外することに特化した「Search Exclude」と「Ultimate Category Excluder」の2つを紹介します。

  • Search Exclude:固定ページや投稿を個別に指定して除外する
  • Ultimate Category Excluder:カテゴリーを指定して除外する

これらのプラグインは、有効にしている間のみ機能を発揮して停止すると機能も止まることにご注意ください。

また、Search ExcludeとUltimate Category Excluderは、どちらも同じ部分に作用するプラグインのため、競合する可能性がありますので、使うのはどちらか一方にした方が安全でしょう。

プラグインについては、以下の記事をご確認ください。

【基本】WordPressのプラグインって何?
WordPressの「プラグイン」という機能は、インストールすることでさまざまな機能を追加・拡張して、サイトを使いやすくしたり、見た目を良くするためのものです。現在、プラグインは「機能性」「デザイン性」「セキュリティ」の3種が主流になってきています。

 

「Search Exclude」で固定ページや投稿、カスタム投稿タイプを個別に除外する方法

「Search Exclude」は、固定ページや投稿、カスタム投稿タイプごとにサイト内検索結果に表示するかどうかを設定することができるプラグインです。

プラグインをインストールし、有効化します。

 

「Search Exclude」のインストール、有効化

WordPress管理画面左にある「プラグイン」→「新規追加」を開き、右上にある「プラグインの検索…」のボックスに「Search Exclude」と入力します。

Search Excludeプラグインを見つけ、「今すぐインストール」をクリックします。

しばらく待つとインストールが完了するので、「有効化」をクリックするとSearch Excludeの有効化完了です。

 

「Search Exclude」の使い方

Search Excludeを有効化すると、固定ページや投稿、カスタム投稿タイプの編集画面の右に「Search Exclude」というエリアが追加されます。

そのエリアにある「Exclude from Search Results」にチェックを入れて、保存(更新)をすれば、その固定ページや投稿、カスタム投稿タイプはサイト内検索結果から除外されます。

除外設定をした固定ページや投稿は、Search Excludeの設定画面で確認できます。

WordPress管理画面左にある「設定」→「Search Exclude」をクリックすると、現在除外されている固定ページや投稿が一覧表示されます。

各ページタイトルの左にあるチェックボックスを外して「変更を保存」をクリックすると、サイト内検索から除外する設定が解除されます(サイト内検索結果に表示されるようになります)。

 

「Ultimate Category Excluder」でカテゴリー単位で除外する方法

「Ultimate Category Excluder」は、指定したカテゴリーに属している投稿をサイト内検索結果から除外することができるプラグインです。

ただし、当記事執筆時点で5カ月間更新されていないため、最新のWordPressに対応していなかったりセキュリティ面のケアが届いていないなどの可能性があることをご了承の上、自己判断にてご利用ください。

プラグインをインストールし、有効化します。

 

「Ultimate Category Excluder」のインストール、有効化

WordPress管理画面左にある「プラグイン」→「新規追加」を開き、右上にある「プラグインの検索…」のボックスに「Ultimate Category Excluder」と入力します。

Ultimate Category Excluderプラグインを見つけ、「今すぐインストール」をクリックします。

しばらく待つとインストールが完了するので「有効化」をクリックすればUltimate Category Excluderが有効化されます。

 

「Ultimate Category Excluder」の使い方

Ultimate Category Excluderを有効化したら、WordPress管理画面左にある「設定」→「Category Excluder」から設定画面へ入れます。

日本語化対応はしていませんが、操作はシンプルなので大丈夫だと思います。

設定画面は左側にカテゴリーが表示され、それぞれ除外したい種別のチェックボックスをチェックするという形です。

種別はそれぞれ次の意味となっています。

  • Exclude from Front Page:トップページ
  • Exclude from Feeds:RSSフィードなど
  • Exclude from All Archives:全てのアーカイブページ
  • Exclude from Search:検索結果


今回はサイト内検索結果から除外したいので、「Exclude from Search」の項目で除外したいカテゴリーのチェックを入れましょう。

チェックを入れたら、下部にある「Update」をクリックすると設定が反映されます。

投稿は、複数のカテゴリーを設定することができます。

ある投稿にAとBのカテゴリーを設定した場合、AもしくはBのどちらか一方だけでもサイト内検索から除外の設定をすると、その投稿は検索対象外となります。

 

functions.phpで特定のページをサイト内検索結果から除外する

functions.phpを編集する方法です。

functions.phpに記述を加えることで、サイト内検索をする際に「指定したページは検索対象にしない」という指定をします。

functions.phpは、テーマ関数ファイルと呼ばれるもので、各テーマフォルダの中にある「Webサイトの設定や機能を担うファイル」です。

functions.phpについて、詳しくは以下の記事をご覧ください。

【知識】functions.phpって何をするものなの?
functions.phpはテーマ関数ファイルと呼ばれるもので、index.phpやheader.phpなどのテンプレートファイルとは違い、「サイトの設定や機能」を作るファイルです。コードを記述して、様々な機能をサイトに追加できます。

functions.phpは、Webサイトの根幹に関わるファイルのため、編集を失敗するとWebサイトの表示だけでなく管理画面に入れなくなってしまうこともあります。

functions.phpをWordPress管理画面上で直接編集をすることも可能ですが、失敗した際に元に戻すのが難しいため、おすすめしません。

ですので、ここではFTPソフトでfunctions.phpをダウンロードして、バックアップを取った上で編集することをおすすめします。

FTPソフトとは、サーバー上のファイルをローカル(PC)にダウンロードしたり、逆にサーバーにアップロードしたりするソフトウェアです。

FTPについて、詳しくは以下の記事をご覧ください。

【基本】FTPって何のこと?
FTPとは、File Transfer Protocolの略で、クライアントの間でファイルを送受信する通信の手続きのことを言います。FTPを使う事で、自分のパソコンにあるファイルをWebサーバーに転送できます。

functions.phpの編集について、詳しくは以下の記事をご覧ください。

【危険】テーマファイル(テンプレートファイル)の編集はローカルファイルで行なう
WordPressのテーマファイルの編集は管理画面で編集するのではなく、オフラインにてテキストエディタで編集して、FTPでアップロードしましょう。管理画面の直接編集でミスしたまま「ファイルを更新」すると、元に戻らない危険を孕んでいます。

 

functions.phpで除外する方法が適している環境

functions.phpを編集して検索結果から除外する方法は、次のようなWebサイトで適しています。

  • 自作のテーマを使用
  • 子テーマを使用

上記以外の、親テーマしかない市販や無償のテーマ、公式配布のテーマは、functions.phpを編集する方法は適しません。

テーマが更新されると、functions.phpも更新されます。

すると、検索結果から除外するために記述したコードも更新で上書きされて消えてしまうからです。

その点、自作のテーマであれば、自分で記述したコードを削除しなければ残しておけます。

また、子テーマを使用すれば親テーマが更新されても影響を受けないので、子テーマのfunctions.phpは変更されません。

このことから、functions.phpを編集する方法が適しているのは前述した2つになります。

子テーマについて、詳しくは以下の記事をご覧ください。

【基本】WordPressの親テーマと子テーマって何?
「子テーマ」とは、テーマとは別ファイルでありながら、同時に読み込まれて、機能とスタイルを引き継いだ、カスタマイズ専用のテーマのことです。「子テーマ」から見たオリジナルのテーマを「親テーマ」と呼ぶことがあります。

 

メインクエリーを改変するための「pre_get_posts」

WordPressは、データベースから情報を取得し、取得した情報を使ってページの生成など、いくつもの工程を経てWebサイトを表示しています。

その行程の途中でWebサイト管理者がプログラムを挿入できる仕組みを、フックと言います。

ここでは、「pre_get_posts」というアクションフックを使って、サイト内検索から特定のページを除外してみましょう。

pre_get_postsは、WordPressがデータベースから情報を取得する直前にプログラムを挿入するためのフックです。

これを使うことで、サイト内検索結果の情報をデータベースから取得する前に、「この記事は検索から除外する」という命令を差し込むことができます。

具体的なコードは、以下の通りです。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//ここに除外するページの指定などをしていく
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

pre_get_postsは、公開されているWebサイトだけでなく、管理画面でも有効なため、3行目の「if ( is_admin() || ! $query->is_main_query() ) { 」で「管理画面では何もしない」という命令をしています。

7行目の「if ( $query->is_search ){ 」で、サイト内検索の場合と条件を付けています。

このif文の中に、除外するページの指定などをしていきます。

IDの調べ方

サイト内検索から除外する方法は、基本的に固定ページや投稿、カテゴリーなどのIDを指定します。

IDは、固定ページやカテゴリーなどの詳細編集画面のURLから知ることが可能です。

また、一部のテーマでは一覧ページで確認することができます。

 

URLから調べる

固定ページ、投稿、カテゴリーなど、調べ方はどれでもほとんど同じなので、ここでは「投稿」を例に説明します。

投稿の編集画面に入ると、ブラウザ上部のアドレスバーにURLが表示されていると思います。

URLの「post=●●●」となっている箇所の「●●●」がIDです。

「post」の部分は種別によって異なり、以下の通りです。

  • 固定ページ、投稿、カスタム投稿タイプ:post
  • カテゴリー、タグ:tag_ID

 

一覧ページで調べる

Cocoonなど、テーマによっては一覧ページにIDが表示されている場合があります。

ここでも、「投稿」を例に説明します。

WordPress管理画面の左にある「投稿」をクリックし一覧を表示してみると、一覧の中にIDという列があります。

これが投稿のIDです。

一覧にIDの列がない場合は、「表示オプション」で非表示に設定されている可能性があるので、上部の「表示オプション」をクリックし、「カラム」の「ID」にチェックを入れ、「適用」をクリックすると表示されます。

投稿以外でも、固定ページ、カスタム投稿タイプ、カテゴリー、タグに関しても、同様の方法でIDを取得できます。

 

記事IDを指定して除外する方法

WordPressの「固定ページ」「投稿」「カスタム投稿タイプ」は、データベース上では同じものとして扱われています。

そこで、ここでは固定ページ、投稿、カスタム投稿タイプを合わせて「記事」と呼びます。

前述した方法で記事のIDを取得し、そのIDを指定してサイト内検索から除外することが可能です。

以下のコードを、functions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//特定IDの記事をサイト内検索から除外
$post_id = array( '●●●' );
$query->set( 'post__not_in', $post_id );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

「●●●」のところに、IDを入力します。

例えば、サイト内検索から除外したい記事IDが「5」の場合は「$post_id = array( '5' ); 」となります。

IDは、「‘(シングルクォーテーション)」で括るのを忘れないようにしてください。

また、IDは複数指定することも可能です。

例えば、記事IDの「5」と「12」を除外したい場合は「$post_id = array( '5', ‘12’ ); 」となります。

 

カテゴリーIDを指定して除外する方法

カテゴリーIDを指定してサイト内検索から除外するには、次のコードをfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//特定IDのカテゴリーに属する記事をサイト内検索から除外
$category_id = array( '●●●' );
$query->set( 'category__not_in', $category_id );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

「●●●」のところに、IDを入力します。

例えば、サイト内検索から除外したいカテゴリーIDが「5」の場合は「$category_id = array( '5' ); 」となります。

IDは「‘(シングルクォーテーション)」で括るのを忘れないようにしてください。

また、IDは複数指定することも可能です。

例えば、カテゴリーIDの「5」と「12」を除外したい場合は、「$category_id = array( '5', ‘12’ ); 」となります。

投稿に対して、カテゴリーは複数設定することが可能です。

投稿に設定されているどれか1つのカテゴリーが、サイト内検索の除外対象となっている場合、その投稿はサイト内検索から除外されます。

例えば、カテゴリーAとBに設定されている投稿で、カテゴリーAをサイト内検索から除外した場合、カテゴリーBが検索対象のままだとしても、その投稿はサイト内検索から除外されます。

 

タグIDを指定して除外する方法

タグIDを指定してサイト内検索から除外するには、次のコードをfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//特定IDのタグが設定されている記事をサイト内検索から除外
$tag_id = array( '●●●' );
$query->set( 'tag__not_in', $tag_id );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

「●●●」のところに、IDを入力します。

例えば、サイト内検索から除外したいタグIDが「5」の場合は「$tag_id = array( '5' ); 」となります。

IDは「‘(シングルクォーテーション)」で括るのを忘れないようにしてください。

また、IDは複数指定することも可能です。

例えば、タグIDの「5」と「12」を除外したい場合は「$tag_id = array( '5', ‘12’ ); 」となります。

投稿に対して、タグは複数設定することが可能です。

投稿に設定されているどれか1つのタグが、サイト内検索の除外対象となっている場合、その投稿はサイト内検索から除外されます。

例えば、タグAとBに設定されている投稿で、タグAをサイト内検索から除外した場合、タグBが検索対象のままだとしても、その投稿はサイト内検索から除外されます。

 

各IDを組み合わせて設定することも可能

記事IDとカテゴリーID、タグIDを、それぞれ組み合わせて設定することも可能です。

3種類とも設定する場合は、次のようにfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//特定IDの記事をサイト内検索から除外
$post_id = array( '●●●' );
$query->set( 'post__not_in', $post_id );

//特定IDのカテゴリーに属する記事をサイト内検索から除外
$category_id = array( '●●●' );
$query->set( 'category__not_in', $category_id );

//特定IDのタグが設定されている記事をサイト内検索から除外
$tag_id = array( '●●●' );
$query->set( 'tag__not_in', $tag_id );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

それぞれの「●●●」を、設定したいIDに置き換えてください。

IDは「‘(シングルクォーテーション)」で括るなどの注意点、複数IDの指定方法などは今までと同じです。

 

スラッグを指定して除外する方法

IDではなく、スラッグを指定してサイト内検索から除外することも可能です。

その場合は、次のようにfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//投稿のスラッグからIDを取得する
$post_slug = "●●●";
$post_data = get_page_by_path( $post_slug, "OBJECT", "post" );
$post_id = $post_data->ID;

//固定ページのスラッグからIDを取得する
$page_slug = "●●●";
$page_data = get_page_by_path( $page_slug );
$page_id = $page_data->ID;

//カスタム投稿のスラッグからIDを取得する
$custom_post_slug = "●●●";
$custom_post_name = "▲▲▲";
$custom_post_data = get_page_by_path( $custom_post_slug, "OBJECT", $custom_post_name );
$custom_post_id = $custom_post_data->ID;

//記事(投稿、固定ページ、カスタム投稿タイプ)をサイト内検索から除外
$query->set( 'post__not_in', array( $post_id ,$page_id, $custom_post_id ) );

//カテゴリーのスラッグからIDを取得する
$category_slug = "●●●";
$category_data = get_category_by_slug( $category_slug );
$category_id = $category_data->cat_ID;

//カテゴリーに属する記事をサイト内検索から除外
$query->set( 'category__not_in', array( $category_id ) );

//タグのスラッグからIDを取得する
$tag_slug = "●●●";
$tag_data = get_tags(array( 'slug' => $tag_slug ) );
$tag_id = $tag_data[0]->term_id;

//タグが設定されている記事をサイト内検索から除外
$query->set( 'tag__not_in', array( $tag_id ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

上記ソースは投稿、固定ぺージ、カスタム投稿タイプ、カテゴリー、タグの5種類のパターンを全て入れてあります。

必要なものを抜き出して使ってください。

「●●●」のところに、スラッグを入力します。

スラッグは「‘(シングルクォーテーション)」で括るのを忘れないようにしてください。

カスタム投稿タイプは、スラッグと一緒にカスタム投稿タイプのスラッグの入力が必要です。「▲▲▲」のところに入力してください。

IDとスラッグで指定する2通りの方法がありますが、基本的にはIDを指定する方法がおすすめです。

スラッグを指定してサイト内検索から除外していることを忘れて、WordPress管理画面でスラッグを変更すると除外設定が解除されてしまいます。

このように、スラッグ指定だとスラッグを変更したらfunctions.phpも修正が必要になり、管理が煩雑になってしまうので、そのような手間が発生しにくいIDを指定する方法が安全だと思います。

 

固定ページを一括して除外する方法

ここまで記事単体を指定、カテゴリーやタグで指定する方法を紹介しましたが、固定ページを全てサイト内検索から除外する場合には、以下のようにfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//固定ページをサイト内検索から除外
$query->set( 'post_type', 'post' );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

実は、このコードは固定ページを除外しているのではなく、「サイト内検索の対象を投稿に限定する」というものです

WordPressは、投稿と固定ページの2種類が基本となっており、結果として固定ページを除外した形となります。

先の方法だと、カスタム投稿タイプもサイト内検索の対象でなくなってしまいます。

カスタム投稿タイプもサイト内検索対象とする場合は、次のコードをfunctions.phpに記します。

【PHP】

function search_pre_get_posts( $query ) {
//管理画面、メインクエリー以外では何もしない
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
//サイト内検索でのみ動作
else if ( $query->is_search ){
//固定ページを内部検索から除外(カスタム投稿タイプあり)
//$query->set( 'post_type', array( 'post', '▲▲▲' ) );
}
return $query;
}
add_action( 'pre_get_posts', 'search_pre_get_posts' );

先ほどのコードと似ていますが、「post」の後にカスタム投稿タイプもサイト内検索に含むように設定しています

「▲▲▲」のところに、カスタム投稿タイプのスラッグを入力してください。

カスタム投稿タイプスラッグが複数ある場合は「,(カンマ)」で区切って追加します。

「cs_post_smple1」と「cs_post_smple2」を指定する場合は、「$query->set( 'post_type', array( 'post', 'cs_post_smple1', 'cs_post_smple2' ) );」という具合です。

 

まとめ

  • サイト内検索結果から特定のページを除外するには、プラグインを使う方法とfunctions.phpを編集する方法があるが、安全性の面からまずはプラグインの使用を検討するのがおすすめ。
  • プラグイン「Search Exclude」を使うと、サイト内検索結果から除外するページを個別に設定できる。
  • プラグイン「Ultimate Category Excluder」を使うと、サイト内検索結果からカテゴリーに属しているページを一括で除外できる。
  • functions.phpを編集することで、記事単体、カテゴリー、タグを指定してサイト内検索結果から除外することができる(指定はIDもしくはスラッグ)。
  • functions.phpの編集では、固定ページを一括してサイト内検索結果から除外することも可能。
Pocket