How to Replace WordPress Cron with a Real Cron Job

Have you ever noticed that your scheduled posts in WordPress are missing? Though WordPress has its own cron feature that dictates the scheduling of your blog's posts and events, WP-cron is not a literal cron job.

Linux Cron Job vs. WP-Cron

Linux cron jobs can be controlled by the user, making certain that the items constrained by schedule are run appropriately. Also, for a high-traffic WordPress site, a Linux cron job can assist with reducing the chances of downtime by lowering the bandwidth on the server, thus using less server resources.

WP-cron is a virtual cron that only works when the page is loaded. WP-cron is first loaded by WordPress when a page is requested on the front or backend of a site at which point WP-cron displays the necessary page to the site visitor. Though convenient, it is known to fail for a variety of reasons, including but not limited to the following:

  • Conflict of plugins
  • DNS-related issues
  • WordPress bugs
  • Use of caching plugins
  • Large server load

How to Replace WP-Cron With a Linux Cron Job

The best way to optimize the efficiency of your WordPress cron jobs is to disable WP-cron and set up a normal cron job through cPanel which will run every hour.

If you have multiple WordPress sites then you will need to stagger your cron jobs so that they do not all run at the same time. This could potentially cause your site to become restricted. Please see below for instructions on how to perform advanced configuration to avoid CPU issues:

This video will help walk you through your first time replacing a WP-cron with a Linux cron job. If you have multiple WordPress sites running on your server, be sure to check below for how to ensure that your WordPress cron jobs do not all run at the same time.

1. Disable wp-cron.php

You can disable WP-cron by modifying the wp-config.php (located in the folder where WordPress is installed). Open the wp-config.php file, add a new line after <?php, then add the following code on the new line:

define('DISABLE_WP_CRON', true);

2. Set Up a Linux Cron

Warning: It is important that you familiarize yourself with how cron jobs work. You need to have a working knowledge of Linux commands before you can use cron jobs effectively.

To set up a Linux cron job:

  1. Log into your cPanel.
  2. In the Advanced section, click Cron jobs.
  3. Under Add New Cron Job, select the time interval. HostGator recommends that you do not set the interval lower than 15 minutes.
  4. Set the cron command to the following, replacing with your actual domain name:
    wget -q -O - >/dev/null 2>&1
    The above command tells the Linux server to run wp-cron via wget, which will trigger the wp-cron.php script to do it's job on your schedule instead of on each page view. 
  5. Click Add New Cron Job to set the cron.

In order to test out the new cron, simply wait for the elapsed time period for the cron to run. In the event that the cron does not run, please review the steps listed above to ensure that you have completed all steps correctly.

Staggering Multiple WordPress Cron Jobs

Creating cron jobs for multiple WordPress crons without custom configuration can cause them all to fire at the same time. Having multiple cron jobs run at the same time can cause your CPU usage to increase, negating the benefit of using Linux cron jobs. To stagger your cron jobs:

  1. Divide 60 by the number of WordPress installations you have. If you have more than 60, simply use the number 1.
    Example: If you have 6 WordPress installations, 60 divided by 6 equals 10.
  2. When creating your wordpress cron jobs, use 0 for minutes for your first cron job.
  3. For each cron job after the first one, add the number you got in step 1.
    Note: If you have more than 60 WordPress sites, after you reach 59 you will need to start at 0 again. If you experience CPU issues with this many WordPress sites running cron jobs this frequently, you may wish to consider migrating some of your sites to a second account.

By following these steps you will ensure that your WordPress cron jobs run once per hour and that there is as little overlap as possible between them, which should greatly improve your CPU usage with this platform.