【原因・解決方法】WordPressで「更新に失敗しました。 返答が正しい JSON レスポンスではありません。」と表示され投稿が保存できない( https://[サイトドメイン]/wp-json/wp/v2/blocks/[投稿番号]?_locale=user が404エラーになる)

WordPressで記事を投稿または編集していて、「公開」ボタンをクリックすると、「更新に失敗しました。 返答が正しい JSON レスポンスではありません。」と表示されて投稿が保存できなかったり、更新できなかったりする現象について対処方法を3つ書いておきます。

原因

あんまり特殊なことをしてないなら、多くの場合の原因は3つです。

  • .htaccessにバグがあるか、パーマリンクが有効になって無くて REST-API って機能に到達できない。
  • そもそも REST-API が何らかの原因で無効になっている。
  • REST-API へのアクセスが何らかの原因で遮断されている。

もし、何らかの事情でwordpressインストールフォルダを変更しているなら次の原因が考えられます。

  • サイトのルートフォルダにあるindex.phpのwp-headerへのパスが間違ってる。

なので順次解決方法を書いていこうと思います。

まず「REST-API が有効になっているか確認する」

…の前に、そもそもREST-APIとは

WordPressには、REST-APIと呼ばれる特別な機能が備わっています。これは、まるで「データにアクセスできる秘密の扉」のようなもので、外部のアプリやサービスとWordPressを繋げ、様々なことができるようになります。例えばこんなことが出来ます。

  • スマホアプリでブログ記事を投稿
  • SNSに自動的に記事を投稿
  • 他のサイトから商品情報を取り込む
  • 会員制のサイトを作る

言い換えれば、REST-APIは、URLとデータを使って、外部のアプリやサービスと通信する仕組みです。特定の形式のURLとデータを送信して色々な事が出来ます。

メリットとしては、「様々なアプリやサービスと連携」「Wordpressの操作の自動化」「開発者にとって便利」という点が挙げられます。
デメリットとしては「実際に使うとなるとちょっと難しい」「どうしてもセキュリティ対策が必要」という点でしょうか。

動作してるか確認する方法

REST-APIが有効になっているかどうか確認する一番簡単な方法は、 https://[あなたのサイトのドメイン]/wp-json にアクセスして、エラーページにならずに、なんか文字がいっぱい表示されたら(jsonが表示されたら)OKです。

このサイトの場合はこんな感じ。コンテンツの量が少なければもう少し簡素な感じかも?

正常な REST API の例

もし、エラーページが表示されるようなら、エラーの内容ごとに対処する必要があります。

対処法:あんまり起こらないと思うけど500エラーの場合

これはあんまり起こらないと思いますが一応。普通にプラグインやテーマでエラーが起こっている場合と、インストールルートフォルダに入っている index.php でエラーが起こっているパターンです。

プラグインをひとつづつON/OFFしていって、エラーが解消しないか確認します。もし特定のプラグインでエラーが起こるなら、そのプラグイン開発者に連絡してバグを修正してもらいます。

また、変な有料テーマとか使っている場合には、テーマをWordpress標準の者に変更してエラーが解消しないか確認します。もしテーマが原因なら、テーマ開発者に連絡して(以下略

それでもエラーが解消しない場合には、index.phpのエラーの可能性があります。index.phpは、標準だとこのようになっていると思います。

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php';

この、17行目「require __DIR__ . ‘/wp-blog-header.php’;」ってなってると思うんですが、このファイルと同じディレクトリに wp-blog-header.php ファイルが無ければここでエラーになります。パスを修正して、 例えばインストールフォルダが /wp なら、「 require __DIR__ . ‘/wp/wp-blog-header.php’; 」に修正します。

対処法:400(ページが見つかりません)エラーの場合

こっちが起こる可能性が大きいです。理由も様々なので色々書きます。

対処法1:プラグインでREST-APIを無効にしてないか確認する

ちゃんとメンテされているプラグインでは起こりにくいですが、一部のセキュリティプラグインや更新してないプラグインでは、REST-APIを無効にする設定項目があるはずです。ログインしていないユーザーに対して REST-API を無効にするのは良いんですが、ログインしているユーザーに対しては有効化してください。

対処法2:.htaccessにバグが無いか確認するか、.htaccessファイルを再生成する

WordPressのインストールフォルダにある.htaccessに書き間違いがないか確認します。…っても.htaccessに間違いがあるかどうか分からんですよね(笑)

てなわけで再生成します。管理画面にログインして、「設定→パーマリンク」に移動します。

設定→パーマリンク

「パーマリンク構造」が「基本」だとREST-APIは動作しないです。「投稿名」を選択して、「変更を保存」ボタンをクリックすると,htaccessファイルが再生成されます。

もし上手く行かない場合は、一度FTPなどで.htaccessファイルを別の名前で保存(バクアップ)してから、再度「パーマリンク構造」で「投稿名」を選んで「変更を保存」ボタンをクリックすると、.htaccessファイルが再生成されると思います。

(補足):一部のプラグインの中には、セキュリティ確保や高速化のために .htaccess を書き換えたり追記したりするものがあります。プラグインが悪さをして勝手に変な設定になってないか、プラグインの設定項目も確認する必要があるかもしれません。

対処法3:(テスト環境や開発者に多いかも)mod-rewriteが有効になっているか確認します。

上の対処法と同じなんですが、要するに.htaccessが正しく生成されていても、サーバ側の機能で、mod_rewrite機能が有効になってないと、REST-APIが動作しません。Apache使ってるけど有効になってないとか、nginxを使っているって場合です。具体的に有効にする方法は「mod-rewrite 確認」とか「mod-rewrite 有効化」とかでググれば色々出てくると思います。AIに聞いてもいいかも?知らんけど(笑)

対処法4:(今後増えていくかもしれない)WAFを無効化するか適切に設定する

WAFって何やねん

最近のレンタルサーバだと標準でついている機能です。

WAF(Webアプリケーションファイアウォール)は、Webアプリケーションへの攻撃を検知・遮断するセキュリティ対策ソフトです。(ハードウェア製品もあります。)Webサーバーに設置することで、Webアプリケーションの脆弱性を悪用した攻撃からWebサイトを保護してくれるやつです。

WAFのメリットとしては、Webアプリケーションの脆弱性を悪用した攻撃からWebサイトを保護できるとか、セキュリティ担当者の負担を軽減できるとか、Webサイトの信頼性を向上できるとかです。

WAFの導入デメリットとしては、誤検知が発生する可能性がある(※今回がまさにそれ)・あと無敵ではない(すべての攻撃を防げるわけではない)という側面があります。

これが原因と考えられるヒント

「一部の投稿は保存できるけど、ある特定の投稿は保存できない。」みたいな現s等が起こる時は、WAFが通信を遮断してる場合があります。(うちの場合はこれでした)

てなわけで対策(というかWAFを無効にするだけだけど…)

さくらインターネットの場合は、レンタルサーバコントロールパネルにログインして、「セキュリティ」→「WAF設定ドメイン」に進みます。

すると、今このレンタルサーバで利用しているドメインの一覧が出てくると思います。

で、ドメインの横に「設定」ボタンがあるので、ここをクリックして「利用しない」にチェック、保存ボタンをクリックします。

ずっと「利用しない」だと怖いので、自分の場合は問題が起こったときだけ一時的に「利用しない」に設定してます。

その他

この問題は結構こまめに起こっているし、原因も様々なので一般的な対応が難しいです。また何か情報があったら追記していこうと思います。

ちなみに、アイキャッチ画像はAIが考えた「クリエイティブでカワイイ404エラーページのスクリーンショット、中央にはシンプルでフラットでキュートな猫のオリジナルキャラクターのイラストを配置。」です(笑)

質問・コメントなどあると嬉しいです