カスタム投稿が検索結果に出てこない!の解決策
多くのWordPressサイトでは、デフォルトの検索機能が通常の「投稿」のみを対象とするため、せっかく作ったカスタム投稿タイプが検索結果に表示されないケースが頻繁に見られます。これは、読者が探している情報にたどり着けない大きな原因となり、サイトのユーザビリティを著しく低下させてしまう問題です。
公開から10年以上経った古い情報やコードでは、この問題に対する解決策も今のWordPressの仕様に合っていない可能性が高いでしょう。
この記事では、現行のWordPress(2025年時点)の仕様に則り、特定のカスタム投稿タイプを検索結果に確実に表示させるための、よりシンプルで推奨されるPHPコードを解説します。
functions.phpにフックを追記するのが最適解
かつては検索フォームのHTML(formタグ)に隠しフィールド(input type=”hidden”)を追加する手法も存在しましたが、この方法では一つのカスタム投稿タイプしか指定できないなど、柔軟性に欠けるデメリットがあります。2025年現在、WordPressの検索クエリを操作する最も推奨される方法は、functions.php ファイルに
pre_get_posts というアクションフックを用いてカスタマイズを加えることです。このフックを使うと、WordPressがデータベースから投稿を取得する直前に、クエリの条件を自由に変更できるのです。
検索結果にカスタム投稿を含めるためのPHPコード
以下のコードを、ご利用のテーマの functions.php ファイルの一番下などに追記してください。|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/ * 検索結果に特定のカスタム投稿タイプを含める * * @param WP_Query $query WordPressのクエリオブジェクト */ function include_custom_post_types_in_search($query) { // 管理画面やメインクエリでない場合は処理をしない if (is_admin() || !$query->is_main_query()) { return; } // 検索結果ページ(is_search())で実行されるようにする if ($query->is_search()) { // 含めたい投稿タイプを指定(例: 'post'と'case-study'と'product') $post_types_to_include = array('post', 'case-study', 'product'); // 既存の設定があればそれを優先し、なければ上記配列を設定する $current_post_type = $query->get('post_type'); if (empty($current_post_type)) { // post_typeが未指定の場合、カスタム投稿タイプを追加 $query->set('post_type', $post_types_to_include); } elseif (is_array($current_post_type)) { // post_typeが配列の場合、既存の配列にカスタム投稿タイプを追加 $merged_post_types = array_unique(array_merge($current_post_type, $post_types_to_include)); $query->set('post_type', $merged_post_types); } else { // post_typeが文字列(単一)の場合、配列形式に変換してカスタム投稿タイプを追加 $merged_post_types = array_unique(array_merge(array($current_post_type), $post_types_to_include)); $query->set('post_type', $merged_post_types); } } } // アクションフックに自作関数を登録 add_action('pre_get_posts', 'include_custom_post_types_in_search'); |
コードのポイントは以下の通りです。
$post_types_to_include の編集
この配列(array(…))の中に、検索結果に含めたい投稿タイプスラッグをカンマ区切りで指定しましょう。例では’post’(通常の投稿)、’case-study’、’product’ を指定しています。ご自身のカスタム投稿スラッグに必ず置き換えてくださいね。
is_search() の条件分岐:
この関数は、現在表示しているページが検索結果ページである場合にのみ true を返します。これにより、他のページ(トップページ、アーカイブページなど)のクエリに余計な影響を与えないように防御しているのです。
pre_get_posts`フック
このアクションフックが、WordPressのクエリ実行前にコードを実行するトリガーとなっております。検索されないカスタム投稿が引き起こす損失
もしカスタム投稿を検索対象に含めないまま放置すると、サイト運営上、以下のような大きな損失(コスト)が発生してしまいます。| 放置コスト | 具体的影響 | 損失の大きさ |
|---|---|---|
| 機会損失 | 読者が欲しい情報(カスタム投稿の記事)を見つけられず、離脱してしまう | 高 |
| SEO評価の低下 | 検索機能が不十分だと、ユーザー体験(UX)が悪化し、間接的に検索エンジンからの評価が下がる | 中 |
| コンテンツ資産の塩漬け | せっかく作成した良質なカスタム投稿コンテンツが、読者に見つけてもらえない「死んだ記事」になってしまう | 高 |
| 制作工数の無駄 | 誰も読まない記事を作るために費やした時間と費用が無駄になる | 中 |
このシンプルなコード一つで、サイトのユーザビリティとコンテンツの到達率は劇的に向上します。
ぜひ、今すぐ functions.php を編集して、あなたのWordPressサイトをより使いやすく、より多くの読者に情報を届けられるようにアップデートしてみてください!


コメント