From the wp-cron.php file:
* WP-Cron is triggered when the site receives a visit. In the scenario
* where a site may not receive enough visits to execute scheduled tasks
* in a timely manner, this file can be called directly or via a server
* cron daemon for X number of times.
The short version is that wp-cron is a scheduler function that performs routine tasks such as checking for version updates of WordPress files, themes and plugins as well as maintenance tasks like identifying spam comments.
The main issue that needs to be addressed is that WP-cron.php is triggered by someone visiting the site. On the surface this seems a very straightforward way to cause a task to launch without requiring external dependencies (like setting up a cron job on the web server hosting WordPress, etc) but this method raises some problems
A problem with caching
If your site uses any type of caching (using memcached or redis or some other method), incoming requests will hit the caching layer before hitting the actual web service. In this case there is no page load happening on the server and therefore won’t trigger wp-cron.
A problem with low traffic sites
With a low traffic site, page loads happen so infrequently that wp-cron won’t run regularly. While this won’t necessarily affect performance of the actual site, WordPress updates or spam may not be identified in a timely manner
A problem with high traffic sites
With a high traffic site, the constant invoking of wp-cron by each page load adds to server load, effectively DDoS-ing your own site. In addition, two page requests could cause a race condition as multiple wp-cron jobs work to complete the same tasks.
Disable wp-cron
First we disable the auto-invoking of wp-cron by opening up wp-config.php and adding the following line:
define('DISABLE_WP_CRON', true);
Schedule wp-cron as a task
I like to rename the wp-cron.php file to something else so that it cannot readily be invoked by an external visitor who happens to know what wp-cron is and feels like adding more work to your server.
I then create a Scheduled Task on the web server (I’m running WordPress on IIS on Windows Server 2019) that calls the following:
php c:\<full path to wp-cron.php>\wp-cron.php
and is set to run every five minutes.
Other methods
Some other methods to invoke wp-cron are: