75 guides published Start a blog Fix my site How we test
FIX IT

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

CauseWhy it causes this
Low trafficNo visit at the scheduled time, so no cron check
Page cachingCached pages do not execute PHP, so cron is never triggered
DISABLE_WP_CRON with no replacementSomeone disabled it and never added a server cron
Blocked loopback requestThe site cannot call itself — often basic auth
A stuck taskOne failing task blocks the queue behind it
Timezone mismatchThe 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

  1. Schedule a test post five minutes ahead.
  2. Wait.
  3. Confirm it published on time.
  4. Run wp cron event list and 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.

S

Sumit

Writes everything on TechMozz.

More in Fix It