WordPressで記事が保存できない?REST API通信エラーの原因と対処法

WordPressを使っていると、「突然記事が保存・更新できなくなった!」というトラブルに遭遇することもありますよね。

今回は備忘録として、私が実際に遭遇したREST API通信エラー(403 Forbidden)について、原因や確認したこと、対処法などをまとめたいと思います。

発生したエラーの内容

WordPress(別のWPから複製したて)にて投稿を保存・更新しようとしたとき、なぜか何回ボタンをクリックしても処理が実行されず、記事の修正内容が未保存の状態になってしまうことがありました。

デベロッパーツール(ブラウザの開発者ツール)を確認したところ、以下のような403エラーが表示されていることを確認。

XHRGET http://test.jp/wp-json/wp/v2/templates/lookup?slug=front-page&_locale=user
[HTTP/1.1 403 Forbidden 2275ms]

XHRGET http://test.jp/wp-json/wp/v2/blocks?context=edit&per_page=100&page=1&_locale=user
[HTTP/1.1 403 Forbidden 1505ms]

XHROPTIONS http://test.jp/wp-json/wp/v2/settings?_locale=user
[HTTP/1.1 403 Forbidden 2203ms]
...(省略)

さらに、エラーのレスポンスの中身を見ると以下のような内容が返ってきていました。

{
  “code”: “rest_cookie_invalid_nonce”,
  “message”: “Cookie チェック失敗”,
  “data”: { “status”: 403 }
}

このエラーの意味

このエラーは、WordPressがREST API通信時にCookieのチェックに失敗していることを示しているようです。
主な原因としては、以下が考えられます。

  • キャッシュの影響
  • Cookieの無効化
  • サイトアドレスの不整合
  • サーバーやプラグインの設定ミス など

確認したこと一覧

こういう時一番怪しそうなキャッシュプラグインやWAF設定は問題なし。
WordPressの複製作業もよく行っているサーバーだったため、特に思い当たる原因はなく…

ひとまずREST API通信エラーでよく見かける確認事項を一つずつトライ。

1. パーマリンク設定を変更せずに「保存」ボタンを押す
→ 再構築が走るので、URL周りの設定に変化が出る場合があります。

2. WordPressのデバッグモードを有効にし、エラーログを確認
→ wp-config.php にて WP_DEBUG を有効にしてエラーログをチェック。

// WP_DEBUG モードを有効化
define( 'WP_DEBUG', true );

// /wp-content/debug.log ファイルへのデバッグログの出力を有効化
define( 'WP_DEBUG_LOG', true );

// エラーと警告の画面への表示を無効化
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

3. 以下を一時的に無効化して再現性を確認

  • キャッシュ系プラグイン
  • すべてのプラグイン
  • サーバーのWAF(Web Application Firewall)

4. .htaccess の記述ミスを確認
→WordPress関連の記述以外に余計なコードが混ざっていないか確認。

5. ファイル・フォルダーのパーミッション確認
→ 不適切なパーミッションやアクセス制限がないか確認。

6. WordPressアドレスとサイトアドレスが一致しているか
→ ここが今回の根本原因でした(詳細は後述)。

7. ブラウザのキャッシュ・Cookieをクリア、またはブラウザ変更
→ FirefoxでだめでもChromeでうまくいく場合があります。

実際の原因と対応

順繰りに確認した結果、私の場合はWordPressの管理画面「設定 > 一般」にある下記設定が原因でした。

・WordPress アドレス (URL):http://example.com/wp/
・サイトアドレス (URL):http://example.com/

よくあるWordPressインストールディレクトリとサイトトップを分ける方法をとっていたんですが、
これがどうやら良くなかった模様。
サイトアドレスを/wp/に戻したところ、問題なく記事の公開・保存処理ができました

おそらくWordPressの内部的な処理がうまくいかず、URLが正しく反映されなかったことでREST APIとの通信時に問題が出たように思われます。

対応方法

wp-config.php に以下を追記し、明示的にアドレスを指定しました。

define('WP_HOME', 'http://example.com');
define('WP_SITEURL', 'http://example.com/wp');

それでもFirefoxでは挙動が変わらなかったものの、その後ブラウザをFirefoxからChromeに変更したところ、
初回はWP管理画面の上部に以下のようなエラーメッセージが出現。

Cookie がブロックされているか、お使いのブラウザーで未対応のようです。WordPress を使うには Cookie を有効化する必要があります。

しかし、ページをリフレッシュすると無事にログイン成功。
記事の更新・公開も問題なく動作するようになりました!

まとめ:REST APIエラーが出たらひとつずつ原因を切り分けよう

今回はあまりいじれる環境じゃなかったため、原因と対処法が確実なものなのか検証不足感が否めないですが、、
あくまで「今回はこの手順で結果的に解消した」という備忘録として、
今後再び遭遇した時用に確認ポイントをまとめます。

プラグイン/WAF一時的に停止して確認
Cookie/キャッシュ削除、無効化してリトライ。ブラウザ切り替え
サイトURLWP_HOME / WP_SITEURL が一致しているか確認。
していなければwp-config.phpで明示
.htaccess書き換えミスやルールの競合を確認
パーミッション不適切なパーミッションや
アクセス制限の可能性を確認


同じようなREST APIエラーに遭遇した場合は、都度ブラウザのキャッシュに気を付けつつ、上記を順番に確認してみることをおすすめします。

同じようなトラブルに遭遇した方の助けになれば幸いです!