←back to Blog

Fixing WordPress scheduled posts not publishing with a real WP-Cron server cron job

WordPress Scheduled Posts Not Publishing? Here’s the Real WP-Cron Fix

A blog post scheduled for 9 AM goes live at 11:47 AM instead, or doesn’t publish at all until someone stumbles onto the post list and notices “Missed Schedule” in red text. If WordPress scheduled posts not publishing on time sounds familiar, the cause isn’t a bug in your theme or a flaky host. It’s how WordPress handles scheduling by default, and it’s fixable in about ten minutes.

Why Do WordPress Scheduled Posts Miss Their Publish Time?

WordPress scheduled posts miss their publish time because WP-Cron, the system responsible for triggering scheduled tasks, only runs when someone visits the site. WP-Cron is not a real, time-based cron job. It’s a piece of code that checks for due tasks on page load, so a post scheduled for 9 AM won’t actually publish until a visitor happens to load a page after that time.

This is why the problem shows up most on low-traffic sites, staging environments, and password-protected sites. No visitors means no page loads, and no page loads means WP-Cron never fires. A high-traffic site rarely notices this limitation because there’s almost always someone loading a page within seconds of the scheduled time. A new portfolio site or a client site still in soft-launch mode can sit for hours with nobody triggering it.

How to Fix a “Missed Schedule” Post Right Now

To fix a post already stuck on “Missed Schedule,” open the post in the editor and either republish it immediately or move the scheduled time a few minutes into the future, then click Update. This forces WordPress to reprocess the post the next time the page loads, without needing to touch any code.

  1. Go to Posts > All Posts and find the post marked “Missed Schedule.”
  2. Click Edit and locate the publish box in the sidebar.
  3. Either click “Publish” to push it live now, or set the date/time a few minutes ahead and click Update.
  4. Load any page on the site right after saving. That page load is what actually triggers WP-Cron to check for due tasks and publish the post.

This manual fix works, but it only solves the one post in front of you. It doesn’t stop the next scheduled post from having the same problem next week.

How Do You Stop WordPress Posts From Missing Their Schedule for Good?

The permanent fix is to disable WP-Cron’s default page-load trigger and replace it with a real server-side cron job that runs on an actual clock schedule, independent of visitor traffic. This is the standard recommendation from most WordPress hosting providers for exactly this reason.

First, disable the default WP-Cron trigger by adding this line to wp-config.php, above the line that says “That’s all, stop editing”:

define('DISABLE_WP_CRON', true);

Next, set up a real cron job through the hosting control panel (cPanel, Plesk, or a hosting dashboard’s “Cron Jobs” section) to call wp-cron.php directly on a fixed schedule. A typical crontab entry looks like this:

*/15 * * * * wget -q -O - https://yoursite.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Every 15 minutes is a reasonable default for most small business and portfolio sites. A high-traffic store running time-sensitive WooCommerce emails or flash sales may want every 5 minutes instead. A low-traffic personal blog can usually get away with hourly. The important part isn’t the exact interval, it’s that the job runs on a real clock instead of waiting on a visitor.

One important warning: adding DISABLE_WP_CRON without actually setting up the replacement server cron job breaks scheduling completely, since nothing will trigger scheduled tasks at all. Always confirm the real cron job is active before disabling the default trigger, and test with a post scheduled a few minutes out to confirm it publishes on its own.

What Else Causes WP-Cron Not to Work?

Beyond low traffic, the most common causes of wp-cron not working are aggressive caching plugins, a timezone mismatch in WordPress settings, and plugin conflicts. Each one blocks the trigger in a different way, so it’s worth checking all three before assuming the real-cron fix above didn’t take.

  • Caching plugins: A caching plugin serving pages straight from a static cache can bypass PHP entirely, which means WP-Cron never gets the chance to run on those page loads. This is a common blind spot when comparing WP Rocket vs W3 Total Cache or any similar caching setup, since both need to be configured to exclude wp-cron.php from caching rules.
  • Timezone mismatch: If the timezone set under Settings > General doesn’t match the server’s actual clock, scheduled times can appear to fire early, late, or not at all relative to what’s shown in the editor.
  • Plugin conflicts: A plugin that hooks into cron events incorrectly, or one that’s simply broken, can silently stop other scheduled tasks from firing. This is the same kind of issue covered in how to find which WordPress plugin is causing a problem, and deactivating plugins one at a time is still the fastest way to isolate it.
  • Staging and password-protected sites: A WordPress staging site often sees zero real traffic, so scheduled posts and test automations on staging almost never fire on time. That’s expected behavior, not a bug, and it’s not worth chasing down on an environment nobody visits.

Should You Use a Plugin Instead of Editing wp-config.php?

A plugin is a reasonable option if editing wp-config.php and setting up server cron isn’t practical, but it treats the symptom rather than the underlying cause. WPBeginner’s Missed Scheduled Posts Publisher plugin, which has more than 60,000 active installs according to its WordPress.org listing, registers its own cron event that checks every 15 minutes for posts stuck past their publish time and republishes them automatically.

The tradeoff is precision: a post scheduled for 9:00 AM might not actually go live until 9:15 AM under that plugin’s checking interval, since it’s still bound by the same page-load-triggered WP-Cron underneath. A real server-side cron job set to run every 5 minutes will always be more accurate than a plugin polling every 15.

MethodEffortTiming Accuracy
Manually republish a stuck postLow, but repeats every timeImmediate, one post only
Missed Schedule Posts pluginLow, install and forgetWithin ~15 minutes
Real server-side cron jobMedium, one-time setupWithin the interval you set (as tight as 5 minutes)

For a portfolio or business site publishing a handful of posts a week, a real server cron job set to run every 15 minutes is usually the better long-term fix. It solves scheduled posts, scheduled backups, and any other WP-Cron-dependent task at once, instead of adding another plugin that only covers publishing.

Frequently Asked Questions

“Missed Schedule” means WordPress reached the post’s scheduled publish time but no page load happened afterward to trigger WP-Cron, so the post stayed in a scheduled, unpublished state past its intended go-live time.

Disabling wp-cron with the DISABLE_WP_CRON constant is safe only if a real server-side cron job is set up at the same time to call wp-cron.php on a fixed schedule; disabling it without a replacement stops all scheduled tasks, including publishing, backups, and email queues.

Every 15 minutes works for most small business and portfolio sites, high-traffic stores with time-sensitive emails often use 5-minute intervals, and low-traffic personal blogs can typically run hourly without noticeable delay.

Yes, a caching plugin serving pages from a static cache can bypass PHP execution entirely on those requests, which prevents WP-Cron from ever getting the chance to check for due scheduled tasks unless wp-cron.php is specifically excluded from the caching rules.

Yes, staging and password-protected sites typically receive little to no real visitor traffic, and since WP-Cron only runs on page loads by default, scheduled posts on those environments frequently miss their publish time until someone manually loads a page.

Leave a Reply

Your email address will not be published. Required fields are marked *