cURL error 28: Connection timed out appears in error logs and email digests when WordPress’s HTTP layer gives up on an outbound request — an update check, a plugin phoning its license server, a feed fetch. The error is honest but incomplete: it names the moment of failure, not the party at fault. Three suspects, in order of likelihood.
Suspect 1: The other server is slow or down
The majority of cURL 28s: the external API being called (a license server, a shipping-rate API, a social feed) is slow. Nothing on your site is wrong — the fix belongs to the provider, or your plugin needs its timeout raised so the request succeeds eventually. Identify the caller: the error usually appears inside a plugin’s log or its admin notice; debug.log backtraces name the file too.
Suspect 2: Your server’s DNS resolution
The sneaky one: if your server’s DNS resolver is slow or broken, every outbound request accumulates resolution time, and unrelated plugins start timing out together. Test from SSH: curl -w "dns %{time_namelookup}s connect %{time_connect}s total %{time_total}s. namelookup above ~1s consistently → fix the resolver (
" -o /dev/null https://api.wordpress.org/etc/resolv.conf, use 1.1.1.1/8.8.8.8). This one misconfiguration explains clusters of mysterious timeouts on otherwise fine sites.
Suspect 3: Timeouts tuned wrong
- PHP
max_execution_timetoo low kills long legitimate requests — batch imports and webhooks need 120s+. - Plugin-level HTTP timeouts: well-behaved plugins expose them; badly-behaved ones block page generation on a 30-second hang. Any plugin that calls an external API during front-end page loads is a performance liability regardless — the audit technique is in the performance test.
- Cron-heavy sites: wp-cron making outbound calls on every visit amplifies hangs — offload to real cron (the standard fix, one wp-config line).
The diagnostic routine
- Find the failing request’s target URL (log or plugin).
- From the server, curl that URL with timing breakdown — if it times out there too, the fault is external or DNS.
- If external: raise the plugin’s timeout, or schedule its call off the page path.
- If DNS: fix the resolver; if neither: your host’s firewall may be blocking outbound — ask support with the URL in hand.
An outbound HTTP request from your server timed out — the remote server answered too slowly. The fix is usually on the remote side, your server's DNS, or the calling plugin's timeout setting. The debug.log backtrace names the calling file. Query Monitor also records outgoing HTTP requests with timing, attributed to the plugin that made them. Usually DNS: a slow resolver delays every outbound connection's namelookup. Test with curl -w timing from SSH; if namelookup exceeds ~1s, switch to a faster resolver. Only for legitimate long operations (imports, webhooks). For page-load hangs it masks a plugin blocking the front end on a slow external call — fix the caller instead.What does cURL error 28 mean in WordPress?
How do I find which plugin causes cURL timeouts?
Why do multiple plugins time out at once?
Should I raise PHP max_execution_time to fix cURL 28?