A post with post_status='future' whose publish time has passed but which never flipped to publish appears in the Posts screen as "Missed schedule". This is not a WordPress core bug - it is the near-certain result of WP-Cron not firing in time. The post stays in limbo until WordPress next checks - if it ever does.
Why this matters
Missing a publish window matters in several scenarios: marketing campaigns scheduled for 09:00 Monday but going out at 12:00 - momentum lost, paid ads pointing to URLs that 404 because the post is still future. Date-coordinated announcements - an insurer publishing a guide on the day a policy term begins; one day late is unusable. Serial content blogs - Monday/Wednesday/Friday cadence; one miss breaks the rhythm. System trust - if one post missed, all future posts are at risk. An admin who is not paying attention may not discover the issue for a week.
How to detect
Go to Posts > All Posts and filter by Scheduled. Look at the Date column - if it is in the past and status is still Scheduled or Missed schedule, it is broken. Via WP-CLI:
wp post list --post_status=future --fields=ID,post_title,post_dateCompare post_date to now (date '+%Y-%m-%d %H:%M:%S'). RankPlus scans the posts table for rows with post_status='future' AND post_date < NOW().
How to fix
- Publish immediately: tick the missed posts > Bulk actions > Edit > change Status to Published > Update.
- WP-CLI alternative:
wp post update $(wp post list --post_status=future --post_date_query='{"before":"now"}' --field=ID) --post_status=publish - Stopgap: install the free Scheduled Post Trigger or Missed Scheduled Posts Publisher. They retry missed publishes on every visitor request - a band-aid that does not address the cause.
- Root cause: switch to system cron instead of internal WP-Cron. See the wp_cron_status check for the full walkthrough. Once switched, add to
wp-config.php:
And on the server crontab:define( 'DISABLE_WP_CRON', true );*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1 - Install WP Crontrol and confirm
publish_future_postis registered and not stuck. - Check
wp-content/debug.logfor PHP errors that interrupt WP-Cron mid-run. - Make sure the site timezone is correct: Settings > General > Timezone. A wrong clock causes
publish_future_postto skip whenpost_date_gmtmismatches.
Common mistakes
- Editing
post_datedirectly in the DB: bypasses the hooks that update redirects, sitemaps and caches. Prefer Bulk Edit in wp-admin. - Relying on a Trigger plugin without fixing the cause: a brittle patch. The next plugin that fatals will break the trigger too.
- Mixing UTC and local time: WordPress stores
post_date_gmtin UTC andpost_datein site time. A wrong timezone places the post in the past or future erroneously. - Disabling WP-Cron without server cron:
DISABLE_WP_CRON=truewith nothing replacing it = no background task ever runs. Confirm the server cron is firing before disabling.
Verifying the fix
Schedule a test post 5-10 minutes ahead and wait. It should flip to Published within a minute of the target. Run wp post list --post_status=future and confirm no missed posts remain. RankPlus turns green.