Maintenance

WordPress Cron Jobs and Missed Scheduled Tasks

Why your scheduled WordPress posts publish late, backup jobs skip silently, and email campaigns never fire — and how to fix the unreliable wp-cron system.

Friday, November 7, 2025 at 11:08 AM
Clock automation representing scheduled tasks

You carefully schedule a blog post to publish at exactly 9:00 AM on Monday morning to coincide with your email newsletter. Monday arrives. The newsletter goes out. But the blog post still shows "Scheduled" in the dashboard at 9:47 AM. It didn't publish.

This is one of the most frustrating WordPress issues, and it stems from a fundamental design limitation in how WordPress handles scheduled events.

How WordPress Cron Actually Works

Unlike a real server cron job (which runs on a strict clock regardless of traffic), WordPress uses a "virtual cron" system called wp-cron. Here's the critical difference:

wp-cron only executes when someone visits the site. When a visitor loads any page, WordPress checks: "Are there any scheduled tasks that should have fired by now?" If yes, it runs them in the background.

This design decision means that if your website receives zero traffic between 8:00 AM and 10:00 AM, your 9:00 AM scheduled post simply doesn't have a trigger mechanism. It waits patiently until the next visitor arrives.

Common Symptoms of Cron Failures

  • Scheduled posts publish late (sometimes hours late on low-traffic sites).
  • Backup plugins skip their scheduled runs without logging any error.
  • WooCommerce subscription emails don't send at the expected renewal time.
  • Expired transient cleanup never executes, causing gradual database bloat.

The Fix: Replace Virtual Cron with a Real Server Cron

The most reliable solution is to disable the virtual cron entirely and replace it with a real system-level cron job that fires on a strict schedule.

Step 1: Disable wp-cron

Add this line to your wp-config.php file: define('DISABLE_WP_CRON', true);

This prevents WordPress from running the virtual cron check on every page load, which also slightly improves performance for your visitors.

Step 2: Create a Real Cron Job

On your server (via cPanel, Plesk, or SSH), create a cron job that hits the wp-cron endpoint every 5 minutes: */5 * * * * wget -q -O /dev/null https://yourdomain.com/wp-cron.php?doing_wp_cron

This ensures that even if zero visitors come to your site, the scheduled tasks are checked every 5 minutes like clockwork.

Step 3: Verify

Install the WP Crontrol plugin to visually inspect all registered cron events. Confirm that your backup jobs, scheduled posts, and subscription renewal hooks are listed with correct "Next Run" timestamps.

Unreliable scheduling is rarely a bug — it's a predictable consequence of WordPress's traffic-dependent architecture. Replace the virtual system with a real timer, and the mystery disappears.

Need a calmer WordPress support setup?

See the care plans, review the agency offer, or apply for a launch slot.