WordPress の Contact Form 7 プラグインが動かなくなったときの対処法
症状
WordPress の Contact From 7 プラグインを導入しているサイトで、お問い合わせフォームを送信するとプログレスアイコンが回ったまま送信できない。
お問い合わせ送信時のリクエスト POST /wp-json/contact-form-7/v1/contact-forms/8/feedback
を見てみると、コード 404 で次のエラーが返ってきている。
{ "code": "rest_no_route", "message": "URLとリクエストメソッド(request method)に合ったルートがありません", "data": {"status": 404} }
どうも問題が発生する Contact Form 7 のバージョンは 4.8 らしい。
原因1:カスタム投稿タイプの show_in_rest が有効でない
カスタム投稿タイプを使用している場合、register_post_type()
でカスタム投稿タイプを作成する際に show_in_rest
というオプションを指定する必要がある。
<?php register_post_type('CustomPage', [ 'public' => true, 'label' => 'カスタムページ', ... 'show_in_rest' => true, ]);
原因2:サーバの設定で rewrite (Apache の場合) が設定されている
サーバが Apache の場合は次の順で原因を調べる。
1. WordPress のインストールディレクトリに .htaccess があれば内容を確認し、/wp-json/...
がマッチするルールがないか確認する
2. なければその親ディレクトリを順に調べる
3. それもなければ Apache の設定ファイルを調べる
さくらのレンタルサーバの場合
今回の場合はさくらのレンタルサーバを使用しており、ユーザ領域以外で次のルールが設定されているようだ。
- URL の末尾にスラッシュ / がなく、ファイルとしてリソースが存在しない場合は自動的にスラッシュ / を付加した URL にリライトする
この動作をユーザ領域で上書きするため、WordPress のインストールディレクトリにある .htaccess に次の設定を記述する。
# /wp-json/ で始まるリクエストは、URL はそのままで index.php で処理する RewriteEngine On RewriteCond %{REQUEST_URI} ^/wp-json/ [NC] RewriteRule .* index.php [L]