2026年6月16日

2026年6月16日

WordPressの検索フォームが404を返す場合に確認するリライト設定とフォームの書き方

WordPressの検索は標準では /?s=キーワード というURLで動き、検索結果が0件でも404にはなりません。そのため検索フォームから送信して404が返る場合は、フォームの送信先や項目名、検索URLを /search/キーワード/ 形式に変えるリライト設定、サーバーのリライト設定のどこかに問題があると考えられます。この記事では、どの段階で404になっているかを見分け、リライトルールとフォームを順に確認して直す手順を解説します。

WordPressの検索URLの仕組み

WordPressのテーマが出力する標準の検索フォーム(get_search_form() や検索ブロック)は、サイトのトップページに s という名前のパラメーターを付けて送信します。たとえば「テーマ」で検索すると https://example.com/?s=テーマ に移動し、WordPressはこのパラメーターを見て検索結果のテンプレート(search.php、なければ index.php)を表示します。

WordPressには、/search/キーワード/ という形のURLを検索として扱うリライトルールも最初から用意されています。パーマリンク設定が「基本」以外であれば、このURLでも検索結果が表示されます。見た目の良さから ?s= のURLをこの形式に転送するコードを入れているサイトもありますが、ここが404の原因になりやすい部分です。

もう1つ知っておきたいのが、検索結果が0件のときの扱いです。WordPressは検索結果の1ページ目に該当記事がなくても404にはせず、「見つかりませんでした」といった内容の検索結果ページを表示します。一方、2ページ目以降(/page/2/?s=テーマ など)で表示する記事がない場合は404になります。「1ページ目は表示できるが次のページで404になる」なら、後述のページ送りの問題です。

どこで404になっているかを確認する

まず、検索フォームから送信した直後のURLと、404の画面の種類を確認します。

  • アドレスバーのURL:?s= の形か、/search/ の形か。サブディレクトリにWordPressを置いている場合、そのディレクトリ名がURLに含まれているか。
  • 404の画面:テーマのデザインで表示される404ページなら、WordPressまで処理が届いたうえで「該当なし」と判断されています。サーバーの素っ気ないエラーページ(「Not Found」とだけ表示される画面)なら、WordPressに届く前にWebサーバーが404を返しています。

ブラウザの開発者ツールの「ネットワーク」タブを開いてから検索すると、リダイレクトの有無とその転送先も確認できます。?s= のURLが301や302で /search/ のURLに転送され、転送先で404になっているなら、転送の設定かサーバーのリライト設定が原因です。

確認1:フォームの送信先と項目名

自作のテーマやカスタマイズした検索フォームでは、フォームのHTMLそのものが原因になっていることがあります。標準的な書き方は次のとおりです。

<form role="search" method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>">
    <label for="site-search">サイト内検索</label>
    <input type="search" id="site-search" name="s" value="<?php echo esc_attr( get_search_query() ); ?>">
    <button type="submit">検索</button>
</form>

確認するポイントは3つです。

  1. 送信先(action):action="/" のように手書きしていると、WordPressをサブディレクトリに置いたサイトではドメイン直下に送信されて404になります。home_url( '/' ) を使えば、設定に合わせた正しいURLが出力されます。
  2. 項目名(name):検索語の入力欄の名前は s です。q や keyword などにすると、WordPressは検索として扱いません。
  3. 追加の項目の名前:絞り込み用に項目を追加している場合、その名前がWordPressの予約語と重なっていないかを確認します。name、year、day、author、p、page などはWordPressが記事やアーカイブの指定として解釈するため、該当するページがないと判断されて404になることがあります。search_area のように、ほかと重ならない名前に変えてください。

確認2:/search/ 形式への転送とリライトルール

?s= を /search/キーワード/ に転送するコードは、次のようなものです。

add_action( 'template_redirect', function () {
    // ?s= で来たアクセスだけを対象にする(/search/ 形式のURLでは何もしない)
    if ( ! is_search() || is_admin() || ! isset( $_GET['s'] ) ) {
        return;
    }
    $keyword = get_search_query( false );
    if ( '' === $keyword ) {
        return;
    }
    wp_safe_redirect( home_url( '/search/' . rawurlencode( $keyword ) . '/' ) );
    exit;
} );

このような転送を使う場合、転送先の /search/ のURLがWordPressに届き、リライトルールに一致する必要があります。次の順に確認します。

WordPressのリライトルールを作り直す

管理画面の「設定」→「パーマリンク」を開き、何も変えずに「変更を保存」を押すと、リライトルールが作り直されます。パーマリンク設定が「基本」になっている場合、/search/ 形式のURLは使えないため、投稿名などの設定に変更します。

WP-CLIが使える場合は、検索用のURLがどのルールに一致するかを直接確認できます。

# リライトルールを作り直す
wp rewrite flush

# /search/test/ に一致するルールを表示する
wp rewrite list --match=/search/test/

結果に index.php?s=$matches[1] のようなルールが表示されれば、WordPress側は正しく設定されています。何も表示されない場合は、パーマリンク設定かプラグインによるルールの変更を疑います。

なお、テーマやプラグインのコードで flush_rewrite_rules() を毎回のページ表示で実行するのは避けてください。処理が重くなるうえ、ほかのプラグインのルールと競合する原因になります。ルールの作り直しは、プラグインの有効化時や設定の変更時だけで十分です。

サーバーのリライト設定を確認する

サーバーの素っ気ない404ページが出る場合は、/search/ のURLがWordPressの index.php に渡されていません。

Apacheでは、WordPressのディレクトリの .htaccess に # BEGIN WordPress から始まる標準のリライト設定があるかを確認します。設定があっても効かない場合は、サーバー側で .htaccess の利用が制限されている可能性があるため、サーバーの管理者や管理画面の説明を確認してください。

Nginxでは .htaccess が使われないため、設定ファイルに次のような記述が必要です。

location / {
    try_files $uri $uri/ /index.php?$args;
}

キーワードに「/」が含まれる場合

/search/ 形式では、検索語の中の「/」がURLの区切りと区別できなくなります。エンコードされた「/」(%2F)は、Apacheの初期設定ではURLのパス部分に含まれると404として扱われます。「A/B」のような語で検索したときだけ404になるなら、これが原因です。/search/ 形式への転送をやめて ?s= のままにするのが、手間の少ない解決策です。

確認3:2ページ目以降だけが404になる場合

検索結果の1ページ目は表示されるのに、ページ送りで404になる場合は、テンプレートの中で別のクエリを作って表示件数を変えていることが多いです。WordPressはメインクエリの件数でページ数を判断するため、テンプレート側だけで件数を増やすと、存在しないページへのリンクが生まれます。件数は pre_get_posts でメインクエリに設定してください。

add_action( 'pre_get_posts', function ( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( $query->is_search() ) {
        $query->set( 'posts_per_page', 20 );
    }
} );

作業前の注意と最終確認

.htaccess やNginxの設定、functions.php を編集する前には、元のファイルをバックアップしてください。特にNginxの設定は、反映前に nginx -t で構文を確認すると、サイト全体が止まる事態を防げます。

修正後は、通常の検索、結果0件の検索、2ページ目への移動、日本語や記号を含む検索をそれぞれ試し、キャッシュプラグインやCDNのキャッシュも削除してから再確認します。本記事の内容はWordPressの安定版の挙動にもとづいています(2026年10月現在)。

まとめ

  • WordPressの標準の検索は /?s= で動き、1ページ目は結果0件でも404になりません。404が出るなら、フォームかリライト設定に原因があります。
  • フォームの送信先は home_url( '/' )、入力欄の名前は s にし、追加の項目には予約語を使わないようにします。
  • /search/ 形式に転送している場合は、「設定」→「パーマリンク」の保存や wp rewrite list --match でルールを確認し、サーバー側の .htaccess やNginxの try_files も見直します。
  • ページ送りで404になる場合は、表示件数を pre_get_posts でメインクエリに設定します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲