When WordPress cron not running becomes the diagnosis after investigating why scheduled posts are not publishing, why backup notifications are missing, or why automatic updates are not happening — it is simultaneously one of the more obscure WordPress problems and one of the more consequential ones. WP-Cron is the scheduling backbone for a large proportion of WordPress’s automated functionality, and when WordPress cron not running is confirmed, every time-based operation that depends on it is silently failing too. Scheduled posts stay as drafts past their publish time. Automatic plugin updates that should apply security patches are not happening. Backup plugins are not creating backups. Cleanup processes are not running. None of this produces a visible error on the site — everything looks fine, and the failures are only discovered retrospectively. This guide covers how to confirm whether WordPress cron not running is actually the problem, the specific causes that most commonly produce it, and every available fix from the simple server-level configuration change to the most reliable permanent solution. For a broader walkthrough, our Complete Guide to WordPress How is a good next read.
How WP-Cron Works and Why It Stops Running
WP-Cron is not a traditional cron job. A traditional cron job is a command scheduled by the server’s operating system to run at a specified time, independently of any web traffic. WP-Cron is a WordPress-internal simulation that works by checking for due scheduled tasks on every page request — when a visitor loads any page, WordPress checks whether any scheduled events are past due and fires them if so. This traffic-dependency is what makes WordPress cron not running an eventual problem on most sites that do not explicitly replace WP-Cron with a real server-side cron job.
On a site with consistent traffic, WP-Cron works adequately for most scheduled tasks. On a site with sparse traffic — where hours can pass between page requests — the WordPress cron not running problem manifests as scheduled events firing late or not at all, because no page request is triggering the cron check during the window when the event should fire. A post scheduled for 9:00am may not publish until the first visitor loads a page after 9:00am — which could be 9:02am or 3:00pm depending on traffic patterns.
The other common cause of WordPress cron not running is a server configuration that blocks the loopback HTTP request WP-Cron makes to itself. WP-Cron works by making an HTTP request to yoursite.com/wp-cron.php from the server — a request from the server to itself. Security firewalls, server configurations that block outbound HTTP requests to the site’s own domain, and certain WAF rules can prevent this loopback from completing, which means WP-Cron never actually executes its scheduled tasks even when triggered. The WordPress Site Health tool checks for this and flags it when the loopback request is blocked — go to Tools → Site Health → Status and look for a “Scheduled events” or “Background updates” test result. A failed result here is direct confirmation that WordPress cron not running due to a blocked loopback is the issue.
Diagnose Whether WordPress Cron Is Actually Running
Confirming that WordPress cron not running is genuinely the problem — rather than a different cause producing similar symptoms — is the essential first step before applying any fix. The WP Crontrol plugin (free; WordPress Plugin Directory) provides the most direct visibility into the WP-Cron system’s current state.
- Install WP Crontrol from the WordPress Plugin Directory and activate it
- Navigate to Tools → Cron Events in the WordPress admin
- Review the list of scheduled events. Each event shows its hook name, schedule (hourly, daily, etc.), and next scheduled run time. If the Next Run column shows times significantly in the past — hours or days overdue — the events are scheduled but not executing, which confirms WordPress cron not running
- Look at the Cron Schedules tab for any indication of disabled or misconfigured schedules
- To manually trigger a cron event for testing: click Run Now next to any overdue event. If the event runs successfully when triggered manually but does not run on schedule, the scheduled trigger mechanism is the problem rather than the event’s code itself
- In WP Crontrol → Settings, check whether WP-Cron is disabled. WP Crontrol shows an alert if
DISABLE_WP_CRONis set to true in wp-config.php — this is the definitive cause when present - Also check WordPress Site Health: Tools → Site Health → Status. A failed “Scheduled events” check confirms the scheduler is not working and provides additional detail about the specific failure mode
If WP Crontrol shows events running on schedule and Site Health passes the scheduled events check, WordPress cron not running is not the actual problem — investigate the specific feature that appears broken (missed posts, missing backups) directly rather than through the cron diagnostic. WP-Cron not running is a real and common issue, but it is sometimes blamed for problems that actually have different root causes.
Fix WordPress Cron Not Running — Enable the Loopback Request
When WordPress Site Health fails the “Scheduled events” or “Background updates” check and specifically identifies a loopback request failure, the WordPress cron not running cause is a server configuration that blocks HTTP requests from the server to its own domain. This is the most common cause of WordPress cron not running on certain shared hosting configurations and on servers behind specific WAF rules.
The fix depends on what is blocking the loopback. On shared hosting where the host’s firewall is the blocker, contact the hosting provider’s support team and explain that the WordPress loopback request to yoursite.com/wp-cron.php is being blocked, causing WordPress cron not running for scheduled events. Provide the Site Health check result as evidence. Most hosting providers can whitelist the loopback request for your account — this resolves the issue without requiring any WordPress-level configuration changes.
On servers where you have more control — VPS environments, dedicated servers — check the server firewall rules and the .htaccess file for any rules blocking requests to /wp-cron.php. Security plugins sometimes add rules to block direct access to wp-cron.php as a security measure — but blocking all access also prevents WP-Cron from making its self-referencing loopback. In the security plugin’s settings, add wp-cron.php to the whitelist or create an exception for the loopback request. Alternatively, configuring a real server cron job (covered in the next section) bypasses the loopback request entirely — making the loopback block irrelevant to cron execution, which is a cleaner long-term resolution to WordPress cron not running from a loopback failure.
Replace WP-Cron With a Real Server Cron Job
The most reliable and permanent fix for WordPress cron not running in any of its forms is replacing the traffic-dependent WP-Cron with a real server-scheduled cron job. A server cron job runs on the operating system’s scheduler independently of web traffic, executes at exactly the configured time regardless of whether any visitors are on the site, and is not subject to the loopback request blocking that causes WP-Cron failures. This is the approach recommended by WordPress for any production site where scheduled reliability matters.
- First, disable WP-Cron in WordPress so it no longer fires on page loads (which would create duplicate execution alongside the server cron). Open
wp-config.phpvia FTP and add this line before “That’s all, stop editing!”:define( 'DISABLE_WP_CRON', true );
- Log in to cPanel and navigate to Cron Jobs (under Advanced)
- Set the schedule — every 5 minutes is the standard recommendation for WordPress cron. Configure:
- Minute:
*/5 - Hour:
* - Day:
* - Month:
* - Weekday:
*
- Minute:
- Set the command — use the wget approach that works on most shared hosting:
wget -q -O /dev/null https://yoursite.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Replace yoursite.com with your actual domain. Alternatively, if your host provides PHP CLI access:
/usr/local/bin/php /home/username/public_html/wp-cron.php > /dev/null 2>&1
- Save the cron job
- Wait 10 minutes and check WP Crontrol → Cron Events. Overdue events should now show as having run recently, confirming the server cron job has resolved WordPress cron not running
- Test a specific scheduled function: create a draft post scheduled 6 minutes in the future and confirm it publishes automatically at its scheduled time
On managed WordPress hosting — Kinsta, WP Engine, Cloudways — server cron access is available through the hosting dashboard rather than through cPanel. Kinsta’s MyKinsta dashboard has a dedicated WordPress Cron section; WP Engine exposes this through their User Portal. Follow the host-specific documentation for adding the cron command, since the command syntax and PHP path may differ from the standard cPanel approach described above.
Plugins Causing WordPress Cron to Stop Running
Some plugins actively interfere with WP-Cron in ways that cause WordPress cron not running for specific scheduled events or for the entire cron system. The most common plugin-caused cron failures come from plugins that modify the cron scheduling in ways that break other plugins’ scheduled events, and from security plugins with aggressive request filtering that blocks the WP-Cron loopback.
Certain optimisation and performance plugins include a feature to “disable WP-Cron” or “run WP-Cron on a custom schedule” — features that make sense in isolation but cause WordPress cron not running when the custom implementation is incomplete or conflicts with the server cron job setup. Check settings in any installed performance, optimisation, or hosting management plugins for WP-Cron-related settings. If a plugin is managing WP-Cron behaviour and conflicting with your server cron job setup, disable the plugin’s cron management in its settings and let the server cron job handle scheduling exclusively.
Caching plugins that cache the wp-cron.php response are a specific cause of WordPress cron not running even when the cron job fires correctly. If the caching plugin serves a cached response to the wp-cron.php URL, the actual cron execution PHP code never runs — WordPress receives a cached success response without the scheduled events being processed. Explicitly exclude /wp-cron.php from the caching plugin’s cache. In WP Rocket, this is under Advanced Rules → Never Cache URLs → add /wp-cron.php. In WP Super Cache and LiteSpeed Cache, similar exclusion rules prevent wp-cron.php from being cached, ensuring the server cron job triggers actual execution rather than a cached response when WordPress cron not running was previously caused by this specific interaction.
Monitoring WordPress Cron After the Fix
After resolving WordPress cron not running, ongoing monitoring confirms the fix is working as expected and catches any regression — such as the server cron job being accidentally deleted, or a plugin disabling WP-Cron again after an update — before it causes missed scheduled events to accumulate unnoticed.
| Monitoring Tool | What It Checks | Best For |
|---|---|---|
| WP Crontrol plugin | WP-Cron event queue, last run times, missed events | Regular manual checks; development and debugging |
| WordPress Site Health | Scheduled events test, background updates test | Quick status overview; alerts on critical cron failures |
| Healthchecks.io (free tier) | Monitors whether the cron job is firing on schedule via ping | Automated external monitoring with email alert on missed pings |
| Better Cron Job plugin | WordPress cron execution log with timestamps and event details | Persistent logging for post-incident investigation |
Healthchecks.io is particularly useful for monitoring that WordPress cron not running has not recurred. The free tier allows creating a monitor with a URL that your cron job pings each time it runs — if a ping is missed within the expected window, Healthchecks.io sends an email alert. Modify the server cron command to include a curl request to the Healthchecks.io ping URL after the wp-cron.php execution: wget -q -O /dev/null https://yoursite.com/wp-cron.php && curl -s https://hc-ping.com/YOUR-UUID > /dev/null. This gives continuous external confirmation that the server cron job is firing and completing successfully.
Our guide on fixing the WordPress missed schedule error covers the post scheduling side of WP-Cron failure — the specific symptom of scheduled posts not publishing that is the most visible consequence of WordPress cron not running. Our guide on how to troubleshoot WordPress errors covers the systematic diagnostic approach including Site Health checks that identify WP-Cron failures before specific scheduled events are missed. The WordPress developer documentation on WP-Cron covers the API for registering, managing, and debugging custom cron events — the technical reference for understanding what WP-Cron is doing and why WordPress cron not running affects specific events differently depending on how they are registered. If this sounds familiar, How to Change WordPress Admin Email Safely With a Proven Secure Method is worth a look.







