In WordPress, the wp-cron plays a crucial role in automating tasks that need to occur periodically. From publishing scheduled posts to clearing spam comments or checking for updates wp-cron makes it possible for WordPress to handle routine tasks without manual intervention.

What is wp-cron?

To put it simply, wp-cron is cron for WordPress. Cron jobs are scheduled tasks that run automatically based on a time interval. Unlike traditional cron systems, which are managed by the operating system, WordPress’s wp-cron system is triggered by website traffic. Each time someone visits our site, WordPress checks if any scheduled tasks are due to run and executes them.

While this system is convenient, it does have its downsides. For example if our website doesn’t receive regular traffic, scheduled tasks may not run as expected. However, we can optimize wp-cron by customizing it for more control over when and how tasks are executed.

Customizing wp-cron

1. Adding a custom schedule

We can create a custom cron schedule by using the add_filter function, we hook into the cron_schedules filter to add a new schedule with a 5-hour interval. This interval is defined in seconds (5 * HOUR_IN_SECONDS), making it easy to define custom timeframes for tasks.

function add_my_cron_schedule($schedules) {
    $schedules['five_hours'] = array(
        'interval' => 5 * HOUR_IN_SECONDS,
        'display'  => esc_html__( 'Every Five Hours' ),
    );
    return $schedules;
}
add_filter('cron_schedules', 'add_my_cron_schedule');

2. Define the cron job

The second function defines the cron job itself. In this example the my_cron_job function fetches data from an external API. We use wp_remote_get to make the HTTP request, retrieve the response body and then decode the JSON data.

Finally, we store this data in the WordPress database using the update_option function, saving it under the option name external_data.

function my_cron_job() {
    // Random post ID.
    $post_id = time() % 100;

    // Fetch data from an external API.
    $response = wp_remote_get('https://jsonplaceholder.typicode.com/posts/' . $post_id);
    $body = wp_remote_retrieve_body($response);

    $json = json_decode($body, true);
    update_option('external_data', $json);
}
add_action('my_cron_event', 'my_cron_job');

3. Schedule cron job

Next, we need to ensure that the cron job is scheduled to run at the custom interval. Using wp_schedule_event, we schedule the my_cron_event to run every 5 hours, which is defined by our custom five_hours interval. This job is triggered by the init hook, meaning it will run when WordPress initializes.

function schedule_cron_job() {
    if ( ! wp_next_scheduled('my_cron_event') ) {
        wp_schedule_event(time(), 'five_hours', 'my_cron_event');
    }
}
add_action('init', 'schedule_cron_job');

4. Display the fetched data

Finally, we add a template_redirect action to display the fetched data on the frontend. Here, we retrieve the stored data with get_option and use print_r to output it.

add_action('template_redirect', function() {
    $data = get_option('external_data');
    print_r($data);
});

Conclusion

By creating custom cron schedules, we can automate complex tasks and improve the efficiency of our site. Whether its fetching external data, cleaning up our database, or sending out email updates, wp-cron is an invaluable tool that helps keep our site running smoothly.

Leave a Reply

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