Missed Scheduled Posts: Causes, Quick Fix and Root-Cause Solution

A scheduled post that did not publish is a symptom of WP-Cron not firing on time. Here is how to ship it now and stop it from recurring.

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_date

Compare 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

  1. Publish immediately: tick the missed posts > Bulk actions > Edit > change Status to Published > Update.
  2. WP-CLI alternative:
    wp post update $(wp post list --post_status=future --post_date_query='{"before":"now"}' --field=ID) --post_status=publish
  3. 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.
  4. 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:
    define( 'DISABLE_WP_CRON', true );
    And on the server crontab:
    */5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
  5. Install WP Crontrol and confirm publish_future_post is registered and not stuck.
  6. Check wp-content/debug.log for PHP errors that interrupt WP-Cron mid-run.
  7. Make sure the site timezone is correct: Settings > General > Timezone. A wrong clock causes publish_future_post to skip when post_date_gmt mismatches.

Common mistakes

  • Editing post_date directly 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_gmt in UTC and post_date in site time. A wrong timezone places the post in the past or future erroneously.
  • Disabling WP-Cron without server cron: DISABLE_WP_CRON=true with 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.

Tip: The WP Missed Schedule Posts plugin logs every time it has to recover a missed post - useful telemetry to confirm you really fixed the cause and not just patched it.