Scheduled Posts Missed Their Schedule
A post showing “Missed schedule” was never published because the scheduler never ran. WordPress has no real scheduler — it checks for due tasks when someone visits the site, and on a quiet site that check may not happen at the right moment.
The short version
- Publish the stuck posts manually first.
- The underlying cause is WP-Cron, not the post.
- A real server cron job fixes it permanently.
- A page cache makes it worse by preventing PHP from running.
Publish the stuck ones now
# list them
wp post list --post_status=future --format=table
# publish a specific one
wp post update 123 --post_status=publish
# publish everything that is overdue
wp post list --post_status=future --format=ids | \
xargs -d ' ' -I % wp post update % --post_status=publish
Without command-line access, open each post and click Publish. The date stays as scheduled unless you change it.
Why it happened
| Cause | Why it causes this |
|---|---|
| Low traffic | No visit at the scheduled time, so no cron check |
| Page caching | Cached pages do not execute PHP, so cron is never triggered |
| DISABLE_WP_CRON with no replacement | Someone disabled it and never added a server cron |
| Blocked loopback request | The site cannot call itself — often basic auth |
| A stuck task | One failing task blocks the queue behind it |
| Timezone mismatch | The post is publishing on time, in a different timezone |
Check the timezone first
It is worth ruling out before anything else. Settings → General should show a city, not a UTC offset — a city handles daylight saving automatically. If the site timezone differs from yours, posts publish at the right site time and the wrong local time, which looks like a failure and is not.
Check the loopback
curl -sI "https://example.com/wp-cron.php?doing_wp_cron" | head -3
A 200 means cron can be triggered. A 401 means basic authentication is blocking it — common on staging sites, and occasionally left enabled in production.
The permanent fix
// wp-config.php
define( 'DISABLE_WP_CRON', true );
# crontab -e
*/5 * * * * cd /path/to/wordpress && /usr/local/bin/wp cron event run --due-now --quiet
Five minutes is granular enough for scheduled publishing and light enough to be free. The command exits immediately when nothing is due.
Watch out
Setting DISABLE_WP_CRON without adding the server cron job stops every scheduled task — publishing, backups, update checks. Always add both in the same session.
Clear a stuck queue
wp cron event list
wp cron event run --due-now
# remove a hook from a plugin you deleted
wp cron event delete orphaned_hook_name
Hooks belonging to removed plugins fire into nothing and can block the queue. They are a common and easily missed cause.
Verify the fix
- Schedule a test post five minutes ahead.
- Wait.
- Confirm it published on time.
- Run
wp cron event listand check nothing is overdue.
Common questions
Will a “missed schedule” plugin fix this?
It publishes stuck posts after the fact. It does not fix the scheduler, so backups and update checks remain broken.
Does my host run cron?
Some do. Verify by scheduling a post rather than taking their word for it.
Why only sometimes?
Because it depends on whether someone visited an uncached page near the scheduled time. Intermittent is the expected behaviour.
Sumit
Writes everything on TechMozz.