WordPress Errors

WordPress Scheduled Posts Not Publishing Automatically

Warning Updated: July 10, 2026

What Is This Error?

WordPress has a built-in scheduling feature that lets you write posts ahead of time and set them to go live at a specific date and time. Under normal circumstances, the post quietly flips from “Scheduled” to “Published” at exactly the right moment — no manual effort needed.

When this breaks, the post just sits there. After the scheduled time passes, you might see a “Missed Schedule” label in your posts list, or the post remains stuck as “Scheduled” indefinitely. Either way, visitors cannot see it and it never went live on its own.

The root cause in almost every case is WordPress’s internal task runner, called WP-Cron. Unlike a real server cron job, WP-Cron only fires when a visitor loads a page on your site — meaning if nobody visits at the exact scheduled moment, your publish task silently gets skipped.

Get free WordPress & AI tips

Join 500+ readers. No spam, unsubscribe anytime.

Why Does This Happen?

  • WP-Cron depends on site traffic: WordPress’s scheduler only runs when someone visits your site, so low-traffic sites are especially prone to missed schedules because there may be no page load at the right time.
  • DISABLE_WP_CRON is set in wp-config.php: Many performance guides recommend disabling WP-Cron without explaining you need to replace it — leaving scheduled tasks with nothing to trigger them.
  • Plugin or theme conflict: Caching plugins, security firewalls, or optimization plugins can block the internal HTTP request WP-Cron uses to trigger itself, causing tasks to queue up but never execute.
  • Hosting blocks loopback requests: WP-Cron works by making an HTTP request back to your own server, and some shared hosting environments restrict these self-referencing requests entirely.
  • Incorrect timezone setting: If your WordPress timezone doesn’t match your intended publish time, posts may be scheduled hours off from what you expect, appearing to miss their window.

How to Fix It — Step by Step

  1. Verify your WordPress timezone. Go to Settings → General in your WordPress dashboard and check the Timezone field. Make sure it reflects your actual local timezone — use a named city (like “America/New_York”) rather than a raw UTC offset so daylight saving time is handled automatically. Save changes.

    You should see: Your correct city or region listed, with the accurate local time displayed just beneath the dropdown.

  2. Check wp-config.php for a disabled cron setting. Open your wp-config.php file (in your site’s root directory) and search for this line:

    define('DISABLE_WP_CRON', true);

    If you find it, either remove it entirely or change true to false as a temporary measure — but plan to move on to Step 4 for a permanent fix.

    You should see: Scheduled posts begin publishing again once any visitor triggers WP-Cron on your site.

  3. Install WP Crontrol to inspect your scheduled events. Install the free WP Crontrol plugin from the WordPress plugin directory. Once active, go to Tools → Cron Events. Look for the wp_publish_future_post hook — this is the event responsible for publishing scheduled posts. If it is missing entirely or shows a stale “Next Run” timestamp, WP-Cron has been failing to fire.

    You should see: A list of scheduled cron events with upcoming run times. When you have posts scheduled, the wp_publish_future_post event should appear with a valid future timestamp.

  4. Set up a real server cron job — the permanent fix. First, add this line to wp-config.php to stop WordPress from self-triggering (which was unreliable anyway):

    define('DISABLE_WP_CRON', true);

    Then log into your hosting control panel (cPanel, Plesk, or similar) and create a cron job that runs every 5 minutes:

    */5 * * * * wget -q -O /dev/null https://yoursite.com/wp-cron.php?doing_wp_cron

    Replace yoursite.com with your actual domain. If you have SSH access, you can also use:

    */5 * * * * php /path/to/your/site/wp-cron.php > /dev/null 2>&1

    You should see: Scheduled posts now publish reliably within 5 minutes of their scheduled time, regardless of how much traffic your site receives.

  5. Manually rescue any already-stuck posts. For posts already sitting in “Missed Schedule” or frozen “Scheduled” status, open each one in the editor, change the publish date to a few minutes in the future, and click Update — or simply click Publish to push it live immediately.

    You should see: The post status changes to “Published” and it becomes visible to visitors on your site right away.

Common Mistakes When Fixing This

  • Disabling WP-Cron without adding a server cron job: Countless tutorials recommend turning off WP-Cron for performance but skip the follow-up step entirely, leaving your site with no scheduler at all — always pair the disable with Step 4’s server cron job.
  • Relying on a “Missed Schedule” fixer plugin long-term: These plugins patch posts that already slipped through the cracks but do nothing to prevent it from happening again — treat them as emergency recovery tools, not a permanent solution.
  • Running the server cron job too infrequently: Setting the cron to run once per hour means posts can publish up to 59 minutes late; every 5 minutes is the standard recommendation and doesn’t put any real load on your server.
  • Using a raw UTC offset instead of a named timezone: A static offset like UTC+5 won’t adjust for daylight saving time, so posts can end up scheduled an hour off twice a year — always pick a named timezone like “Europe/London” instead.

Frequently Asked Questions

Can a caching plugin cause scheduled posts to fail?

Yes, it absolutely can. Aggressive caching setups serve fully pre-built pages without executing any PHP, which means WP-Cron never gets a chance to run. The server cron job in Step 4 sidesteps this entirely because it calls wp-cron.php directly on the server, completely independent of your page cache.

My hosting plan doesn’t support cron jobs — what are my options?

You have a solid workaround: use a free external cron service like cron-job.org or EasyCron. These services send an HTTP request to your wp-cron.php URL on whatever schedule you set, effectively acting as your server cron from the outside. It is just as reliable as a native hosting cron job for this purpose.

How can I confirm the server cron job is actually working?

Schedule a test post for 6–10 minutes in the future and wait it out. If it publishes on its own, you’re all set. You can also open WP Crontrol under Tools → Cron Events and watch the timestamps — if the “Last Run” values update roughly every 5 minutes, your server cron is firing correctly.

Does this issue occur on managed WordPress hosts like WP Engine or Kinsta?

It’s much less common on managed platforms because most of them run real server-side cron jobs by default. However, if you’ve manually added DISABLE_WP_CRON to wp-config.php without setting up a replacement, you’ll still hit the same problem. Contact your host’s support team if scheduling issues persist after following these steps — they can usually confirm whether cron is running on your account.

This site contains affiliate links. If you make a purchase through one of these links, we may earn a small commission at no extra cost to you. Learn more.