How to fix missed schedule in WordPress
Summary. You schedule a post for 9am, and at noon it still says "Missed schedule". The post is fine — the scheduler never fired, or fired and died. Missed schedule is a cron problem wearing a publishing costume, and it always has one of four causes. Here they are in order, with how to check each in minutes.
What "missed schedule" actually means
WordPress does not have a real scheduler. It has WP-Cron: a list of jobs with timestamps, checked on every page load. When you schedule a post, WordPress adds a one-off job that will publish it when its time comes. If nothing checks the list at the right moment — or the check runs and the job fails — the timestamp passes, and the post sits there labelled "Missed schedule".
That label is the end of the story, not the story. The question is never "what is wrong with this post". It is "what stopped the queue". Everything below follows from that.
Why WordPress cron misses in the first place
WP-Cron fires when someone visits. No visit, no tick. On a busy site that is never a problem; on a quiet site, a staging copy, or a fully cached site where PHP rarely runs, hours can pass with nobody checking the list. Your 9am post needed a visitor shortly after 9am. If the first visitor came at noon, the job was already three hours late — and "late" for a one-off publish job means missed.
The second way it misses: something earlier in the queue dies. Jobs run in order, and a fatal error or a timeout in one job can kill the request before your publish job gets its turn. The post did not fail. It never got to run.
The two-minute check you do first
Before changing anything, look at the queue. WordPress has no screen for it, which is half the problem — but you need to see whether everything is late or just your post.
- Everything overdue? The tick itself is broken — no traffic reaching PHP, or the loopback request WordPress uses to spawn cron is blocked. Start with cause one below.
- Only your post overdue? The tick works. Something about that specific firing failed — a timeout, a deploy at the wrong minute, another job dying first. Look at what else was due in the same window.
This distinction decides the whole fix. Do not skip it.
The four usual causes, in order
1. Nothing triggers the tick. Low traffic, aggressive full-page cache, or a host that blocks the loopback request to wp-cron.php. The fix is traffic-shaped: make sure something hits PHP regularly, or ask the host whether loopback requests are allowed. Only if neither is possible should you disable WP-Cron and set a real server cron — that is the last resort, not the first step, despite how often it is prescribed.
2. A stuck job ahead of yours. One overdue recurring job that errors on every run can poison every tick after it. Find the oldest overdue job, not the missed post. Fix or delete the stuck one and the queue usually drains on its own.
3. A plugin or deploy at the wrong minute. A fatal error during a tick kills everything behind it, including your publish. If the miss lines up with an update, a deploy, or a new plugin, check the error log for that window first.
4. Timezone confusion. The post was scheduled in the wrong timezone — site settings say one thing, the author assumed another. The job ran exactly when told; the telling was wrong. Check Settings → General before anything exotic.
Seeing every job on one screen
You cannot fix a queue you cannot see, and WordPress does not show it to you. That is why I built a screen for it: every scheduled job with its next run time, overdue ones marked, each runnable, pausable or deletable in place, plus a health check that says plainly whether the tick itself works.
Disclosure. My plugin ScheduleLens — Cron Viewer & Manager is that screen. It is free and open source. Everything above works without it — the plugin just makes the two-minute check take two minutes instead of twenty.
FAQ
- Does missed schedule hurt SEO?
- The missed post itself does not. But a cron system that cannot publish on time also cannot run the other scheduled jobs — update checks, scheduled cleanups, anything a plugin queued. Fix the cause, not just the post.
- Do I need a real server cron to fix missed schedule?
- Usually not. Most misses come from WP-Cron never firing or a stuck job ahead of yours — both fixable inside WordPress. A real cron is the last resort for busy or headless sites, not the first step.
- Only one post missed its schedule. Is cron still the problem?
- Quite possibly. A single overdue event among healthy ones usually means that specific firing failed — a timeout, a fatal in another job running first, a deploy at the wrong minute. Check whether the rest of the queue is on time before assuming the post is special.
- Can a caching plugin cause missed schedule?
- Indirectly. Full-page cache means fewer PHP requests, and WP-Cron only runs when PHP runs. On a quiet cached site there can be long stretches with no cron tick at all. The cache is not broken — but the schedule quietly depends on traffic it no longer gets.
Conclusion
Missed schedule is never about the post. Look at the queue first, find whether everything is late or just the one job, then walk the four causes in order. Most of the time you will find the answer before you reach the third.