Random Circuits
Experiment log

WordPress「返答が正しいJSONレスポンスではありません」の意外な原因

WordPressでページを更新しようとすると、

「更新に失敗しました。返答が正しいJSONレスポンスではありません。」

というエラーが出ることがある。

このエラー、原因の範囲が結構広い。

パーマリンク、SSL、REST API、WAF、プラグイン競合など、いろいろ疑う必要がある。

今回遭遇したケースは、その中でもなかなか面白かった。

原因はプラグインのPHPコードだった。

GutenbergはREST APIを使っている

現在のWordPressのブロックエディターは、ページを保存するときにREST APIを利用している。

つまりWordPress側からJSON形式のデータが返ってくることを期待している。

ところが今回、REST APIのレスポンスを確認すると、本来のJSONの前に余計なJavaScriptが出力されていた。

原因のコードは、あるプラグイン内にあった。

PHPの処理中で、

echo

を使って <script> を直接出力していた。

通常のページ表示なら問題にならない。

しかしREST API実行時にも同じコードが走ってしまう。

するとレスポンスは、

「JSONだけ」

ではなく、

「scriptタグ+JSON」

になってしまう。

当然WordPress側は、

「これは正しいJSONじゃない」

と判断する。

プラグインを無効化すると直った

原因切り分けとして一番分かりやすかったのが、問題のプラグインを無効化することだった。

無効化するとページ更新成功。

有効化するとJSONエラー。

ここまで来ればかなり絞れる。

さらにコードを確認すると、REST API実行中にも直接出力する処理が走っていることが分かった。

最終的には、REST APIの場合にはその出力処理を行わないよう修正した。

これでプラグインを有効にしたまま、Gutenbergから正常に更新できるようになった。

JSONエラー=WordPress本体とは限らない

このエラーを見ると、

「WordPressがおかしくなった」

と思いがちだけれど、実際にはそうとは限らない。

特に古いプラグインや独自開発されたプラグインの場合、

などがREST APIのレスポンスへ混ざるだけでも壊れる。

もしプラグインを一つずつ停止できる環境なら、かなり有効な切り分け方法だと思う。

JSONエラーが出たら、JSON以外の何かが返っていないか。

ここを見るだけで原因に近づけることがある。