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
- 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.
- 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.
- 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.
- 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.
- 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