【WordPress】検索結果ページをカスタマイズする方法|条件分岐とテンプレート編集

WordPress

WordPressの検索結果ページは、デフォルトではsearch.phpまたはindex.phpのテンプレートを使って一覧を表示します。しかしそのままでは自由度が低く、ユーザー体験やSEOの観点で物足りない場合があります。ここでは検索結果ページをカスタマイズする方法を条件分岐とテンプレート編集の両面から解説します。

スポンサーリンク

検索結果ページ用テンプレートの作成

検索結果ページを独自にデザインしたい場合は、テーマ直下にsearch.phpを作成します。WordPressは検索結果ページにアクセスすると自動的にsearch.phpを探して読み込みます。

search.php:検索結果テンプレート
<?php get_header(); ?>

<main class="search-results">
  <h1>検索結果:<?php echo get_search_query(); ?></h1>

  <?php if (have_posts()): ?>
    <ul class="result-list">
      <?php while (have_posts()): the_post(); ?>
        <li>
          <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
      <?php endwhile; ?>
    </ul>
  <?php else: ?>
    <p>該当する記事は見つかりませんでした。</p>
  <?php endif; ?>
</main>

<?php get_footer(); ?>

条件分岐で表示を切り替える

検索結果に特定の投稿タイプやカテゴリーだけを表示したい場合は、functions.phpでpre_get_postsを使います。

functions.php:投稿タイプの絞り込み
<?php
// 検索結果から固定ページを除外し、投稿のみ表示
add_action('pre_get_posts', function ($query) {
  if ($query->is_search() && $query->is_main_query() && !is_admin()) {
    $query->set('post_type', 'post');
  }
});

また、条件分岐タグを使って検索結果ページに特定のメッセージを出すことも可能です。

検索結果0件時のメッセージ
<?php if (is_search() && !have_posts()): ?>
  <p>「<?php echo get_search_query(); ?>」に一致する記事はありませんでした。</p>
<?php endif; ?>

検索結果を強調表示する

検索キーワードに一致した部分をハイライト表示すれば、ユーザーが探している情報を見つけやすくなります。

functions.php:検索キーワードのハイライト
<?php
function highlight_search_term($text) {
  if (is_search() && in_the_loop() && is_main_query()) {
    $query = get_search_query();
    if ($query) {
      $text = preg_replace('/(' . preg_quote($query, '/') . ')/iu', '<mark>$1</mark>', $text);
    }
  }
  return $text;
}
add_filter('the_title', 'highlight_search_term');
add_filter('the_excerpt', 'highlight_search_term');
is_search()だけではウィジェットにも適用されてしまう
is_search()のみで判定すると、検索結果ページに表示されるサイドバーウィジェット(「最新の投稿」等)のタイトルにも、検索結果とは無関係にハイライト処理が適用されてしまう可能性があります。in_the_loop()とis_main_query()を組み合わせることで、メインループで表示中の検索結果にのみ適用されるようにしています。

ページネーションの追加

検索結果が多い場合はページネーションを設置してユーザーが移動しやすくすることが重要です。

検索結果ページのページネーション
<div class="pagination">
  <?php the_posts_pagination(array(
    'mid_size' => 2,
    'prev_text' => '≪ 前へ',
    'next_text' => '次へ ≫',
  )); ?>
</div>

よくある質問(FAQ)

QWordPressの検索結果ページをカスタマイズするには?
Aテーマにsearch.phpを作成(または子テーマにコピー)してカスタマイズします。search.phpが存在しない場合はindex.phpが使われます。get_search_query()で検索キーワードを取得して表示できます。
Q検索結果が0件の場合に専用メッセージを表示するには?
Ahave_posts()がfalseの場合に「検索結果が見つかりませんでした」メッセージとget_search_form()を表示します。関連キーワードの提案や人気記事リストも追加するとUXが向上します。
Q検索結果のソート順を変更するには?
Apre_get_postsフックでis_search()を確認し、orderby・order・meta_key等を設定します。デフォルトは関連性(relevance)ですが、日付順や表示回数順に変更できます。

まとめ

WordPressの検索結果ページはsearch.phpを編集するだけで独自のデザインに変更できます。さらにpre_get_postsを使えば表示対象を絞り込め、キーワードの強調表示やページネーションを追加すればユーザー体験が向上します。テンプレート編集と条件分岐を組み合わせて、自分のサイトに最適化された検索結果ページを実装しましょう。