If WP-Cron not running is ruining your day, you’re not alone. When WordPress scheduling breaks, it rarely fails in a neat, obvious way. Instead, it quietly causes chaos:
- Scheduled posts publish hours late (or never).
- WooCommerce emails go out late (order notifications, renewals, “completed order” emails).
- Backups and security scans get stuck “in progress.”
- Subscription renewals, inventory syncs, abandoned cart automations, and cleanup tasks pile up.
The worst part? Your site can look totally fine on the surface while the background job queue is on fire.
This guide walks you through why WP-Cron fails, how to prove it’s the problem, and multiple reliable fixes—from quick wins to a “set it and forget it” server cron approach.
Important context: WP-Cron is not a true system cron. WordPress runs scheduled tasks during page loads (or via internal “loopback” requests), which is why traffic patterns and server rules matter. (WordPress Developer Resources)
What WP-Cron Does (And Why It Breaks So Easily)
WP-Cron is WordPress’s built-in task scheduler. Core and plugins use it for things like:
- Publishing scheduled posts
- Checking for plugin/theme updates
- Sending queued emails
- Cleaning transients and expired sessions
- Running WooCommerce background processing
WordPress triggers WP-Cron by checking scheduled events on page load, and when something is due, it “spawns” cron processing. (WordPress Developer Resources)
That design is convenient because it doesn’t require server-level cron access—but it’s also fragile:
- Low traffic = cron doesn’t get triggered on time.
- Some hosts/security rules block loopback requests.
- Aggressive caching prevents WP-Cron from firing correctly.
- A plugin can schedule huge jobs that time out and jam the queue.
Common Symptoms of WP-Cron Not Running
You’ll usually see one (or several) of these:
1) Missed scheduled posts
Posts set to publish at 9:00 AM publish at 11:17 AM… or remain “Scheduled” forever.
2) Delayed WooCommerce emails
WooCommerce relies heavily on background tasks and scheduled actions. If WP-Cron is delayed, store automations can lag, especially on low-traffic stores. (WooCommerce)
3) “Past-due” Woo scheduled actions
In WooCommerce → Status → Scheduled Actions, you’ll see a growing list of Pending or Past-due actions.
Even Woo support guidance often points you there first because it’s the canary in the coal mine. (WordPress.org)
4) Stuck backups, scans, or maintenance
Backup plugins, security scanners, image optimizers, and cache warmers often depend on cron. When cron jams, these jobs can loop forever.
Quick Diagnosis Checklist (10 Minutes)
Step 1: Check Site Health for loopback problems
Go to Tools → Site Health and look for anything mentioning loopback requests. If loopbacks fail, WP-Cron often won’t run automatically. (WordPress.org)
Why loopbacks matter: WordPress often triggers cron by making an internal HTTP request back to itself. If the server blocks that request, cron spawning fails.
Step 2: See if Woo scheduled actions are piling up (WooCommerce sites)
Go to WooCommerce → Status → Scheduled Actions and filter by Pending or Past-due. WooCommerce docs explicitly note WP-Cron’s reliance on traffic and how delays can happen. (WooCommerce)
Step 3: Use WP-CLI to test cron spawning (best proof)
If you have SSH/WP-CLI access, run:
wp cron test
wp cron event run --due-now
WP-CLI includes commands to test the cron spawning system and run due events immediately. (WordPress Developer Resources)
If wp cron test fails or --due-now runs nothing even when you know items are overdue, you’ve found your smoking gun.
Why WP-Cron Stops Running (Real-World Causes)
Cause A: Low traffic (the classic)
Because WP-Cron checks scheduled tasks during page loads, low-traffic sites can run cron late. WooCommerce documentation calls this out directly. (WooCommerce)
Typical victims:
- Membership sites with logged-in-only traffic
- B2B stores with bursts of visits
- New blogs
- Staging sites that still run scheduled tasks but never get visitors
Cause B: Loopback requests blocked
Loopbacks can fail due to:
- Web application firewall rules
- Security plugins blocking
wp-cron.php - HTTP auth on staging
- Server misconfiguration (DNS, IPv6, reverse proxy weirdness)
- REST API issues that often appear alongside loopback issues (Stack Overflow)
There are years of community threads linking loopback failures to cron failures. (WordPress Development Stack Exchange)
Cause C: You (or your host) disabled WP-Cron
Many performance guides recommend disabling WP-Cron and replacing it with a real server cron job. That’s often a good idea—if the server cron was actually set up.
If this constant exists in wp-config.php, WP-Cron won’t trigger on page loads:
define('DISABLE_WP_CRON', true);
Disabling the cron script is common on some stacks (including packaged environments) to reduce resource spikes. (docs.bitnami.com)
Cause D: Cron queue is jammed by long-running tasks
One monster task (a huge backup, a product sync, a migration) can:
- hit PHP time limits,
- exceed memory,
- trigger fatal errors,
- and leave follow-up tasks stuck behind it.
WooCommerce stores often see this when Action Scheduler jobs back up (payments, subscriptions, webhooks, renewals, background indexing). Action Scheduler is literally a job queue library for scheduled actions. (GitHub)
Cause E: Aggressive caching or blocked wp-cron.php
Some caching/security layers block access to wp-cron.php or prevent the request from firing reliably. This is especially common when:
- a security plugin blocks “unknown bots,”
- a WAF challenges internal requests,
- or server rules deny requests without a browser-like user agent.
Fixes: From Quick Patch to Best-Practice Setup
Fix 1: Make sure WP-Cron is enabled (if you didn’t intend to disable it)
Search wp-config.php for:
DISABLE_WP_CRONALTERNATE_WP_CRON
If you find this and you do not have a server cron job configured, comment it out:
// define('DISABLE_WP_CRON', true);
Then re-test using WP-CLI (wp cron test) or by checking whether scheduled posts now publish correctly.
Fix 2: Try ALTERNATE_WP_CRON (shared hosting “no crontab” workaround)
If your host blocks loopback requests but you can’t set a real cron job, ALTERNATE_WP_CRON can help in some environments by using a redirect-based approach rather than the normal spawn mechanism. (Erik L. Arneson)
Add to wp-config.php:
define('ALTERNATE_WP_CRON', true);
Re-test scheduled events. If it helps, great—if not, move to the best-practice fix below.
Fix 3 (Best Practice): Disable WP-Cron and run a real server cron every 5 minutes
This is the most reliable long-term solution for serious sites, WooCommerce stores, and membership platforms.
Step A: Disable WP-Cron spawning on page loads
Add to wp-config.php:
define('DISABLE_WP_CRON', true);
This approach is widely recommended by hosts and platform docs because it reduces random performance spikes and makes scheduling predictable. (DreamHost Knowledge Base)
Step B: Add a real cron job
Most hosts allow cron jobs in cPanel or similar. The typical command is to request wp-cron.php regularly.
Example (replace your domain):
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Why this works: You’re no longer dependent on “someone visiting your site” to run due tasks. Cron fires on a schedule—like it should.
Fix 4: Use WP-CLI to unstick cron events immediately
If tasks are already overdue, don’t wait. Run them.
wp cron event run --due-now
WP-CLI explicitly supports running all due cron events. (WordPress Developer Resources)
If you want to inspect what’s scheduled:
wp cron event list
Then you can run a specific hook (example):
wp cron event run some_hook_name
WooCommerce-Specific: Fix Delayed Emails and Past-Due Scheduled Actions
WooCommerce doesn’t just use WP-Cron; it also relies on scheduled actions (powered by Action Scheduler) for many background tasks. (GitHub)
Step 1: Inspect the queue
Go to WooCommerce → Status → Scheduled Actions.
Look for:
- Thousands of pending actions
- A repeating hook that fails constantly
- A large backlog of “past-due” items
WooCommerce documentation explains where to find these and how to review them. (WooCommerce)
Step 2: Identify the plugin causing the backlog
Common culprits:
- Payment gateways (Stripe/PayPal)
- Subscription systems
- Email marketing automations
- Import/export and sync plugins
- Backup plugins scheduling large jobs
If you see the same hook name repeating, that’s your lead.
Step 3: Fix the underlying cron issue first
If WP-Cron not running, Action Scheduler often suffers as a downstream effect.
So prioritize:
- loopback/site health issues,
- real server cron setup,
- then cleanup of stuck actions.
Step 4: Run due cron events via WP-CLI
If you can run WP-CLI, start with:
wp cron event run --due-now
Then reload the Scheduled Actions screen to see if the backlog shrinks.
Deeper Troubleshooting (When the “Basic Fixes” Don’t Work)
1) Confirm wp-cron.php is reachable (not blocked)
Try loading:
You might see a blank page—that’s normal. But if you see:
- 403 Forbidden
- 401 Unauthorized
- a security challenge page
- redirects to a login wall
…then cron can’t fire correctly.
Fix: whitelist wp-cron.php in your security plugin/WAF, and ensure the server allows loopback HTTP requests.
2) Fix loopback request failures
If Site Health flags loopbacks, the fix depends on the cause, but common solutions include:
- disabling “block external requests” settings (where applicable),
- adjusting firewall rules to allow the server to call itself,
- correcting DNS so the domain resolves locally,
- ensuring HTTPS is valid and not forcing odd redirects.
The key detail: loopbacks are used for scheduled events, and when loopbacks take too long or fail, WP-Cron may break. (WordPress Development Stack Exchange)
3) Find fatal errors that break cron execution
A scheduled event can die due to PHP fatals. Check:
- WordPress debug log (
wp-content/debug.logif enabled) - server error logs
- plugin logs (backup/email plugins often log failures)
If one cron task fatals every run, it can create a permanent backlog.
4) Reduce resource pressure: memory/timeouts
If backups are “stuck,” it’s often:
- memory too low,
- execution time too short,
- filesystem permissions,
- remote storage timeouts.
Cron isn’t “broken” here—cron is trying, but the job can’t finish.
5) Use WP-CLI as your truth serum
When in doubt, WP-CLI answers two questions fast:
- “Is cron spawning working?”
- “Are there due events, and can they run?”
wp cron test exists specifically to test the spawning system. (WordPress Developer Resources)
Prevention: Make WP-Cron Reliable Long-Term
If you never want to think about WP-Cron not running again:
- Use a real server cron every 5 minutes (best practice).
- Keep scheduled tasks lean (avoid huge jobs every minute).
- Monitor your Woo Scheduled Actions weekly (stores).
- Avoid stacking multiple heavy background plugins (backup + optimizer + sync + analytics indexers all fighting for resources).
- Treat loopback errors as urgent—they often impact more than cron (plugin editor, REST, background processing).
When to Get Help (Because Cron Problems Can Get Ugly Fast)
If your store is losing revenue because order emails aren’t sending, or backups have been “running” for days, it’s usually faster to have someone experienced trace the exact blocker (loopbacks, WAF, DNS, PHP fatals, Action Scheduler backlog).
If you want hands-on help, these WPFixit resources are relevant:
- WordPress support & repairs: https://www.wpfixit.com/
- Emergency-style help for broken functionality: https://www.wpfixit.com/wordpress-support/
- WooCommerce-specific help (store issues, emails, checkout problems): https://www.wpfixit.com/woocommerce-support/
- Speed and performance tuning (often tied to cron overload): https://www.wpfixit.com/wordpress-speed-optimization/
(Those are internal links meant to help you route the right kind of assistance.)
Helpful External References (Informational)
These are great “source of truth” references while troubleshooting:
- WordPress Plugin Handbook: WP-Cron overview and behavior (WordPress Developer Resources)
- WordPress
_wp_cron()reference (how spawning works) (WordPress Developer Resources) - WP-CLI cron command docs (
wp cron test,wp cron event run --due-now) (WordPress Developer Resources) - Action Scheduler (job queue library) overview (GitHub)
- Community evidence linking loopback failures to WP-Cron failures (WordPress.org)
TL;DR Fix Path
If you want the fastest route to a stable site:
- Check Tools → Site Health for loopback issues. (WordPress.org)
- If WooCommerce: check Scheduled Actions backlog. (WooCommerce)
- If possible, run:
wp cron testwp cron event run --due-now(WordPress Developer Resources)
- Implement the best-practice setup:
define('DISABLE_WP_CRON', true);- server cron every 5 minutes hitting
wp-cron.php(DreamHost Knowledge Base)
That combination eliminates the most common causes of WP-Cron not running—and stops missed posts, delayed Woo emails, and stuck backups from coming back.



