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です。
このサイトの場合はこんな感じ。コンテンツの量が少なければもう少し簡素な感じかも?

もし、エラーページが表示されるようなら、エラーの内容ごとに対処する必要があります。
対処法:あんまり起こらないと思うけど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エラーページのスクリーンショット、中央にはシンプルでフラットでキュートな猫のオリジナルキャラクターのイラストを配置。」です(笑)
