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がおかしくなった」
と思いがちだけれど、実際にはそうとは限らない。
特に古いプラグインや独自開発されたプラグインの場合、
echovar_dump()- PHP Warning
- PHP Notice
- デバッグ文字列
などがREST APIのレスポンスへ混ざるだけでも壊れる。
もしプラグインを一つずつ停止できる環境なら、かなり有効な切り分け方法だと思う。
JSONエラーが出たら、JSON以外の何かが返っていないか。
ここを見るだけで原因に近づけることがある。