Fixes

WordPress cron not running: why scheduled tasks stop and how to fix it

By Ali Yasin Jatoi 6 min readUpdated July 10, 2026
Reviewed by Ali Yasin Jatoi, Founder & Lead Engineer· Updated July 10, 2026

Quick answer

WordPress cron is not a true cron. It only runs when someone visits the site, so on low traffic sites scheduled tasks pile up and never fire. The reliable fix is to disable WP-Cron in wp-config.php with DISABLE_WP_CRON set to true, then trigger wp-cron.php every five minutes from your host's real system cron. That alone restores scheduled posts, backups, and transactional emails on the vast majority of sites.

Why WP-Cron misses your scheduled tasks

WordPress does not have a real cron daemon. Every page load checks whether any scheduled task is due, and if one is, that visitor's request runs it.

On a low traffic site nobody visits at 3am, so the 3am backup, the scheduled post, and the digest email all wait for the next visitor. Sometimes they never fire.

On a busy site the opposite happens. Cron fires on almost every request, which slows the site down for real visitors.

The reliable fix in two steps

  • Step 1. Open wp-config.php and add this line above the 'stop editing' comment: define('DISABLE_WP_CRON', true). That stops WordPress from running cron on visitor requests.
  • Step 2. In your hosting control panel, create a real system cron that runs every 5 minutes and hits https://yoursite.com/wp-cron.php?doing_wp_cron. Most cPanel, Plesk, and managed hosts have a cron UI for this.
  • That is it. Scheduled posts publish on time, backups run at 3am even with zero visitors, and page loads no longer carry the cron cost.

How to check whether cron is actually working

Install WP Crontrol. It lists every scheduled event, when it last ran, and when it is due next. If a task is overdue by hours or days, cron is broken.

Watch for common jammed events: wp_privacy_delete_old_export_files, action_scheduler_run_queue, and any plugin backup or newsletter event.

If tasks fire once you visit the site and then go quiet again, that confirms WP-Cron is stuck on visitor triggers.

When the real system cron is not enough

Very large stores with thousands of Action Scheduler jobs can outrun a 5 minute cron. Move Action Scheduler to WP-CLI on a dedicated cron.

If your host blocks outgoing loopback requests, the cron will 200 but nothing runs. Use wget or curl to the local address rather than a public URL.

Cache and firewall rules can strip the ?doing_wp_cron query string. Add an exception for wp-cron.php in your caching plugin and WAF.

Common questions

How do I know if WP-Cron is running at all?+

Install WP Crontrol and look at the Tools > Scheduled Events screen. Any event marked as overdue by more than its own interval means cron is not firing on schedule.

Is disabling WP-Cron safe?+

Yes, as long as you replace it with a real system cron that pings wp-cron.php every 5 to 15 minutes. Without a replacement, no scheduled task on your site will ever run again.

Why do my scheduled posts say 'missed schedule'?+

That is the classic WP-Cron symptom. The publish job was due but no visitor triggered it in time. Fixing cron with a real system cron makes the missed schedule error stop for good.

Want this handled for you?

Book a call and we will review your site before recommending anything.

Call Book a call