サイト運営において、検索機能はユーザーが目的の情報に到達するための重要なナビゲーションです。しかし、プライバシーポリシー、特定のキャンペーン用LP、あるいは更新が停止した古いアーカイブなど、「ユーザーには見せたくないが、URLを知っている特定の人にはアクセスさせたい」というページは必ず存在するものです。WordPressの標準検索機能は、デフォルトですべての公開済み投稿・固定ページをヒットさせてしまいます。本稿では、Webデザイナーの視点から、サイト内検索の精度を高め、意図しないページをインデックスから除外する技術的アプローチを詳説します。
1. 概要:なぜ検索から除外する必要があるのか
Webサイトの構造設計において、検索結果に不要なページが表示されることは、ユーザーエクスペリエンス(UX)を著しく低下させます。例えば、管理用ページや重要度の低い固定ページが検索結果の上位を占めると、本当に読ませたい記事が埋もれてしまいます。また、特定のディレクトリ以下を検索対象外にしたいという要件は、大規模なメディアサイトやコーポレートサイトでは頻出する課題です。これを適切に制御することで、検索コンバージョン率の向上や、サイト構造の整理に直結させることができます。
2. 詳細解説:WordPressにおける検索クエリのフック
WordPressには、検索クエリが実行される直前に介入できる「pre_get_posts」という非常に強力なアクションフックが用意されています。これを使用することで、データベースから結果を取得する前に、SQLレベルで特定の条件を除外することが可能です。
通常、検索ページにアクセスすると、WordPressはメインループを生成するためにデータベースへクエリを投げます。このとき、URLパラメータ「s」が存在すると、検索用のクエリが自動的に構築されます。我々が行うべきことは、このクエリが実行される前に「特定のIDを持つ投稿を除外する」あるいは「特定のカテゴリを除外する」という命令を追加することです。この手法の最大の利点は、プラグインを導入せずにfunctions.phpに記述するだけで完結するため、サイトの軽量性を保てる点にあります。
3. サンプルコード:functions.phpによる実装例
以下は、特定の投稿IDや固定ページIDを検索結果から除外するための標準的なコードです。このコードをテーマのfunctions.phpに記述することで、指定したページを検索エンジンから隠すことができます。
/**
* サイト内検索から特定の投稿・固定ページを除外する
*/
function exclude_specific_pages_from_search($query) {
// 管理画面、メインクエリ以外、検索ページ以外では実行しない
if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
return;
}
// 除外したい投稿IDの配列を定義
$exclude_ids = array(123, 456, 789);
// post__not_inプロパティにID配列をセットして除外
$query->set('post__not_in', $exclude_ids);
}
add_action('pre_get_posts', 'exclude_specific_pages_from_search');
さらに応用として、特定のカテゴリーに属する記事をすべて除外したい場合は、以下のように記述を拡張します。
/**
* 特定のカテゴリIDに属する投稿を検索から除外する
*/
function exclude_category_from_search($query) {
if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
return;
}
// 除外したいカテゴリIDを指定(マイナスをつけることでNOT条件とする)
$query->set('cat', '-10, -20');
}
add_action('pre_get_posts', 'exclude_category_from_search');
4. 実務アドバイス:デザイナーが知るべき運用の注意点
実装にあたり、いくつか注意すべき実務的なポイントがあります。
まず、IDによる管理は、コンテンツ量が増えてくると管理が煩雑になりがちです。特定の記事だけではなく、「非公開カテゴリ」を一つ作成し、そこに含めた投稿は検索から自動的に除外されるような設計にすると、クライアント側での運用が非常に楽になります。この場合、上記のコードでID指定する代わりに、category__not_inを使用するように書き換えるのがベストプラクティスです。
また、検索結果からの除外は「Googleなどの外部検索エンジンからの除外」とは別物であるという点に注意が必要です。もし外部検索エンジンからも隠したい場合は、robots.txtによる制御や、ページ内にnoindexメタタグを出力する処理が必要です。検索結果から除外するコードを書いたからといって、安心せずにメタタグの確認も徹底してください。
さらに、検索結果のテンプレートファイル(search.php)をカスタマイズしている場合、除外処理の影響で検索結果が0件になった際の「検索結果なし」の表示が正しく機能するか確認しましょう。検索結果が空の場合に適切なメッセージを表示しないと、ユーザーは「不具合が起きている」と誤解してサイトから離脱する可能性があります。
5. まとめ:検索機能の精度がサイトの品格を決める
サイト内検索は、ユーザーとの対話です。何を表示し、何を表示しないかを制御することは、サイトの設計思想そのものを反映することに他なりません。本稿で紹介したpre_get_postsを用いたアプローチは、WordPressのコア機能に深く干渉することなく、クリーンかつ高速に検索結果を制御できる手法です。
Webデザイナーとして、ただデザインを綺麗に見せるだけでなく、こうした「内部的な情報の出し分け」を的確にコントロールできることは、クライアントからの信頼を得るための重要なスキルセットとなります。ぜひ、本稿のコードを自身のプロジェクトに応用し、より洗練されたサイト体験を構築してみてください。小規模な個人ブログから大規模な企業メディアまで、検索結果の最適化は、ユーザー満足度を向上させるための必須要件なのです。
今後も、WordPressの標準機能を最大限に活かしつつ、シンプルで保守性の高いコードを追求し続ける姿勢が、プロフェッショナルなWeb制作には求められています。今回の実装が、あなたのサイト運営の一助となれば幸いです。

コメント