You scheduled a post for 9:00 this morning, and at lunchtime it’s still sitting in the dashboard with a red “Missed schedule” label. Nothing was wrong with the post. What failed is the small background system WordPress uses to publish it, and once you understand how that system works, the cause is usually easy to find.
How WordPress actually publishes a scheduled post
WordPress doesn’t have a clock running in the background. Scheduled posts, along with plugin tasks like backups and update checks, are handled by WP-Cron, and WP-Cron only runs when something loads a page on your site. WordPress’s own developer documentation puts it plainly: WP-Cron checks the list of scheduled tasks on every page load, and it is only triggered on page load, unlike a real server cron job that runs on its own.
So a post scheduled for 9:00 doesn’t publish at 9:00. It publishes on the first page load after 9:00 that manages to trigger WP-Cron. If that trigger never arrives, or arrives but fails, the scheduled time passes and WordPress marks the post as missed.
That gives you four common causes, and they’re worth checking in order.
Cause 1: nobody visited the site
On a new or low-traffic site, there can be hours with no visits at all. WordPress’s documentation uses exactly this example: a task scheduled for 2:00 PM won’t run until the next page load, which might not happen until 5:00 PM. Most of the time the post just goes out late. But if the site is quiet enough, or the post is time-sensitive, late is the same as missed.
How to tell: the problem is worst overnight and on weekends, and the post often does publish eventually, just hours after its scheduled time.
Cause 2: page caching means WordPress never runs
This is the one that catches people with busy sites. A full-page cache (from a caching plugin, your host, or a CDN like Cloudflare) serves visitors a saved copy of the page without starting WordPress at all. That’s the point of caching, and it’s why the site is fast. It also means those visits never reach the code that checks for scheduled tasks. You can have a steady stream of visitors and still have WP-Cron almost never run.
How to tell: scheduling fails even though the site gets regular traffic, and it started around the time you enabled or changed a caching layer.
Cause 3: the site can’t call itself (loopback failure)
When WP-Cron does run, it works by having your site send an HTTP request to itself, to wp-cron.php. This is called a loopback request. If a firewall, security plugin, HTTP authentication on a staging site, or a hosting restriction blocks that request, the scheduler gets triggered but can’t do its work.
How to tell: go to Tools → Site Health. If loopbacks are failing, you’ll usually see “Your site could not complete a loopback request,” and sometimes a warning that a scheduled event failed to run. Site Health often flags REST API problems in the same place, since both depend on the site being able to reach itself. If you see those too, our guide to a disabled or blocked WordPress REST API covers how to tell a genuine block from something that broke.
Cause 4: WP-Cron is switched off, or the timezone is wrong
Some hosts and developers add define( 'DISABLE_WP_CRON', true ); to wp-config.php so WordPress stops checking for tasks on every page load. That’s a sensible setup, but only if a real server cron job is then set up to call wp-cron.php on a schedule. If the constant is there and the cron job isn’t, or the job was lost during a migration, nothing publishes at all.
A related and easy-to-miss cause is the timezone under Settings → General. If it’s set to UTC while you’re thinking in local time, a post “scheduled for 9:00” may be scheduled for a different hour than you expect. That isn’t strictly a missed schedule, but it looks exactly like one from the dashboard.
How to tell: open wp-config.php and search for DISABLE_WP_CRON. If it’s set to true, ask your host whether a server cron job is running. Then check the timezone setting matches where you are.
Fixing it properly
For a one-off, you can simply open the missed post and publish it manually. To stop it happening again, the reliable fix is to take scheduling off visitor traffic entirely:
- Add
define( 'DISABLE_WP_CRON', true );towp-config.php, above the line that says to stop editing. - Set up a real cron job, either in your hosting control panel’s cron section or on the server, that requests
https://yoursite.com/wp-cron.phpon a regular interval. Every 5 to 15 minutes is a common choice for a site that schedules posts; WordPress’s own example shows the idea with a once-a-day job, which is far too infrequent for publishing. - Schedule a test post a few minutes ahead and confirm it goes out on time.
This solves causes 1 and 2 in one move, because publishing no longer depends on someone visiting an uncached page. It also removes the small cost of WordPress checking for tasks on every page load.
If Site Health shows loopback failures (cause 3), fix those first. The usual route is deactivating plugins one by one, especially security and firewall plugins, to find the one blocking the request, and checking with your host whether outgoing requests from the server to itself are allowed.
What about “missed schedule” plugins?
There are plugins that watch for missed posts and publish them the next time the site is loaded. They’re a reasonable safety net, but they rely on the same thing that failed in the first place: a page load that actually runs WordPress. On a heavily cached or very quiet site, they help less than you’d hope. A real cron job fixes the cause instead of cleaning up after it.
Quick diagnosis
- Posts go out late, mostly overnight: low traffic. Set up a real cron job.
- Busy site, still missing schedules: page caching. Set up a real cron job.
- Site Health reports a loopback failure: find what’s blocking the site from calling itself.
- Nothing ever publishes on time: check for
DISABLE_WP_CRONwithout a matching server cron job. - Off by the same number of hours every time: check the timezone in Settings → General.

Etienne Basson works with website systems, SEO-driven site architecture, and technical implementation. He writes practical guides on building, structuring, and optimizing websites for long-term growth.