Hi all,
I was having the same problem once I moved to a new host. I have figured it out. Luckily, the hosting company is run by a friend of mine. YMMV.
The issue that I was having was caused by the design of the network on which the site is hosted. In order to improve the performance, my host load-balanced across 3 servers using some form of load-balancer. The nodes that actually serve the pages have private addresses. Finally, my site is hosted with name-based virtual hosting (several sites behind a single IP address). I would think that this is a VERY common design.
WordPress apparently executes a request originating from the node to blogname.com/wp-cron.php. That does not work from the nodes. The nodes do a DNS lookup, but it returns the external address and sends the request out to the load-balanced address. This usually won’t work due to NAT issues.
If you have shell access to your site, you can test this by issuing the command:
wget https://blogsite.com/wp-cron.php
It will likely fail. If so, we have found the culprit. Now how do we fix it?
I see several possible solutions, but the easiest seems to be to create an entry in the /etc/hosts file on each node to trick the server into hitting its inside address. This could be integrated into Fantastico and others’ auto-installs. However, some hosts might be iffy about doing it.
You could build loopbacks on the nodes (same as the outside address), but you would also have to add the loopback to the apache vhost config. This would trick the server into staying local to fetch the URL.
The ISP could have different DNS for the inside to serve the nodes the private addresses.
Ideally, WordPress will change the code to execute the fetch differently. I’m a network guy, not a coder.