はじめに

WordPressの検索フォームで、検索キーワードを入力せずに検索ボタンをクリックすると、全ての投稿が表示されます(図1参照)。
これはWordPressの標準仕様です。
そこで、検索キーワードが空の場合に、全ての投稿が表示されないようにします。
この記事では、この方法について説明します。
完成イメージ

実装手順
以下のコードをfunctions.phpに追加します。
add_action('pre_get_posts', function ($query) {
if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
return;
}
// 検索キーワードが空の場合は検索結果を0件に設定
if (empty(trim(get_search_query()))) {
$query->set('post__in', [0]);
}
});
補足
前述のコードの他にも、以下のように実装することができます。
SQLクエリに and 0=1を追加することで、常に条件が偽となり、どんな投稿も検索結果に含まれなくなります。
その結果、検索結果は必ずゼロ件になります。
add_filter('posts_search', function ($search, $query) {
if ($query->is_main_query() && is_search() && empty(get_search_query())) {
// 検索キーワードが空の場合は偽の条件を追加
$search .= ' AND 0=1';
}
return $search;
}, 10, 2);
応用:オリジナルのページに変更する方法

「NOT FOUND」だけでは、少し物足りない印象を受けるかもしれません。
そこで、ページに遊び心を加え、より魅力的なデザインに仕上げます。
そのため、図2に示すように、「NOT FOUND」テンプレートをパターンで作成した内容に変更します。
実装手順
上記のコードに加え、以下のコードをfunctions.phpに追加します。
add_filter('cocoon_part__tmp/list-not-found-posts', function ($content) {
return do_shortcode('[pattern id=パターンID]');
});
さいごに
今回紹介した方法を使えば、検索キーが空の場合に検索結果が0件として表示されるようになります。
これにより全投稿が表示されることを防ぎ、ユーザーが適切に検索結果を受け取れるようになります。
この方法はWordPressの標準機能を活用しているため、他のテーマでも利用可能です

