Ffile2fix
Sign in Get started

How to fix WordPress cron not running (missed schedule)

Missed schedule

WordPress does not use a real system timer. WP-Cron checks for due tasks only when someone visits the site and then calls wp-cron.php via a loopback request. On low-traffic sites, sites behind full-page caching, or where loopbacks fail, scheduled posts show "Missed schedule" and background tasks do not run.

Also appears as: A scheduled event has failed. The wp_version_check event failed to run. Your site still works, but this may indicate that scheduling posts or automated updates may not work as intended. · A scheduled event is late. The wp_scheduled_delete event is late to run. · Scheduled backups or emails never run

Common causes

  • Low traffic, so nothing triggers WP-Cron at the right time
  • Full-page caching serving pages without running PHP
  • DISABLE_WP_CRON set to true without a replacement system cron job
  • Loopback requests to wp-cron.php failing because of DNS, firewall or SSL problems
  • Basic authentication or a security plugin blocking wp-cron.php
  • A stuck or failing cron task that blocks others

How to fix it

  1. Check what is scheduled. Run wp cron event list to see due and overdue events, or install WP Crontrol to view them in wp-admin. Run wp cron event run --due-now to trigger them manually.
  2. Test wp-cron.php directly. Run curl -I https://example.com/wp-cron.php from the server. If it fails, fix the loopback problem (DNS, firewall, SSL) first.
  3. Disable the visit-based trigger. Add define('DISABLE_WP_CRON', true); to wp-config.php. This stops page loads from triggering cron, so you must add a real cron job in the next step.
  4. Add a system cron job. Add a crontab entry that runs every 5 minutes, using WP-CLI or PHP directly. In cPanel use Cron Jobs; on a VPS use crontab -e as the site user.
  5. Check for failing events. Look in debug.log or the cron job's email for PHP errors. A fatal error in one hooked function can stop the whole run.

crontab entry running WP-Cron every 5 minutes

# wp-config.php
define( 'DISABLE_WP_CRON', true );

# crontab -e (as the site user)
*/5 * * * * cd /home/user/public_html && wp cron event run --due-now >/dev/null 2>&1
# or without WP-CLI
*/5 * * * * php /home/user/public_html/wp-cron.php >/dev/null 2>&1

How to stop it happening again

  • Use a real system cron on every production site
  • Do not set DISABLE_WP_CRON without adding a cron job
  • Keep the Site Health checks clean
  • Monitor important scheduled tasks like backups

Frequently asked questions

Does WP-Cron run at exact times?

No. It runs on the first request after an event is due. With a system cron every 5 minutes, events run within 5 minutes of their scheduled time.

Should I run the cron job as root?

No. Run it as the same user that owns the WordPress files, so files created by tasks have the right owner.

What does ALTERNATE_WP_CRON do?

It runs cron with a redirect instead of a loopback request. It can help when loopbacks fail, but a real system cron is more reliable.