I use Kinsta hosting for the WordPress sites I run at Business Website Leader. Part of my deployment process is to set up proper Kinsta cron jobs at the server level using the wp-cli.

Kinsta has a proper cron already set up for each site you create. However, they do not disable the WordPress poor-man-cron or set the cron intervals to a frequency I like (every five minutes).

First, I like to disable the WordPress poor-man-cron by adding the following to a site’s wp-config.php.

define('DISABLE_WP_CRON', true);

On Kinsta, this will not stop cron from running because each server has server-level cron enabled by default. DISABLE_WP_CRON only disables the WordPress poor-man-cron.

Next, I SSH into the server and edit the crontab with crontab -e. Now, I can set the interval to 5 minutes with */5 * * * *.

*/5 * * * * curl -kILs -H 'Host: example.com' https://localhost/wp-cron.php?server_triggered_cronjob >/dev/null 2>&1 # Kinsta Primary domain cron

This works well. But, I like to use the wp-cli for cron jobs. Here is how that looks:

*/5 * * * * /usr/local/bin/wp cron event run --due-now --path=/www/examplesite_098/public --url=https://example.com

And, that’s it. Cron is now working using the wp-cli on Kinsta WordPress hosting.

UptimeRobot

To ensure cron is working as expected I also set up a heartbeat check using UptimeRobot. I will not go into detail on how UptimeRobot heartbeat checks work outside of showing you a screenshot.

uptime robot cron example
UptimeRobot Heartbeat Cron

Here, I have created a heartbeat monitor with an interval equal to my wp-cli (five minutes). The heartbeat monitor provides a unique URL that should be pinged by your cron at that interval or faster.

Next, I add the following to my WordPress theme or a custom plugin. This code will get trigger by the server cron.

// Cron
add_action( 'bz_cron_hook', 'bz_cron_hook_action' );
function bz_cron_hook_action()
{
    if(defined('BWL_CRON_MONITOR_URL')) {
        wp_remote_get(BZ_CRON_MONITOR_URL)->exec();
    }
}

add_filter( 'cron_schedules', 'bz_cron_interval' );
function bz_cron_interval( $schedules ) {
    $schedules['five_minutes'] = array(
        'interval' => 60 * 5,
        'display'  => esc_html__( 'Every 5 Minutes' ), );
    return $schedules;
}

if ( ! wp_next_scheduled( 'bz_cron_hook' ) ) {
    wp_schedule_event( time(), 'five_minutes', 'bz_cron_hook' );
}

Finally, I define BZ_CRON_MONITOR_URL in the wp-config.php file.

define('BZ_CRON_MONITOR_URL', 'https://heartbeat.uptimerobot.com/….’);

You can then list the events using wp-cli:

wp cron schedule list

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Get Involved & Explore More

an abstract painting with blue and yellow colors

Catch up on what I’ve been writing lately.

Show your gratitude.

Join Dare To Code Email List

Get emails from me on full-stack PHP development by subscribing to the Dare To Code mailing list.