サブディレクトリにインストールしたWordPressで「公開に失敗しました」エラーが出たときの対処法

最近、サブディレクトリにテスト環境用の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 に変換して軽くする便利なものです。ただ、その仕組みの中で .htaccessRewriteOptions 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.phprest_url?rest_route=/ に差し替えるとすぐ直る
  • 画像を軽くするだけのプラグインなので、止めても見た目や機能には影響なし。私は停止して作業を進めた

同じように「サブディレクトリでWordPressを動かしたら公開できない!」という人は、まず /wp-json//?rest_route=/ をチェックしてみてください。

Home
サービス
制作実績
デザイナー紹介
公式LINE
問合せ