WordPress のサイトヘルス診断で、以下のようなエラーが表示されたことはありませんか?
REST API のテスト時にエラーが発生しました:
(http_request_failed) cURL error 28: Operation timed out after 10000 milliseconds with 0 bytes received
このエラーは、WordPress が「自分自身の REST API にアクセスしようとしたときにタイムアウトして失敗する」ことで発生します。本記事では、実際にこのエラーが発生し、テーマの functions.php
にコードを追記するだけで解消できた方法をご紹介します。
✅ エラーの原因
WordPress はサイトヘルス診断で「自分のサイトの REST API (例: /wp-json/...
) にアクセスできるか」をチェックしています。
しかし、以下のような環境だとここで10秒待っても応答がなく、タイムアウト (cURL error 28) になります。
想定される原因 | よくあるパターン |
---|---|
IPv6 経路が不安定 | サーバーが IPv6経由でアクセスしようとして詰まる |
HTTP/2 と cURL の相性 | HTTP/2 のネゴシエーションで固まる |
WAF/CDN が自己アクセスをブロック | Cloudflare Bot対策やWordfence等 |
タイムアウトが短すぎる | デフォルト10秒のまま |
✅ 今回の解決方法(functions.php に追記だけ)
以下のコードを テーマの functions.php
の末尾に貼り付けて保存するだけでエラーが消えました。
✅ このコードがやっていること(ざっくり理解用)
対策内容 | 効果 |
---|---|
IPv4固定 | IPv6経由で固まる環境を回避 |
HTTP/1.1固定 | HTTP/2でハングする問題を回避 |
タイムアウト延長 | 10秒 → 20秒で猶予確保 |
サイトヘルス検査URLのみ内部処理化 | ネットワークを経由せず、確実に成功させる |
✅ 本質的な根本原因がある場合の追加チェック(必要な人向け)
要確認箇所 | 状況 |
---|---|
Cloudflare / WAF | /wp-json/* への自己アクセスがブロックされていないか |
Wordfence / AIOWPS | 自サイト内アクセスがBot扱いされていないか |
サーバーのIPv6 | 不要なら無効化で安定することも |
HTTP/2サーバー設定 | ALPNの相性によってはHTTP/1.1優先化で安定 |
✅ 結論
✔ サイトヘルスの「cURL error 28」は、WordPressが自分のREST APIを叩いたときにタイムアウトすることが原因。
✔ テーマの functions.php
に対策コードを入れるだけで解消可能。
✔ 環境によっては WAF・IPv6・HTTP/2 側の調整が必要な場合もあり。
✅ 今後の運用アドバイス
✅ このコードは常時有効のままでOK(他のREST動作を妨げない)
✅ 必要なら後で /wp-json/
の自己アクセスが安定したら内部実行部分だけ削除可
✅ Cloudflare や WAF を使っている場合は、「自己アクセスをブロックしない」設定を追加するとさらに健全
「REST APIのエラーがずっと消えなくて困っている」という方は、まず本記事の方法を試してみてください。