絶望の赤いバナー:Gutenbergが失敗するとき
大事なブログ記事の推敲に3時間も費やしたとしましょう。「更新」ボタンを押し、緑色の成功通知を期待します。しかし、代わりに赤いバナーが表示されます:更新に失敗しました。返信が正しい JSON レスポンスではありません。 作業内容は保存されず、エラーにはその理由が何も記されていません。
現在のWordPressは、REST API経由でコンテンツを保存します。APIは、返ってくるデータが特定のクリーンな構造であることを期待しています。もしサーバーがデータの代わりにPHPの警告、404ページ、あるいは「近日公開」の画面などを返すと、エディタはクラッシュします。これは通常、ブラウザとサーバー間の通信遮断を示唆する、システム内部の不具合です。
根本原因の特定
これを修正するには、推測を止めてデータフローを確認する必要があります。私の経験では、これらのケースの90%は「ネットワーク」タブを確認することで解決します。
1. ブラウザ開発者ツールの活用
ブラウザの開発者ツール(F12またはCmd+Option+I)を開き、**ネットワーク(Network)**タブを選択します。WordPressでもう一度「更新」をクリックしてください。新しいエントリ(通常は赤い行)が表示されます。これは/wp-json/wp/v2/posts/101のようなエンドポイントをターゲットにしています。
- 404 Not Found: パーマリンク構造が壊れている可能性があります。
- 403 Forbidden: セキュリティファイアウォール(CloudflareやModSecurityなど)が保存リクエストをブロックしています。
- 500 Internal Server Error: 投稿の処理中にサーバーがクラッシュしました。多くの場合、PHPの
memory_limit不足が原因です。 - 200 OK(それでも失敗する場合): これはよくあるケースです。サーバーは成功コードを返しましたが、ファイルの先頭に「Notice: Undefined index」などの通知が追加されており、JSONのフォーマットが崩れています。
2. 隠されたメッセージを読み取る
リスト内の失敗したリクエストをクリックします。**レスポンス(Response)**サブタブに移動します。もし<!DOCTYPE html>で始まるHTMLコードが見えるなら、サーバーは生データの代わりにウェブページを返しています。これが決定的な証拠です。
現場で検証済みの解決策
解決策 A:パーマリンクの「リセット」
URLの内部マップが混乱することがあります。設定 > パーマリンクに移動し、単に変更を保存をクリックしてください。設定を変更する必要はありません。これにより、WordPressは.htaccessまたはNginxのルールを強制的に書き換え、REST APIのパスが即座に復旧することがよくあります。
解決策 B:HTTPSの不一致を解消する
最近SSL証明書を追加した場合、サイトが「混在コンテンツ(Mixed Content)」ループに陥っている可能性があります。これは、管理画面はHTTPSなのにAPIがHTTP経由で接続しようとしたときに発生します。Cloudflareのようなプロキシを利用しているサイトでこれを修正するには、wp-config.phpの最上部に以下のスニペットを追加します:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
解決策 C:問題のあるプラグインを見つける
コーディングが不適切なプラグイン1つで、バックグラウンドにPHPの警告が出力されることがあります。この余計なテキストがJSONレスポンスを「汚染」します。
- Classic Editorプラグインをインストールしてみてください。エラーが消えるなら、テーマやプラグインとREST APIの干渉が原因であることは間違いありません。
- Wordfenceや「All In One WP Security」などのセキュリティプラグインを一時的に無効にします。ログを確認し、
/wp-json/パスへの「ブロックされたリクエスト」がないかチェックしてください。
解決策 D:PHPエラーの非表示化
本番サイトでは、ユーザーにエラーを表示すべきではありません。WP_DEBUG_DISPLAYがオンになっていると、APIレスポンスにエラーテキストが直接挿入されてしまいます。wp-config.phpでオフにしましょう:
// 推奨される本番環境の設定
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);
これによりエディタからはエラーが隠されますが、後で確認できるようにwp-content/debug.logに保存されます。
検証:修正されたことを確認する方法
ページをリロードするだけでは不十分です。ブラウザでyourdomain.com/wp-json/にアクセスしてください。整理されたコードのようなテキストの塊が表示されるはずです。もし「404」や「メンテナンス中」のページが表示されるなら、APIは依然としてブロックされており、「正しい JSON レスポンスではありません」エラーは解消されません。
プロのヒント: レスポンスが乱雑に見える場合は、そのブロック全体をコピーして、ToolCraftのJSON Formatter & Validatorに貼り付けてください。データの中に隠れているPHPエラーメッセージの正確な行を特定してくれるため、当てずっぽうな調査に時間を費やす必要がなくなります。
最後に
「返信が正しい JSON レスポンスではありません」というエラーは、JSONそのものが原因であることは稀です。これはサーバーが「ノイズ」を発していることの兆候です。まずはネットワークタブを確認し、PHPの通知を非表示にし、パーマリンクを最新の状態に保ちましょう。多くの場合、解決策は「変更を保存」をクリックするだけで済みます。

