WordPress Cron – How WP-Cron Works, Why It Slows Down Your Site, and How to Replace It with System Cron

Published: March 20, 2026 · Author: Marcin Szewczyk-Wilgan

WordPress has a built-in background task scheduling mechanism – WP-Cron. It handles publishing scheduled posts, checking for updates, running backups, sending newsletters, and dozens of other operations. The problem is that WP-Cron is not a real cron – it does not run continuously but only fires when someone visits the site. This leads to two scenarios: on low-traffic sites tasks are delayed, and on high-traffic sites – every page load adds server overhead by checking the database. The solution is simple and recommended even by the official WordPress documentation: disable WP-Cron and replace it with system cron.

How WP-Cron Works

WP-Cron is a “virtual cron” – an emulation of system cron implemented in PHP. It was designed in the era when WordPress primarily ran on shared hosting without access to system crontab.

Triggering mechanismOn every page load, WordPress checks the wp_options table (key “cron”) for the list of scheduled tasks. If any task is “due” – it executes it. This means WP-Cron does not run in the background – it is triggered by site traffic.
No time guaranteeIf nobody visits the site between 2:00 PM and 5:00 PM, a task scheduled for 2:00 PM will not run until 5:00 PM – on the first visit. The official WordPress documentation confirms: “you cannot be 100% certain when a task will run – you can be certain it will eventually run.”
What WP-Cron handlesPublishing scheduled posts, checking and installing updates, daily backups (backup plugins), sending scheduled emails and newsletters, clearing transients, generating reports, syncing with external service APIs – every plugin can register its own cron tasks.

WP-Cron Performance Problems

WP-Cron was designed as a pragmatic solution for limited hosting environments. On modern sites with traffic, caching, and performance requirements – it becomes a problem.

High traffic

Overhead on every page load

Every page view triggers a database check for cron tasks. On a site with 10,000 visits per day, that is 10,000 extra SQL queries. If there are no free PHP-FPM processes, cron waits in the queue, blocking the response for the user. This is a measurable impact on TTFB.

Low traffic

Tasks fail to run

A blog with a dozen visits per day – a post scheduled for 8:00 AM will not publish if the first visitor arrives at noon. Backups, update checks, syncing – everything waits for a visit. This is unreliable for time-critical operations.

Cache

Conflict with page caching

Caching plugins serve static pages, bypassing PHP. If most requests hit the cache – WP-Cron is not triggered. Tasks pile up and fire all at once when someone hits a non-cached page – causing a server load spike.

Security

Public endpoint

The wp-cron.php file is publicly accessible. Bots can call it repeatedly, forcing repeated task checking and execution. This consumes server resources and can lead to duplicate operations – e.g., double email sends or multiple backups.

Solution: Disabling WP-Cron and Configuring System Cron

The official WordPress documentation (Plugin Handbook) recommends disabling WP-Cron and replacing it with system cron. This is a simple, safe operation with immediate results. Here is the step-by-step procedure:

Step 1: Disable WP-CronAdd the following line to wp-config.php (before the “That’s all, stop editing!” comment): define('DISABLE_WP_CRON', true); – this disables the automatic cron trigger on page load. Important: after this step, scheduled tasks will not run – proceed to step 2 immediately.
Step 2: System cronAdd a task in your server’s system crontab (via SSH or hosting panel e.g. cPanel → Cron Jobs). Typical configuration: every 15 minutes for standard sites, every 5 minutes for active WooCommerce stores. Command: */15 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Step 3: VerificationInstall the WP Crontrol plugin – it shows a list of scheduled tasks and their status. Verify that tasks are running at expected intervals. Monitor for a few days – make sure scheduled posts publish on time, backups run, and updates are checked.
Alternative: ALTERNATE_WP_CRONIf you do not have access to system crontab (shared hosting without SSH), you can use define('ALTERNATE_WP_CRON', true); – WordPress will run cron as a separate process after the page loads, instead of during. This is better than the default behavior, but inferior to system cron.

When Optimizing WP-Cron Makes Sense

Not every site requires a full WP-Cron replacement with system cron. Here are scenarios where optimization is critical:

High-traffic sitesAny site with traffic above 1,000 visits per day will feel the WP-Cron overhead. System cron eliminates extra SQL queries on every page load – this can improve TTFB by 15–30% under heavy traffic.
WooCommerce storesWooCommerce uses WP-Cron extensively: order processing, transactional email delivery, stock updates, reports. Delayed cron = delayed order confirmation emails. System cron every 5 minutes is the minimum for stores.
Sites with cachingIf you use page caching (which you should) – WP-Cron may not be triggered by cached requests. System cron solves this – it calls wp-cron.php directly, regardless of caching.
WordPress MultisiteIn Multisite installations, WP-Cron must handle tasks for multiple sites – the overhead grows proportionally. System cron (or dedicated solutions like Cavalcade) is a necessity for 10+ sites.

Summary

WP-Cron is a pragmatic solution from the shared hosting era – but on modern WordPress sites with traffic, caching, and performance requirements, it becomes a burden. Disabling WP-Cron and replacing it with system cron is one of the simplest and most effective WordPress optimizations. The operation takes a few minutes, is recommended by the official documentation, and delivers immediate results – predictable task execution, lower server overhead, and better TTFB.

At WebOptimo, system cron configuration is a standard part of WordPress deployment and care. We optimize task schedules, monitor their execution, and eliminate unnecessary cron entries left by removed plugins. Contact us or check our WordPress care and server administration offer.

Frequently Asked Questions About WordPress Cron

WP-Cron is WordPress’s built-in mechanism for scheduling tasks – publishing posts, backups, updates, emails. It is not a real cron – it only fires when a user loads a page.

Every page load triggers a database check for cron tasks. On high-traffic sites, this means thousands of extra SQL queries. Conflict with caching – cached pages bypass PHP, so cron does not fire.

Add define('DISABLE_WP_CRON', true); in wp-config.php. After disabling, immediately set up system cron – otherwise scheduled tasks will stop working.

In the server’s crontab (SSH or hosting panel), add a task that calls wp-cron.php every 5–15 minutes. Command: */15 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Yes – provided you set up system cron as a replacement. This approach is recommended by the official WordPress documentation. System cron is more reliable and does not add overhead to the site.

Let’s Talk About Your WordPress Site Performance

We will configure system cron and optimize your scheduled tasks. No commitments – a concrete proposal after analysis.

Phone

+48 608 271 665

Mon–Fri, 8:00–16:00 CET

E-mail

contact@weboptimo.pl

We respond within 24h

Company

WebOptimo

VAT ID: PL6391758393