2026年8月28日
2026年8月28日
WordPressの「cURL error 28」タイムアウトエラーの原因と対処法
「cURL error 28」は、WordPressが外部(または自分自身)へHTTP通信をしたときに、決められた時間内に応答が得られず打ち切られたことを示すエラーです。WordPress本体の不具合ではなく、通信経路・DNS・相手側サーバー・自サイトのプラグインのどこかで待たされていることが原因です。この記事では、エラーが出る場所ごとの意味を整理し、サーバー上で通信を再現して原因を絞り込み、適切に直すまでの手順を説明します。
エラーメッセージの意味
表示される文言は、おおむね次のどれかです。
cURL error 28: Operation timed out after 10001 milliseconds with 0 bytes receivedcURL error 28: Connection timed out after 5001 millisecondscURL error 28: Resolving timed out after 5000 milliseconds
cURLはPHPがHTTP通信に使うライブラリで、28番は「タイムアウト」を表します。文末の内容で、どの段階で止まったかが分かります。
- Resolving timed out:ドメイン名からIPアドレスを引く(DNS解決)段階で止まった
- Connection timed out:相手サーバーへの接続そのものが確立できなかった
- Operation timed out ... 0 bytes received:接続はできたが、応答が返ってこなかった
ミリ秒の数字は、そのリクエストに設定されていたタイムアウト値です。WordPressの wp_remote_get() などは、指定が無ければ5秒で打ち切ります。サイトヘルスのループバック確認など、一部の処理は独自に長めの値を使います。
どこでエラーが出ているかで原因の方向が変わる
同じ「cURL error 28」でも、出た場所によって疑う対象が違います。
- 「ツール」→「サイトヘルス」で、REST APIやループバックリクエストの失敗として表示される:WordPressが自分自身のURLへ通信して失敗しています。自サイト側(プラグイン、PHPセッション、Basic認証、サーバーのファイアウォール)を疑います。
- プラグイン・テーマの更新や、新規インストールで失敗する:WordPress.org など外部への通信が届いていません。サーバーの外向き通信、DNS、IPv6の扱いを疑います。
- 特定プラグインの外部API連携(決済、メール配信、SNS連携など)で出る:その相手先が遅いか、自サーバーからその相手先への経路に問題があります。
ステップ1:サーバー上で通信を再現する
ブラウザでは開けるURLでも、サーバーからは届かないことがあります。判断はサーバー側から行うのが基本です。
WP-CLIでWordPressと同じ方法で試す
WP-CLIが使える場合は、WordPressのHTTP APIを使って同じ通信を試します。
wp eval '$r = wp_remote_get( "https://api.wordpress.org/", array( "timeout" => 15 ) ); echo is_wp_error( $r ) ? $r->get_error_message() : wp_remote_retrieve_response_code( $r ); echo PHP_EOL;'
ステータスコード(200など)が出れば、少なくとも15秒以内には通信できています。5秒では失敗し15秒なら通るなら「相手が遅い」、15秒でもエラーなら「経路が詰まっている」と判断できます。自サイトへのループバックを試すときは、URLを自分のサイトのアドレスに置き換えます。
SSHでcurlコマンドを使う
SSHが使える場合は、curlの詳細表示で、どの段階で時間がかかっているかを見られます。
curl -v -m 20 -o /dev/null https://api.wordpress.org/
curl -4 -v -m 20 -o /dev/null https://api.wordpress.org/
1行目が名前解決や接続で止まり、-4(IPv4に限定)を付けた2行目がすぐ通るなら、サーバーのIPv6通信がうまく機能していない可能性が高いです。名前解決で止まる場合は、サーバーのDNS設定(リゾルバー)の問題です。
ステップ2:自サイト側の原因を切り分ける
プラグイン・テーマの競合
ループバックの失敗は、プラグインが原因であることが多いです。プラグイン「Health Check & Troubleshooting」のトラブルシューティングモードを使うと、ログイン中の自分だけ、すべてのプラグインを無効にしてデフォルトテーマに切り替えた状態でサイトヘルスを再確認できます。これでエラーが消えれば、プラグインを1つずつ戻して原因を特定します。
PHPセッションによる待ち合わせ
プラグインが session_start() でPHPセッションを開いたまま閉じないと、同じセッションを使うループバックリクエストが前のリクエストの終了を待ち続け、タイムアウトになります。サイトヘルスでは、PHPセッションが作成されているという趣旨の警告が同時に出ることがあります。この場合は、該当プラグインの更新を確認し、改善されなければ作者へ報告するか、代替プラグインを検討します。
Basic認証やIP制限
ステージング環境などでサイト全体にBasic認証やIP制限をかけていると、WordPressから自分自身への通信も止められます。サーバーのIPアドレスからのアクセスを許可するか、検証環境であればループバックの警告は既知のものとして扱います。
外部通信を止める定数
wp-config.php に WP_HTTP_BLOCK_EXTERNAL が true で定義されていると、WP_ACCESSIBLE_HOSTS に書かれたホスト以外への通信はWordPressが遮断します。この場合はタイムアウトではなく別のエラー文になりますが、設定の確認ついでに見ておくと、ほかの原因と混同せずに済みます。
ステップ3:原因に合わせて直す
作業の前に、wp-config.php や functions.php、自作プラグインのファイルはバックアップを取ってから編集してください。
相手先が遅いだけなら、そのリクエストだけ待ち時間を延ばす
外部APIの応答が遅いことが分かっている場合は、その相手先へのリクエストに限ってタイムアウトを延ばします。サイト全体の通信の待ち時間を延ばすと、相手先が落ちたときに管理画面全体が重くなるため、対象を絞るのが安全です。
add_filter( 'http_request_args', function ( $args, $url ) {
if ( 'api.example.com' === wp_parse_url( $url, PHP_URL_HOST ) ) {
$args['timeout'] = 20;
}
return $args;
}, 10, 2 );
api.example.com は実際の相手先ドメインに置き換えます。自作プラグインかテーマの functions.php に追加します。プラグイン側に「タイムアウト」の設定項目がある場合は、まずそちらを使ってください。
IPv6で詰まっているなら、サーバー側で直すのが本筋
IPv6の経路が機能していないのが原因なら、本来はサーバー管理者やホスティング会社に、外向きIPv6通信の状態を確認してもらうのが本筋です。すぐに手を打てない場合の一時しのぎとして、WordPressのcURL通信をIPv4に限定する方法があります。
add_action( 'http_api_curl', function ( $handle ) {
curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
}, 10, 1 );
これはサーバー側の問題を隠すだけなので、原因が解消したら外します。
外向き通信が遮断されているなら、ファイアウォールを確認する
VPSやクラウドで自分でサーバーを管理している場合は、ファイアウォール(iptables、ufw、クラウドのセキュリティグループなど)で、外向きの80番・443番ポートが許可されているかを確認します。レンタルサーバーで更新だけが失敗する場合は、サーバー会社の障害情報や、海外への通信制限の設定が無いかを確認します。
やってはいけない対処
検索すると「sslverify を false にする」という対処が見つかることがありますが、これは証明書の検証を止めるだけで、タイムアウトの解決にはなりません。通信の安全性を下げるので使わないでください。同様に、タイムアウトを数分単位に延ばすのも、根本原因を隠したまま管理画面を重くするだけです。
直ったかどうかの確認
「ツール」→「サイトヘルス」を開き直し、REST APIとループバックに関する項目が問題なしになっているかを確認します。サイトヘルスの結果は一定時間キャッシュされることがあるため、反映されない場合は少し待ってから再読み込みします。更新が失敗していた場合は、「ダッシュボード」→「更新」で再チェックし、プラグインの更新が通るかを試します。サイトヘルスの項目名や表示はWordPressのバージョンで変わることがあります(2026年10月現在)。
まとめ
- 「cURL error 28」はHTTP通信のタイムアウト。文末の Resolving / Connection / Operation で、止まった段階が分かる
- サイトヘルスのループバックで出るなら自サイト側(プラグイン、PHPセッション、Basic認証)、更新で出るならサーバーの外向き通信やDNS・IPv6を疑う
- WP-CLIの
wp_remote_get()やSSHのcurl -vで、サーバー上から通信を再現して切り分ける - 遅い相手先だけ
http_request_argsでタイムアウトを延ばし、sslverifyの無効化や全体的な延長は避ける