Technical

WordPress Missed Schedule Error: Why Posts Don't Publish (2026)

By Daniel Reyes•October 4, 2026•4 min read

Disclosure: some links on this page are affiliate links. We may earn a commission at no extra cost to you. How we test and rate hosts.

Our top pick for most WordPress sites
Bluehost: free domain, free SSL, 24/7 support, 30-day money-back guarantee.
Check Bluehost Deal →

Missed Schedule isn't a bug - it's architecture. wp-cron doesn't run on a timer; it runs when someone visits. No visit at the scheduled moment = the publish event never fires. One proper fix makes this disappear permanently: give WordPress a real cron.

Why wp-cron Fails

WordPress simulates cron because most shared hosts historically didn't expose real cron. Every page load, WordPress checks "any cron jobs due?" and fires them. The failure modes:

  • -Low traffic: post scheduled for 6am, first visitor at 9am - missed
  • -Page caching: visitors get cached HTML without PHP running - wp-cron never triggers
  • -Loopback blocked: the site can't HTTP-request itself (security rules, some hosts) - cron calls fail
  • -Downtime: site down at scheduled time = event missed, no retry
  • -Timezone confusion: post publishes at the "wrong" time and looks missed

Fix 1: The Permanent Cure - Real Server Cron

Replace the simulated cron with a genuine system cron that fires every few minutes regardless of traffic:

  1. 1.Disable the visit-triggered wp-cron in wp-config.php:
    define('DISABLE_WP_CRON', true);
  2. 2.Create a real cron job - cPanel > Cron Jobs, every 5 minutes:
    wget -q -O /dev/null --no-check-certificate https://yoursite.com/wp-cron.php?doing_wp_cron

Now cron runs on schedule whether or not anyone visits - missed schedules stop entirely. It also removes the per-pageview cron check, a small performance win. Prefer WP-CLI? cd ~/public_html && /usr/local/bin/php wp-cron.php --due-now works too.

Fix 2: The Safety Net - Trigger Plugin

Not ready to touch cron? Install Scheduled Post Trigger (or Missed Scheduled Post Publisher). On every visit it checks for posts past their scheduled time and publishes them immediately. Limitation: it still needs a visit - a post scheduled at 3am publishes at the next visit, not at 3am. Safety net, not cure.

Fix 3: Exclude wp-cron From Caching

If your caching plugin serves pages without executing PHP, wp-cron starves. In WP Rocket/LiteSpeed Cache/etc., make sure wp-cron.php is never cached and that the cache doesn't bypass PHP on every request. Site-ground-style server caching with proper exclusions is fine; a misconfigured plugin cache is not.

Fix 4: Check Loopback and Site Health

Tools > Site Health flags "loopback request failed" - meaning your site can't call itself, which wp-cron requires. Causes: security plugin blocking internal requests, a host-level rule, or mod_security. If Site Health shows this error, either fix the loopback (support ticket) or bypass it entirely with a real cron job.

Fix 5: Timezone and Memory

Posts publishing at wrong times? Settings > General > Timezone - pick your city, not a UTC offset (offsets don't track daylight saving). Also raise memory if cron jobs die mid-execution: define('WP_MEMORY_LIMIT','256M') in wp-config.php - a cron event killed by memory exhaustion leaves the same Missed Schedule scar.

Fix 6: Publish the Missed Ones Now

Backlog of missed posts? Either publish each manually (quick edit > Publish), or let the trigger plugin flush them all on the next visit. Check Posts > Scheduled for anything still queued before assuming the fix worked.

Cron That Fires On Time

Real cron jobs are a cPanel click away on Bluehost - no loopback weirdness, no missed 3am posts. Scheduling works the way it should have all along. From $3.99/mo.

Get Reliable Hosting

Related: stuck in maintenance mode - 500 internal server error - memory limit fix - 403 forbidden error.

Find Your Perfect Hosting Plan

What are you building?

Tell us about your project so we can match the perfect hosting plan.

Question 1 of 425% complete
Interactive Tool

Hosting Cost Calculator

See exactly how much you'll spend on hosting over time. Compare Bluehost vs popular alternatives and discover your potential savings.

Used to calculate transaction fees (Shopify charges 2% on sales)

Shopify Basic (3yr)
$1,044
Bluehost (3yr)
$444
You Save
$600
58% less than Shopify Basic

Frequently Asked Questions

Why does WordPress show 'Missed Schedule' on posts?

wp-cron isn't a real cron - it only runs when someone visits your site. If no visit happens around the scheduled time, the publish event never fires and the post is marked Missed Schedule. Low-traffic sites, aggressive caching, and downtime all cause it.

What's the fastest fix for missed scheduled posts?

Install the Scheduled Post Trigger plugin - it checks on every visit for posts that missed their time and publishes them immediately. It's a safety net, not a cure: for the real fix, replace wp-cron with a genuine server cron job.

How do I set up a real cron job for WordPress?

Add define('DISABLE_WP_CRON', true) to wp-config.php, then create a server cron (cPanel > Cron Jobs or via WP-CLI) that hits wp-cron.php every 5-15 minutes: wget -q -O /dev/null https://yoursite.com/wp-cron.php?doing_wp_cron. Now cron fires on time whether or not anyone visits.

Can a caching plugin cause missed schedules?

Yes. If page caching serves visitors a cached page without PHP executing, wp-cron never runs. Exclude wp-cron.php from caching, or switch to a real server cron so visits don't matter.

Why did it start after moving hosts?

The new host may block loopback requests (the site can't HTTP-request itself), which wp-cron depends on. Check Tools > Site Health for 'loopback request failed' errors. Real server cron bypasses loopback entirely.

Does timezone matter for scheduled posts?

Yes - scheduling uses the timezone in Settings > General. If posts publish at wrong times (not missed, just wrong), fix the timezone first. WordPress schedules in UTC internally; a wrong timezone offset makes you think it's broken.

Ready to launch?

Get Bluehost from $3.99/month with a free domain, free SSL, and 30-day money-back guarantee.

Start for $3.99 →

Related Articles