Skip to content

WordPress maintenance

WordPress missed schedule: why WP-Cron waits for a visitor, and the real cron fix

In short

WordPress shows Missed schedule when a scheduled post's time passed and nothing ran it. WP-Cron, the scheduler behind posts, update checks and WooCommerce's queue, only runs when a page loads. On a quiet site jobs wait. The handbook's fix: a server cron that requests wp-cron.php on a timer, plus DISABLE_WP_CRON in wp-config.php.

Key points

  • WP-Cron is not a clock. It checks for due jobs when a page loads, so a site nobody visits runs nothing.
  • In our lab a post set for 2:38 pm sat at Missed schedule for over eight minutes. A request to wp-cron.php published it at 2:47.
  • WooCommerce's Scheduled Actions queue starts from WP-Cron too. A long Pending list with old dates is the sign.
  • The fix is a server cron that calls wp-cron.php every few minutes, with the page load trigger switched off.
On this page (8)
  1. What does WordPress missed schedule mean?
  2. Why does WP-Cron only run when someone visits?
  3. What did our lab show?
  4. Which jobs run late besides scheduled posts?
  5. How do you see the WooCommerce queue?
  6. How do you set up a real cron for wp-cron.php?
  7. What should you check today?
  8. Questions and answers

What does WordPress missed schedule mean?

A WordPress missed schedule label means the job that publishes the post has not run. It shows in red on the Posts screen when a post’s time has passed and its status still says Scheduled.

That job belongs to WP-Cron, the scheduler built into WordPress. The Plugin Handbook says it handles checking for updates and “publishing scheduled post”.

When posts or store emails slip, this is one of the first things we check on our WordPress care plan.

Why does WP-Cron only run when someone visits?

There is no clock behind it. The handbook says WP-Cron works by “checking, on every page load, a list of scheduled tasks” and runs whatever is due during that load.

It also says plainly: WP-Cron “does not run constantly as the system cron does”. The handbook’s own example is a task set for 2:00 PM with no page loads until 5:00 PM. That task runs at 5:00.

The reason, per the handbook: many hosts are shared “and do not provide access to the system scheduler”.

What did our lab show?

We tested it on a WordPress 7.1.2 copy of our staging store on 11 Oct 2026. A small must-use plugin logged when the post went from Scheduled to Published, and which request did it.

We scheduled a post for two minutes ahead, at 2:38 pm UTC, then left the site alone. At 2:43 the Posts screen showed “Missed schedule” under the date. The cron event was still queued for 2:38.

Then we loaded the home page as a visitor, twice. The post stayed Scheduled.

That surprised us. A visit does not run the jobs itself. It fires a background request from the site to its own wp-cron.php, called a loopback. We think our test copy could not reach itself that way, so the visit did not publish the post. WordPress’s Site Health screen has a check for this exact failure: “Your site could not complete a loopback request”, and it notes loopback requests “are used to run scheduled events”.

At 2:46 we requested wp-cron.php directly, the way a server cron would. The post went live at 2:47:02, more than eight minutes late. One more detail: its date still read 2:38, so nothing on the post tells a reader it went out late.

Which jobs run late besides scheduled posts?

Anything queued through WP-Cron. Plugin and theme auto-updates are one. WordPress’s documentation says they “rely on WordPress Cron tasks to actually perform the update”, and suggests Tools, Site Health to check that cron tasks are running.

Who switched auto-updates on for a plugin in the first place, and what forces them on, is a separate question we tested in who turned on auto-updates for a WordPress plugin.

WooCommerce adds its own queue, Action Scheduler. Its FAQ says the queue is started by WP-Cron by default, plus a hook on admin requests. It also says the library handles “everything from emails to payments”.

If your backup plugin schedules through WP-Cron, a quiet night means a late backup.

Those backups copy every image size too, which is why a 4,000 px photo became 11 files in our lab in the uploads folder.

Caching can make this worse. SiteGround’s guide says caching plugins can interfere with wp-cron.php, so scheduled tasks “may not execute properly and timely”.

A failing job is a different problem from a crashing plugin. For that one, WordPress emails you, and we covered the “technical issue” email WordPress sends after a fatal error separately.

How do you see the WooCommerce queue?

Go to Tools, Scheduled Actions. The Action Scheduler docs say the same screen also sits under WooCommerce, Status, Scheduled Actions.

Filter by Pending and look at the dates. On our test store, four pending actions were past due after a few idle minutes, and the count was back to zero after our next page loads. Action Scheduler’s FAQ says a few past-due actions are normal, but several more than a day old suggest “something wrong with your site”.

How do you set up a real cron for wp-cron.php?

The handbook gives two steps, in this order.

First, ask your host’s scheduler to request wp-cron.php on a timer. On cPanel that is the Cron Jobs screen. On SiteGround it is Site Tools, Devs, Cron Jobs. The handbook’s Linux example runs every 15 minutes:

*/15 * * * * wget --delete-after https://example.com/wp-cron.php

Then switch off the page load trigger in wp-config.php, above the “stop editing” line:

define( 'DISABLE_WP_CRON', true );

Do the cron first. With the constant set and no cron, nothing runs at all.

How often is up to you. SiteGround suggests 30 minutes for most sites. When we take on a site with scheduled posts or a store, we turn off the visit trigger, add a server cron every five minutes, and check the Scheduled Actions list the next morning.

What should you check today?

Open the Posts screen and look for red “Missed schedule” labels. If you run WooCommerce, filter Scheduled Actions by Pending.

If either list has old dates, tell us what is running late and we will check how your site’s cron runs.

Where did these facts come from?

Questions and answers

What does Missed schedule mean in WordPress?

The post's publish time has passed but its status is still Scheduled. The job that publishes it is a WP-Cron event, and it has not run yet. It runs on the next request that triggers WP-Cron.

Does DISABLE_WP_CRON stop scheduled posts?

On its own, yes. Page loads stop running WP-Cron, so nothing runs until something requests wp-cron.php. That is why the handbook pairs it with a system cron.

How often should the server cron call wp-cron.php?

The handbook leaves it to you and shows every 15 minutes as an example. SiteGround suggests 30 minutes for most sites. We use five minutes for sites with scheduled posts or a store queue.

How do I see if WooCommerce scheduled actions are late?

Open Tools, Scheduled Actions (or WooCommerce, Status, Scheduled Actions) and filter by Pending. Action Scheduler's FAQ says a few past-due actions are normal, but several more than a day old point to a problem.

Rather hand this to us? See the WordPress maintenance plan