【WordPress】検索条件に一致しない場合でも投稿を表示させる方法

【WordPress】検索条件に一致しない場合でも投稿を表示させる方法 WordPress

WordPressで検索機能を実装していると、「検索条件に一致する投稿が0件」の場合に何も表示されず、ユーザー体験が悪化することがあります。そこで本記事では、検索条件に一致しない場合でも代替の投稿を表示させる方法を紹介します。

スポンサーリンク

なぜ「0件表示」ではダメなのか?

検索結果が0件だと、ユーザーは「このサイトには情報がない」と感じて離脱する可能性があります。例えば以下のような状況です。

  • 複数条件で絞り込んだ結果、1件もヒットしなかった
  • 入力ミスにより意図しない検索になった

このような場合に代わりの投稿を表示すれば、ユーザーの離脱を防ぎ、回遊率の向上にもつながります。

実装方針 検索結果が0件の場合は代替投稿を表示する

WordPressの pre_get_posts フィルターとテンプレート内の have_posts() 判定を組み合わせて対応します。

ステップ1 pre_get_postsで検索キーワードを記録しておく(任意)

検索結果が0件だった場合のメッセージに、実際に検索されたキーワードを表示したい場合は、あらかじめキーワードを保持しておくと便利です。get_search_query()を使えば個別に取得することもできますが、複数箇所で使い回したい場合はグローバル変数に控えておく方法もあります。

functions.php:検索キーワードを保持しておく(任意)
add_action('pre_get_posts', function ($query) {
  if (!is_admin() && $query->is_search() && $query->is_main_query()) {
    // 検索キーワードをグローバル変数に保持し、代替表示のメッセージなどで使えるようにする
    global $searched_keyword;
    $searched_keyword = $query->get('s');
  }
});

ステップ2 テンプレートファイルで have_posts() を使って判定

例えば search.php で以下のように条件分岐します。

search.php:検索結果が0件の場合に代替投稿を表示
<?php if (have_posts()): ?>
  <h2>検索結果</h2>
  <?php while (have_posts()): the_post(); ?>
    <article>
      <h3><?php the_title(); ?></h3>
      <p><?php the_excerpt(); ?></p>
    </article>
  <?php endwhile; ?>
<?php else: ?>
  <h2>該当する投稿が見つかりませんでした。</h2>
  <p>
    <?php if (!empty(get_search_query())): ?>
      「<?php echo get_search_query(); ?>」に一致する投稿はありませんでした。
    <?php endif; ?>
    代わりに最新の投稿をご紹介します。
  </p>

  <?php
  // 代替投稿の表示
  $args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
    'post_status' => 'publish',
  );
  $fallback_query = new WP_Query($args);

  if ($fallback_query->have_posts()):
    while ($fallback_query->have_posts()): $fallback_query->the_post();
  ?>
    <article>
      <h3><?php the_title(); ?></h3>
      <p><?php the_excerpt(); ?></p>
    </article>
  <?php
    endwhile;
    wp_reset_postdata();
  endif;
  ?>
<?php endif; ?>

応用 カテゴリ別や人気投稿の表示にも対応可能

表示する代替投稿は、以下のように応用できます。

代替表示内容 設定例
最新記事 'orderby' => 'date'
特定カテゴリの投稿 'category_name' => 'news'
人気投稿(プラグイン使用) 'meta_key' => 'views', 'orderby' => 'meta_value_num'(※要カスタム実装)

よくある質問(FAQ)

Q検索結果が0件かどうかを判定するには?
Asearch.php内でhave_posts()がfalseを返す場合が0件です。is_search()と組み合わせて、検索結果ページに限定した0件表示の分岐を作ります。
Q代替投稿として表示中の検索キーワードをメッセージに含めるには?
Aget_search_query()で現在の検索キーワードを取得できます。この関数は既定でエスケープ済みの値(esc_attr()適用済み)を返すため、そのまま出力すればXSSの心配なく安全にメッセージへ埋め込めます。生の値が必要な場合はget_search_query(false)を使います。
Q代替投稿の表示をカテゴリー別に出し分けるには?
A検索キーワードやユーザーが選択したカテゴリーに応じて、WP_Queryのcategory_namecatパラメータを動的に変更します。関連性の高いカテゴリーの記事を優先表示することで、離脱防止の効果を高められます。

まとめ

WordPressの検索結果が0件でも、適切に代替投稿を表示することでユーザー満足度を高めることができます。検索体験の改善はSEOにもつながるため、積極的に導入するのがおすすめです。