A site whose post scheduled for nine in the morning only publishes late in the morning, or whose nightly backup seems to skip every other night, is usually suffering from a widespread misunderstanding about how WordPress works: the system meant to run these scheduled tasks, called WP-Cron, is not a true scheduler in the sense a server would mean it.

What WP-Cron actually does

A real cron, at system level, is a server mechanism that fires at fixed times, independently of any outside activity, exactly like a clock. WP-Cron, by contrast, only fires when a visitor loads a page on the site. On every page load, WordPress checks whether a scheduled task is due, and if so, runs it at that exact moment rather than the intended time. This design, originally chosen to work on any hosting without specific server configuration, works reasonably well as long as the site receives a steady flow of visits.

The problem on a low traffic site

A showcase site or a blog visited by a handful of people a day can go several hours with no visits at all, particularly at night. If a task is scheduled for three in the morning and no visitor loads a page before eight, that task simply does not run until that moment. A post planned for early morning therefore publishes late, a nightly backup shifts accordingly, and a scheduled email goes out much later than intended, with no visible error anywhere in the site's admin.

The opposite problem on a high traffic site

On a site receiving significant traffic, WP-Cron fires on every page load, which can mean a check running dozens or hundreds of times a minute. This repeated check needlessly consumes server resources, and can contribute to a general slowdown that is hard to diagnose, since its effect blends in with other processes on the site rather than standing out as an isolated cause.

The recommended fix: a real system cron

The standard fix is to disable WP-Cron's default behavior by adding the line define parenthesis quote DISABLE_WP_CRON quote comma true close parenthesis semicolon to the wp-config.php file, then setting up a real cron at the server level, usually accessible through the hosting control panel or via command line. This system cron calls the site's wp-cron.php file at a regular interval, often every five minutes, guaranteeing reliable execution of scheduled tasks regardless of the site's actual traffic. Most WordPress oriented hosting providers offer this setup in a few clicks from their management interface.

Diagnosing a scheduled task that does not run

Before changing the configuration, it is useful to precisely check which tasks are scheduled and when, which a plugin such as WP Crontrol allows, displaying the full list of scheduled events, letting you trigger them manually for testing, and helping spot a stuck or duplicated task, a common issue when several plugins schedule similar checks without coordinating with each other.

The case of heavy, repetitive tasks

For more complex processing than a simple delayed publication, such as regularly syncing data with a CRM or automatically sending reminders to clients, a library such as Action Scheduler, natively bundled with WooCommerce but usable independently, manages a persistent database backed queue, with precise tracking of each task's status. This approach suits a custom PHP build or a business automation needing higher reliability better than a simple WP-Cron hook.

Points to verify before publishing: confirm that the recommended syntax for disabling WP-Cron in wp-config.php remains unchanged for current WordPress versions, and check that the WP Crontrol plugin mentioned remains actively maintained and available in the official directory at the time of publication.