What Is WP-Cron in WordPress and Why Does It Matter?
If you have ever scheduled a post in WordPress and found it sitting unpublished hours past its due time, WP-Cron is a likely cause.
WP-Cron is WordPress's built-in task scheduler. It runs the background jobs that keep your site working without manual effort: publishing scheduled content, triggering backups, sending automated emails, checking for updates, and clearing expired data.
Most site owners never think about WP-Cron until something stops working. When it does, the failures tend to be silent. No error pages. No alerts. Just tasks that were supposed to happen automatically and did not.
This guide explains what WP-Cron is, what it controls, how it can fail, and what your options are.
Short Answer
WP-Cron is WordPress's internal task scheduler. It handles jobs that should happen automatically on a schedule: publishing scheduled posts, running plugin and theme update checks, triggering automated backups, sending plugin-queued emails, and cleaning up expired temporary data.
WP-Cron is not a real cron job. It does not run on a server timer. Instead, according to the WordPress developer documentation, WP-Cron hooks into page loads: it checks for pending tasks whenever someone visits a page on your site. On an active site with steady traffic, this usually works without issue. On a low-traffic site, scheduled tasks can be significantly delayed if few or no page requests arrive near the scheduled time. They wait until the next page load triggers a check.
What It Means in Practice
Think of WP-Cron as a checklist runner. Each time someone loads a page, WordPress quietly checks: "Are any background tasks due right now?" If yes, it runs them in the background while returning the page to the visitor as normal.
If nobody visits your site when a task is due, the task waits. It runs on the next page load instead.
What this means for site owners:
- A post scheduled to publish at 8:00 AM will not go live until the first visitor loads a page after 8:00 AM
- A backup scheduled for 2:00 AM will not run if no one visits the site overnight
- An automated email follow-up queued for a specific time may arrive late
For sites with consistent traffic during the day, the delay is usually small. For sites with low or unpredictable traffic, the delay can create real operational problems.
How WP-Cron Works in WordPress
The difference from a real cron
A server cron job runs on a timer. At 3:00 AM, it runs. No page visit is required.
WP-Cron works differently. It fires only when WordPress processes a page request. When a request comes in, WordPress:
- Checks the list of pending scheduled events
- Compares their due times against the current server time
- If any event is overdue or due now, triggers it via a background HTTP request to the
wp-cron.phpfile - Returns the page to the visitor normally
No page request means no cron check.
This design makes WordPress easier to install on shared hosting, where server-level cron access is not always available. But it creates timing issues on sites with limited traffic.
Where to see scheduled events
You cannot view WP-Cron tasks from the standard WordPress admin by default. Two options help:
- WP Crontrol (free plugin on WordPress.org by John Blackbourn): Lists all scheduled events, their next run times, and their last run times. You can run, edit, or delete events directly from the WordPress admin.
- WP-CLI: If your host supports this command-line tool,
wp cron event listshows all scheduled events.wp cron event run --due-nowmanually triggers any that are overdue. See the WP-CLI cron command reference for the full list of available commands.
If you are troubleshooting a suspected cron problem, WP Crontrol is the easiest starting point. It requires no technical knowledge to use.
The wp-config.php constant
Developers can disable WP-Cron's built-in page-load behavior by adding one line to wp-config.php:
define( 'DISABLE_WP_CRON', true );
This stops WordPress from running cron checks on every page load. A real server-side cron job is then set up separately to call wp-cron.php at a fixed interval. This approach is documented in the WordPress developer handbook and is covered in the "Real Cron Option" section below.
If you are not a developer, do not add this setting unless your hosting provider or developer confirms the server-side cron is already configured.
What WP-Cron Actually Handles
WP-Cron covers more than most site owners expect.
| Task type | Example |
|---|---|
| Scheduled post publishing | Posts, pages, or custom post types set to go live at a future date and time |
| Plugin update checks | WordPress checks for available plugin updates at regular intervals |
| Theme update checks | Same background process as plugin updates |
| WordPress core update checks | Background checks for new WordPress versions |
| Automated backups | Plugins like UpdraftPlus and similar tools trigger their scheduled backup runs via WP-Cron |
| Scheduled email sending | Newsletters, plugin-generated follow-up emails, and other messages queued for delivery at a specific time |
| Cache clearing | Some caching plugins use WP-Cron to refresh or purge cached pages on a schedule |
| Expired data cleanup | Clearing expired transients, pending spam comments, and stale session data |
| Social media scheduling | Auto-posting plugins fire scheduled posts to social accounts through WP-Cron |
| Plugin-defined scheduled events | Custom recurring tasks registered by plugins using the WordPress cron API |
If any of these stop working without an obvious cause, a delayed or broken WP-Cron is one of the first things worth checking.
Common Signs That WP-Cron Is Not Working
WP-Cron problems rarely show an error message. Instead, tasks stop happening.
Watch for:
- "Missed Schedule" label on a post. WordPress shows this when a post was scheduled to publish automatically but did not. Check Posts > All Posts and filter by Scheduled. Any post still in Scheduled status past its publish date is a signal.
- Backup plugin showing no recent runs. If your automated backup tool logs show a long gap since the last run, the scheduled trigger may not be firing.
- Scheduled plugin emails not sending. Some plugins queue emails to send at a specific time through WP-Cron. If those messages are delayed or missing, cron may not be firing on schedule.
- Email campaigns sending late. Newsletters or automated messages that should go out at a specific time are arriving hours late or not at all.
- Update notification badges lagging. WordPress relies on WP-Cron to periodically check for plugin and theme updates. If the admin dashboard shows stale update information, cron may be blocked.
- Scheduled social media posts not going out. Auto-posting tools that schedule content to social platforms fire those posts through WP-Cron. A cron problem means posts go out late or are not sent until the next trigger fires.
If you see more than one of these signs at once, install WP Crontrol and review the scheduled events list.
The Low-Traffic Problem
WP-Cron's page-load dependency was a design trade-off, not an oversight. It keeps WordPress easy to run on shared hosting where server cron access is not guaranteed.
But it creates real problems for sites with limited or irregular traffic.
| Site type | Why WP-Cron may fail |
|---|---|
| Staging or development site | Few or no real visitors; cron almost never fires |
| New site with low traffic | Not enough page loads to trigger tasks close to their scheduled time |
| Internal staff portal or client tool | Active users but limited total page traffic |
| Small business site with offline hours | Traffic drops at night; backups and overnight tasks may never run |
| Intranet or password-protected site | Restricted access limits the number of requests that trigger cron |
For these sites, the fix is to stop relying on WP-Cron's page-load trigger and use a proper server-side cron job instead.
The Real Cron Option
If you want more consistent scheduling regardless of traffic volume, you can disable WP-Cron's built-in behavior and replace it with a real server-side cron job. This approach is described in the WordPress developer handbook.
Step 1: Disable WP-Cron
Open wp-config.php and add this line before the line that reads /* That's all, stop editing! */:
define( 'DISABLE_WP_CRON', true );
This tells WordPress to stop checking for scheduled tasks on every page load.
Important: Do not complete Step 1 without also completing Step 2. Disabling WP-Cron without a server-side replacement means all scheduled tasks stop running entirely.
Step 2: Set up a server cron job
Create a cron job on your server to call WordPress cron at a regular interval. Every 5 to 15 minutes is typical.
Using wget:
*/5 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Using WP-CLI (preferred when your host supports it):
*/5 * * * * cd /path/to/wordpress && wp cron event run --due-now > /dev/null 2>&1
Replace yourdomain.com and /path/to/wordpress with your actual domain and WordPress installation path.
When to ask for help
Editing wp-config.php and configuring server cron jobs are developer-level tasks. If you are not comfortable with this, contact your hosting provider. Many hosts can help configure a server-side cron or document the setup steps for their specific platform in their support center.
If you work with a developer, this is a straightforward job for someone familiar with server administration.
What changes after the switch
- WordPress tasks are triggered at regular intervals set by your server cron job, rather than waiting for a page visit to occur
- Page load overhead is reduced slightly because WordPress no longer runs a cron check on every request
- Scheduled tasks no longer depend on site traffic to trigger, which improves timing consistency on low-traffic sites
Common Mistakes and Misconceptions
- Assuming WP-Cron works like a real timer. It does not fire at an exact clock time. It fires on the next page load after the scheduled time.
- Disabling WP-Cron without setting up a real cron job first. Adding
DISABLE_WP_CRONtowp-config.phpwithout a server replacement will stop all scheduled tasks from running. Nothing will trigger until the real cron is in place. - Blaming the backup plugin when backups stop. Backup tools are often the first suspect, but many backup failures trace back to WP-Cron not firing. Check cron health before replacing your backup tool.
- Ignoring the Missed Schedule label on posts. A missed schedule notice is a symptom, not a one-off glitch. Manually publishing the post does not fix the underlying cron problem.
- Thinking WP-Cron only affects content publishing. Backups, plugin-scheduled emails, update checks, cache management, social media posting, and any other plugin-registered scheduled events all go through WP-Cron. A single cron problem can silently affect many of these at the same time.
- Not auditing what plugins are scheduling. Plugins can register recurring cron events without surfacing them anywhere obvious. A site with many active plugins may have dozens of overlapping scheduled events. WP Crontrol lets you review and clean up the full list.
When You Should Care About This
If you publish scheduled content. Posts set to publish at a future date depend on WP-Cron. If your editorial calendar involves scheduled publishing, your cron reliability matters directly.
If you run automated backups. Backup plugins need WP-Cron to fire their scheduled jobs. If your backup log shows gaps or missed runs, cron is worth investigating before assuming the plugin is the problem. The best WordPress backup plugins guide covers which tools are reliable and what to look for in their scheduling setup.
If your site sends scheduled emails. Plugin-generated messages queued for a specific time, such as newsletters, scheduled follow-ups, and appointment reminders, depend on WP-Cron to trigger at the right moment. Pairing a reliable WordPress SMTP plugin with a healthy cron setup covers both the scheduling side and the delivery side of email.
If you use auto-posting to social media. Plugins that schedule content to go live on Facebook, Instagram, LinkedIn, or similar platforms trigger those posts through WP-Cron. A cron problem means posts go out late or are not sent until the next trigger fires.
If your site has low or seasonal traffic. Sites with limited overnight visitors, staging environments, or heavy traffic only during business hours are more exposed to WP-Cron timing issues. The real cron setup described above is worth configuring in those cases.
As part of routine site care. Checking cron health once a month with WP Crontrol takes about two minutes and can catch silent problems before they affect your content, emails, or backups.
Related Next Steps
- Check your scheduled events now. Install WP Crontrol and open the scheduled events list in the WordPress admin. Look for events with very old last-run times or events that appear stuck in a pending state.
- Review your backup log. Open your backup plugin and check when the last successful backup ran. A gap in the log is a signal to investigate cron health.
- Ask your hosting provider about server cron. If you experience repeated cron issues, ask your host whether a server-side cron option is available for your plan and how to set it up.
- Check your scheduled posts. Go to Posts > All Posts and filter by Scheduled. Any post past its publish date and still in Scheduled status confirms a cron problem.
- Add WP-Cron to your regular maintenance routine. Your WordPress website maintenance checklist is a good place to include a monthly cron health check. A quick review with WP Crontrol is enough to confirm everything is running as expected.