最近、サブディレクトリにテスト環境用のWordPressを入れて作業していたところ、固定ページや投稿を公開しようとすると
公開に失敗しました。返答が正しい JSON レスポンスではありません。
というエラーが出てしまいました。ブロックエディタを使っているときに時々見かけるエラーですが、今回はちょっと特殊な原因でした。
だいたいはSSLやサーバーのセキュリティの問題なのですが、それらの基本的な対応を行っても解消されず困ってしまいました。
状況
- 本番環境はドメイン直下にWordPressをインストールして運用中
- サブディレクトリ(例:
/testsite/
)に別のWordPressをインストールして検証中 - サブディレクトリ側のWordPressでのみ固定ページや記事を「公開に失敗しました。返答が正しい JSON レスポンスではありません。」状態になる
調べてみると…
ブロックエディタは「REST API」という仕組みを通じて保存や公開を行っています。
そこで https://example.com/testsite/wp-json/
にアクセスしてみると、なぜかトップページにリダイレクトされてしまいました。
でも https://example.com/testsite/?rest_route=/
にアクセスすると、JSONデータ(コードのかたまり)がちゃんと返ってきます。つまりREST自体は生きていて、「/wp-json/」というURLだけが壊れている状態でした。
原因
調べた結果、ルート(本番環境)のWordPressで使っていた Converter for Media というプラグインが .htaccess
に特殊なリライトルールを書き込んでいて、それがサブディレクトリにも影響していました。
このプラグインは、アップロードした画像を自動的に WebP/AVIF に変換して軽くする便利なものです。ただ、その仕組みの中で .htaccess
に RewriteOptions Inherit
を追加します。
その結果、ルート直下のリライトルールがサブディレクトリにも継承され、/wp-json/
へのアクセスがルート側に吸い込まれてしまっていたのです。
解決策
応急処置(すぐ直す方法)
サブディレクトリ側のテーマの functions.php
に以下を追記しました:
// REST API のURLを ?rest_route=/ 形式に強制
add_filter('rest_url', function ($url, $path, $blog_id, $scheme) {
$home = home_url('/', $scheme);
return add_query_arg('rest_route', '/' . ltrim($path, '/'), $home);
}, 10, 4);
これでブロックエディタが /wp-json/
ではなく/?rest_route=/wp/v2/...
を使うようになり、公開エラーは即解消しました。
このコードは基本的には どのWordPressでもそのまま使えます。
仕組みは「REST API の URL を /wp-json/
から ?rest_route=/
に強制的に書き換える」だけなので、サーバー環境やテーマを問わず動作します。
ただし、通常の環境では /wp-json/
が正常に動くので、このコードは不要です。
あくまで .htaccess の影響などで /wp-json/
が壊れている環境の応急処置 として使うもの、と考えてください。
プラグインの扱いについて
今回の原因だった Converter for Media は「画像を軽くする」ためのプラグインで、止めても見た目や機能には影響がありません。
そのため私はテスト環境では いったん停止して作業を続ける ことにしました。
根本的な解決
- Converter for Media を停止またはアンインストールする
- ルート側の
.htaccess
をWordPress標準のものに戻す(設定→パーマリンクで保存すると再生成される) - もし使い続けたいなら、サブディレクトリ環境には影響しないように調整する
まとめ
- ブロックエディタの「JSONレスポンスが正しくありません」は REST APIが動いていない サイン
- サブディレクトリ環境では、ルートのWordPressやプラグインの
.htaccess
設定が影響することがある - 今回は Converter for Media が原因で
.htaccess
が継承され、/wp-json/
が壊れていた - 応急処置として
functions.php
でrest_url
を?rest_route=/
に差し替えるとすぐ直る - 画像を軽くするだけのプラグインなので、止めても見た目や機能には影響なし。私は停止して作業を進めた
同じように「サブディレクトリでWordPressを動かしたら公開できない!」という人は、まず /wp-json/
と /?rest_route=/
をチェックしてみてください。