Maintenance

WP-Cron Explained: Why Scheduled Posts, Emails and Backups Fail (and How to Fix It)

What WP-Cron is, why scheduled posts show "Missed schedule" and emails or backups run late, and how to switch WordPress to a reliable server cron job.

WP-Cron Explained: Why Scheduled Posts, Emails and Backups Fail (and How to Fix It)
On this page
  1. What WP-Cron is
  2. What depends on it
  3. Why scheduled tasks fail or run late
  4. How to check what's happening
  5. The fix: use a real server cron
  6. Does it help speed?
  7. Keep scheduled tasks healthy
Key takeaways
  • WP-Cron runs scheduled tasks only when someone visits, so low traffic and page caching can delay posts, emails and backups.
  • Site Health, WP Crontrol and WooCommerce Scheduled Actions show whether scheduled events are late or failing.
  • Disabling WP-Cron and adding a real server cron job every 5 or 15 minutes makes scheduled tasks run on time.

You schedule a blog post for 9 am, and at noon it still says "Missed schedule". Your backup plugin claims to run nightly, yet the latest backup is a week old. Reminder emails go out hours late. These problems often share one cause: WP-Cron, the way WordPress runs scheduled tasks. Here's how it works, why it fails and how to fix it properly.

What WP-Cron is

WordPress and many plugins need to do things on a schedule: publish scheduled posts, check for updates, send emails, run backups and clear out old data. On a normal server this is the job of "cron", the operating system's scheduler, which runs tasks at set times.

WordPress can't assume every host offers that, so it has its own system called WP-Cron. Instead of running at exact times, it checks for due tasks whenever someone loads a page. If something is due, WordPress sends a background request to its own wp-cron.php file to run it.

That works on most sites most of the time. But it means tasks run when a visit happens, not at the time you set.

What depends on it

  • Scheduled posts and pages
  • Backup plugins that run on a schedule. Backups taken by your hosting company are separate and don't depend on WordPress
  • Timed emails: newsletters, digests, reminders and follow-ups. If emails send on time but land in spam, that's a different problem; see email deliverability explained
  • WooCommerce tasks such as scheduled sale prices and background jobs in its Action Scheduler queue
  • Update checks, security scans and log clean-ups
  • Imports and syncs with a CRM, inventory system or feed

Why scheduled tasks fail or run late

Low traffic

If nobody visits between 1 am and 8 am, nothing triggers WP-Cron, so a 2 am backup waits for the first visitor of the morning. New or small business sites can go hours without a visit, especially at night.

Page caching

Caching is good for speed, but when a page is served straight from the cache, WordPress may not run fully, so that visit doesn't trigger WP-Cron. A well-cached site with modest traffic can see long gaps between runs. See WordPress caching explained.

Blocked loopback requests

WP-Cron works by the site sending a request to itself. Firewalls, security plugins, password protection on a staging site, SSL problems and some hosting set-ups can block that request, and then scheduled tasks quietly stop.

WP-Cron switched off without a replacement

A line in wp-config.php can disable WP-Cron. That's correct when a real server cron job replaces it, but if the line is there and the cron job isn't, nothing scheduled runs at all. This often happens after a migration to a new host.

Long or broken tasks

A backup or import that runs out of time or memory can fail halfway, and an error in one plugin's task can hold up others. Plugins you removed long ago can also leave events behind.

How to check what's happening

  • Site Health: Tools → Site Health warns about failed loopback requests and late or failed scheduled events
  • WP Crontrol: a free plugin that lists every scheduled event, shows when each is next due, and lets you run one manually to see whether it works
  • WooCommerce: WooCommerce → Status → Scheduled Actions lists pending, completed and failed background jobs
  • Your backup plugin's log shows when backups actually ran, not just when they were meant to
  • The posts list: "Missed schedule" next to a post means it wasn't published on time

If events are overdue and never run, WP-Cron isn't being triggered. If they run but fail, the problem is the task itself.

The fix: use a real server cron

For most business sites, the dependable solution is to let the server trigger WordPress on a fixed timetable, instead of waiting for visitors.

  1. Take a backup first; see WordPress backup and restore.
  2. Stop the visitor-triggered checks by adding define( 'DISABLE_WP_CRON', true ); to wp-config.php, above the comment that begins "That's all, stop editing!".
  3. Create a cron job in your hosting control panel. cPanel and Hostinger's hPanel both have a Cron Jobs section. Set it to call your site's wp-cron.php every 5 or 15 minutes, for example: wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  4. Test it: schedule a test post a few minutes ahead, confirm it publishes on time, and check that the next backup runs when expected.

Your host may recommend a different command, such as running wp-cron.php with PHP directly or using WP-CLI. Any of these is fine as long as it runs reliably. Some shared hosting plans limit how often cron jobs can run, so check with your host.

Does it help speed?

Somewhat, mainly by making things predictable. With WP-Cron, a visitor's page load is what kicks off pending tasks, so heavy jobs such as backups or imports can start during busy periods. With a server cron, tasks run on a fixed timetable and page loads no longer need to check the schedule. On busy sites, or on shared hosting where resources are tight, that can smooth out slow moments. On its own it won't fix a slow site, but it removes one source of random slowdowns.

Keep scheduled tasks healthy

  • After a migration or change of domain, confirm the cron job points to the right address and still runs
  • After removing plugins, check for leftover events, and only delete ones you're sure belong to plugins you no longer use
  • Watch backup logs, not just the backup schedule
  • Include a quick scheduled-post test in your monthly maintenance checks

Scheduled posts, backups or emails not running on time? I can check your set-up and move it to a reliable server cron as part of WordPress maintenance.

Need help with your website?

I'm Sameer, a freelance WordPress developer building fast, SEO-friendly websites since 2020. Tell me what you need and I'll reply with a plan and a fixed quote within 24 hours.

Found this useful? Share it:
Contact

Let's build your next website

Available for freelance projects, agency white-label work and long-term maintenance. Feel free to pass this along to your team or company.

Your details are emailed to me, then WhatsApp opens so we can chat right away.

Chat now