タグアーカイブ レビュー

Site Reviewsでレビュー送信が失敗するJavaScriptエラーの原因と対処法

Site Reviewsでレビュー送信が失敗するJavaScriptエラーの原因と対処法

Site Reviews 8.3系でレビュー送信時に「Cannot read properties of undefined (reading 'json')」というJavaScriptエラーが出る場合、ページ内の別のスクリプトが window.fetch 関数を置き換えている可能性が最も高い。8.2系まではXMLHttpRequestを使っていたため問題が起きず、8.3系でfetch APIに移行したことで表面化しやすい。

なぜSite Reviewsでレビュー送信が失敗するのか

なぜSite Reviewsでレビュー送信が失敗するのか

Site Reviewsは8.3.0でレビュー送信の仕組みを変更し、REST APIエンドポイントを優先して使うようになった。REST APIが使えない場合は従来のadmin-ajax.phpにフォールバックする。しかし、フォールバック時にfetchの戻り値がundefinedになり、.json() を呼び出せずにエラーになる。

このエラーが起きる根本原因は、テーマや他のプラグインが読み込むスクリプトがwindow.fetchを独自実装で上書きしていることだ。上書きされたfetchは本来のPromiseを返さず、undefinedを返す。そのため応答をJSONとして解釈できず、送信処理が止まる。

Before(8.2系) XMLHttpRequestを使い、別スクリプトの影響を受けにくい
↓
After(8.3系) fetch APIに変更され、上書きの影響を受ける
■ 別スクリプトがfetchを置き換えると、Promiseではなくundefinedが返り .json() でエラーになる

このデモは、8.2系から8.3系への変更で、別スクリプトの干渉を受ける余地が生まれた流れを示している。

ブラウザコンソールでfetch関数の状態を確認する手順

ブラウザコンソールでfetch関数の状態を確認する手順

まず、ブラウザのデベロッパーツールを開き、コンソールタブに移動する。以下の確認を順に行うと、window.fetchが上書きされているかを特定できる。

STEP 1 コンソールで fetch.toString() を実行する
↓
STEP 2 出力が function fetch() { [native code] } になっているか確認する
↓
STEP 3 次に await fetch(location.href) を実行する
↓
STEP 4 Responseオブジェクトが返れば正常、undefinedやエラーなら上書きが疑われる

コンソールに function fetch() { [native code] } と表示されれば、ブラウザ標準のfetchが使われている。もし別の関数名やカスタムコードが表示されたら、それが送信エラーの原因だ。

REST APIが無効化されていないか確認する方法

REST APIが無効化されていないか確認する方法

Site Reviews 8.3系は、/wp-json/site-reviews/v1/ という独自のRESTエンドポイントを使う。一般的なWordPress REST API(/wp-json/wp/v2/)を無効化していても影響はないが、セキュリティ対策でREST API全体をブロックしていると、フォールバック動作に不具合が出ることがある。

  • ブラウザのネットワークタブで /wp-json/site-reviews/v1/ へのリクエストが404や403になっていないか確認する
  • セキュリティプラグインでREST APIをブロックする設定を一時的に無効化する
  • CloudflareのWAFルールやファイアウォールで /wp-json/ をブロックしていないか確認する
  • .htaccessやNginx設定にREST APIを拒否するルールがないか調べる

もしREST APIが使えない状態でも、Site Reviewsはadmin-ajax.phpにフォールバックする設計なので、通常は完全に送信できなくなることは少ない。エラーが続く場合は、むしろfetchの上書きを疑う方が早い。

キャッシュプラグインとCloudflareの設定を見直す

キャッシュプラグインとCloudflareの設定を見直す

LiteSpeed CacheやCloudflareのJavaScript最適化機能が、Site Reviewsの送信スクリプトに干渉することがある。特にログアウトした訪問者向けのキャッシュは、nonceと呼ばれる送信用トークンの有効期限とずれやすく、予期しないエラーを引き起こす。

  • LiteSpeed CacheのJavaScript最適化、結合、遅延読み込みをすべて無効化する
  • CloudflareのRocket LoaderとAuto Minifyをオフにする
  • Cloudflareのキャッシュルールで /wp-json/ と /wp-admin/admin-ajax.php をキャッシュから除外する
  • 変更後は必ずキャッシュをパージして、シークレットウィンドウで再テストする
Before JS最適化とキャッシュが有効で、送信スクリプトが改変される
↓
After JS最適化を無効化し、キャッシュ除外設定を追加して送信できる状態にする

ロールバックとデータ保全の判断基準

ロールバックとデータ保全の判断基準

どうしても解決しない場合は、Site Reviewsを8.2.2に一時的に戻す方法がある。ただし、既存のレビューや画像データはデータベースに保存されているため、プラグインを無効化したり削除したりしても消えることはない。安全にロールバックするには、必ず事前バックアップを取る。

ロールバック前に確認すべき点をリストで示す。

  • サイト全体のバックアップ(データベースとファイル)を取得する
  • ステージング環境で8.2.2に戻し、送信と表示に問題がないかテストする
  • 8.3系で追加された機能やデータ構造の変更が、8.2系で読み込めるか確認する
  • 開発者による修正版のリリース状況を確認し、可能なら最新のパッチを待つ

特に、8.3系から導入されたREST API関連のオプションが8.2系で無視されるか、エラーにならないかを確認してから戻すのが安全だ。

よくある質問

Site Reviewsのレビュー送信だけが失敗するのはなぜ?

他の機能は正常でも、レビュー送信にだけfetch APIを使うため、ページ内のスクリプトがfetchを上書きしていると送信だけが失敗する。8.3系で顕在化したのは、8.2系までのXMLHttpRequestが影響を受けなかったからだ。

window.fetchが置き換えられている場合、どう直せばいい?

まず、原因となるスクリプトを特定する。テーマのカスタムJavaScriptや、広告・解析系のプラグインが疑わしい。原因のプラグインを無効化するか、カスタムスクリプトを修正して、元のfetchを呼び出すようにする。一時的な回避策として、Site Reviewsを8.2.2に戻す方法もある。

REST APIを無効化しているとレビュー送信に影響する?

Site Reviewsは独自の /wp-json/site-reviews/v1/ を使うため、通常のWordPress REST APIを無効化しても直接の影響はない。ただし、サイト全体でREST APIをブロックしている場合は、admin-ajax.phpへのフォールバックに失敗し、送信エラーが起きることがある。

キャッシュプラグインのJavaScript最適化を有効にしたままだとどうなる?

JavaScriptの結合や圧縮、遅延読み込みによって、Site Reviewsの送信スクリプトの実行タイミングがずれたり、コードが一部欠落したりする。ログアウトユーザー向けのキャッシュが原因でnonceが古くなると、送信が拒否されるケースもある。

ロールバックしてもレビューデータは消えない?

レビュー本文や画像、評価値はWordPressのデータベースに保存されているため、プラグインのダウングレードや無効化では消えない。ただし、データベース構造の互換性の問題が起きる可能性はあるため、必ずバックアップを取ってからロールバックする。

この記事のポイント

  • Site Reviews 8.3系の送信エラーはwindow.fetchの上書きが隠れた原因になりやすい
  • ブラウザコンソールでfetch.toString() とawait fetch(location.href) を確認する
  • REST APIのブロックは /wp-json/site-reviews/v1/ を許可して確認する
  • キャッシュプラグインとCloudflareのJavaScript最適化を無効化して切り分ける
  • ロールバック前に必ずバックアップとステージングテストを行う