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]