検索結果が0件の画面では、次に何を検索すればよいか分かる案内を追加できます。検索0件と、存在しないURLの404ページは別のものです。

ですので、検索結果が見つからない時の文言を変えたいと思ったことはないでしょうか?
それだけでなく、さらにブログパーツも挿入して、再検索を促すコンテンツも加えるのこともできます。

本記事ではこの2つのカスタマイズ方法を紹介します。
「記事が見つかりませんでした。」の文言を変更する方法
やり方は簡単です。
swell_post_list_404_textというフックを使うと文言が変更できます。
有効な子テーマのfunctions.phpまたはCode Snippetsの一方へ追加します。親テーマを直接編集しません。
function motoki_no_search_results_message( $original ) {
if ( ! is_search() ) return $original;
$html = '<p class="u-mb-20">条件にマッチする記事は見つかりませんでした。</p>';
return $html;
}
add_filter('swell_post_list_404_text', 'motoki_no_search_results_message');応用│検索結果専用のコンテンツを表示する方法
ユーザーの離脱を防ぐためにブログパーツを表示してみたいと思います。
ブログパーツの作成
まずはブログパーツで表示したいコンテンツを作成します。
今回は絞り込み検索プラグイン VK Filter Searchを表示させてみました。


コードの修正
コードも修正します。
function motoki_no_search_results_message( $original ) {
if ( ! is_search() ) return $original;
$html = '<p class="u-mb-20">条件にマッチする記事は見つかりませんでした。</p>';
$part_id = 25354; // 導入先の公開済みブログパーツIDへ変更
$part = get_post($part_id);
if (shortcode_exists('blog_parts') && $part
&& $part->post_type === 'blog_parts'
&& $part->post_status === 'publish' && $part->post_password === '') {
$html .= do_shortcode('[blog_parts id="' . absint($part_id) . '"]');
}
return $html;
}
add_filter('swell_post_list_404_text', 'motoki_no_search_results_message');PHPでブログパーツを実行する文字列には、角かっこを1組だけ使います。
角かっこを二重にすると、WordPressのショートコード仕様により文字列の表示になり、ブログパーツは実行されません。
ブログパーツIDは、利用先で公開したパーツのIDへ変更してください。
未公開・パスワード付き・ブログパーツ以外のIDでは案内文だけを表示し、指定したパーツは読み込みません。
確認
該当記事のない検索語を入力して、0件の検索画面にメッセージと検索フォームが出ることを確認します。次に、そのフォームへ別の検索語を入力し、Enterキーで検索結果へ移動できるか確認します。PCとスマホの両方で入力欄が画面に収まるかも確認してください。

投稿タイプの条件と再検索フォームを分けて確認する
案内の表示条件と、再検索で送信する条件は別です。
WordPress標準の検索で投稿タイプをpageまたはpostに限定した場合も、検索結果が0件なら、このコードによる案内とブログパーツが表示されることを隔離環境で確認しました。
ブログパーツにWordPress標準の検索ブロックを置いた場合、そのフォームからの再検索はキーワードを送信します。
元のURLに付いていたpost_typeは自動で引き継がれず、今回もEnterで再検索した後はキーワードのみの検索URLになりました。
投稿タイプやカテゴリーを維持したい場合は、その条件を送信できる検索フォームをブログパーツに設置してください。
絞り込みプラグインを使う場合も、0件時に表示されることだけでなく、再検索後のURLと結果の対象が意図した条件に一致するか確認します。
今回確認したのはWordPress標準検索の投稿タイプ2条件と、標準検索ブロックからのEnterによる再検索です。
VK Filter Searchなどの設定画面や独自パラメーターは、利用するフォームごとに確認が必要です。

0件から再検索するときに投稿タイプと地域を保つ
| フォームの項目 | 送信する値 | 確認する結果 |
|---|---|---|
| キーワード | s:新しい検索語 | 入力した検索語で結果を取り直す |
| 投稿タイプ | post_type:works | 通常投稿や固定ページを混ぜない |
| 地域 | area:対象地域のスラッグ | 別の地域の制作事例を混ぜない |
再検索フォームをブログパーツに入れる場合は、元の検索で指定していた条件を、再送信するフォーム側にも用意します。
上表は投稿タイプをworks、地域のタクソノミーをareaとして登録した場合の例です。
固定の条件はhidden入力、読者が変更する条件はselectなどの入力として、実際の登録名と送信値を合わせます。
元のURLに条件があるだけでは、新しいフォームにその条件が自動で引き継がれるとは限りません。
隔離環境では、0件の画面にキーワード欄と投稿タイプ・地域のhidden入力を持つブログパーツを表示しました。
キーワードを入力してEnterで再検索すると、同じ地域の制作事例Aだけが1件表示され、別地域の制作事例Bと通常投稿は結果に入りませんでした。
結果のリンクにもEnterで移動できました。
この確認は自作フォームの送信条件に関するもので、VK Filter Searchの設定保存や独自の送信値は未検証です。
VK Filter Searchを使う場合は、使用中のフォームが送信する項目名を確認し、そのフォームをブログパーツへ配置した状態で0件からの再検索を試してください。
文言だけの変更へ戻すときは、ブログパーツを含むコードを停止してから、文言のみのコードを使います。
二つのコードは同名の関数を持つため、同時に有効化しないでください。

検索のメイン一覧と投稿リストブロックを区別する
この記事のswell_post_list_404_textは、検索結果などのメイン一覧が空の場合に使われます。
ブログパーツの中に入れた投稿リストブロックが0件の場合はswell_posts_404_textを使うため、このコードの案内パーツはそこには追加されません。
検索結果に記事がある場合は、メイン一覧が通常の記事カードを出力し、この0件用の案内は出力しません。
カテゴリ一覧が0件でも、この記事のis_search判定により元のメッセージを残します。
案内が出ない場合は、検索結果のメイン一覧を変更したいのか、投稿リストブロックを変更したいのかを先に確認してください。
隔離環境のSWELL実テンプレートで、検索結果0件のメイン一覧にパーツを1回出力すること、同じ検索ページの空の二次一覧へは出力しないこと、0件のカテゴリ一覧を変えないこと、検索結果ありでは通常の記事カードだけを出すことをPHPで検証しました。
検索フォームでの入力・送信とスマホの表示は別途確認が必要です。
まとめ
検索結果が見つからないページは何もしない人が多いですが、離脱につながります。
せめて検索ウィジェット等を入れてあげるとよいと思います。
この記事で紹介しているコードは、GitHubのMOTOKI-LLC/WAZA-codeにもまとめています。
2つの例は同じ関数名なので、どちらか一方だけを使用します。ブログパーツの25354は自分のIDへ変更してください。検索以外の空のアーカイブは元の文言を維持します。戻すときは追加した関数とadd_filterを削除、またはスニペットを無効化します。コード分岐の確認と実際の検索画面・ブログパーツ表示の確認は別に行います。
関連する手順は、SWELLのカスタマイズまとめも参照してください。
よくある質問:SWELLで検索結果が0件のときの文言や案内を変えるとき
「記事が見つかりませんでした。」の文言は、どうやって変えますか?
記事では、swell_post_list_404_textというフックを使うと文言を変更できます。有効な子テーマのfunctions.phpまたはCode Snippetsの一方へ追加し、親テーマは直接編集しません。
検索結果が0件のページと、404ページは同じものですか?
別のものです。記事では、検索0件と、存在しないURLの404ページは別のものとして説明しています。
0件のときに、検索フォームなどを表示するにはどうしますか?
記事では、離脱を防ぐために、ブログパーツで表示したいコンテンツを作り、コードからそのブログパーツを呼び出します。記事の例では、絞り込み検索プラグインVK Filter Searchを表示させています。PHPでブログパーツを実行する文字列には、角かっこを1組だけ使います。二重にすると、WordPressのショートコード仕様に合いません。
ブログパーツのIDは、そのまま使えますか?
使えません。記事では、コード内のブログパーツのIDは自分のIDへ変更するとしています。IDは、ブログパーツ一覧で確認します。
検索の投稿タイプを絞っていた場合、再検索でも条件は引き継がれますか?
自動では引き継がれません。記事では、ブログパーツにWordPress標準の検索ブロックを置いた場合、再検索はキーワードのみを送信し、元のURLに付いていたpost_typeは自動で引き継がれないと説明しています。投稿タイプやカテゴリーを維持したい場合は、その条件を送信できる検索フォームをブログパーツに設置します。固定の条件はhidden入力、読者が変更する条件はselectなどの入力として、実際の登録名と送信値を合わせます。
投稿リストブロックが0件のときにも、この案内は出ますか?
出ません。記事では、このコードのフックは検索結果などのメイン一覧が空の場合に使われ、ブログパーツの中に入れた投稿リストブロックが0件の場合はswell_posts_404_textを使うため、案内パーツは追加されないとしています。案内が出ない場合は、検索結果のメイン一覧と投稿リストブロックのどちらを変更したいのかを先に確認します。
検索以外の、空のカテゴリー一覧にも影響しますか?
影響しません。記事では、カテゴリ一覧が0件でも、is_search判定により元のメッセージを残すとしています。検索以外の空のアーカイブは、元の文言を維持します。
2つのコード例は、一緒に使えますか?
使えません。記事では、2つの例は同じ関数名なので、どちらか一方だけを使用します。戻すときは追加した関数とadd_filterを削除、またはスニペットを無効化します。なお、検索フォームでの入力・送信とスマホの表示は別途確認が必要です。



