wp_cron

The timeline below displays how wordpress function wp_cron has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Registers _wp_cron() to run on the {@see 'wp_loaded'} action.
 *
 * If the {@see 'wp_loaded'} action has already fired, this function calls
 * _wp_cron() directly.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper.
 *
 * @return false|int|void On success an integer indicating number of events spawned (0 indicates no
 *                        events needed to be spawned), false if spawning fails for one or more events or
 *                        void if the function registered _wp_cron() to run on the action.
 */
function wp_cron()
{
    if (did_action('wp_loaded')) {
        return _wp_cron();
    }
    add_action('wp_loaded', '_wp_cron', 20);
}

WordPress Version: 6.2

/**
 * Registers _wp_cron() to run on the {@see 'wp_loaded'} action.
 *
 * If the {@see 'wp_loaded'} action has already fired, this function calls
 * _wp_cron() directly.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper.
 *
 * @return bool|int|void On success an integer indicating number of events spawned (0 indicates no
 *                       events needed to be spawned), false if spawning fails for one or more events or
 *                       void if the function registered _wp_cron() to run on the action.
 */
function wp_cron()
{
    if (did_action('wp_loaded')) {
        return _wp_cron();
    }
    add_action('wp_loaded', '_wp_cron', 20);
}

WordPress Version: 5.7

/**
 * Register _wp_cron() to run on the {@see 'wp_loaded'} action.
 *
 * If the {@see 'wp_loaded'} action has already fired, this function calls
 * _wp_cron() directly.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper.
 *
 * @return bool|int|void On success an integer indicating number of events spawned (0 indicates no
 *                       events needed to be spawned), false if spawning fails for one or more events or
 *                       void if the function registered _wp_cron() to run on the action.
 */
function wp_cron()
{
    if (did_action('wp_loaded')) {
        return _wp_cron();
    }
    add_action('wp_loaded', '_wp_cron', 20);
}

WordPress Version: 5.4

/**
 * Run scheduled callbacks or spawn cron for all scheduled events.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 *
 * @return bool|int On success an integer indicating number of events spawned (0 indicates no
 *                  events needed to be spawned), false if spawning fails for one or more events.
 */
function wp_cron()
{
    // Prevent infinite loops caused by lack of wp-cron.php.
    if (strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
        return 0;
    }
    $crons = wp_get_ready_cron_jobs();
    if (empty($crons)) {
        return 0;
    }
    $gmt_time = microtime(true);
    $keys = array_keys($crons);
    if (isset($keys[0]) && $keys[0] > $gmt_time) {
        return 0;
    }
    $schedules = wp_get_schedules();
    $results = array();
    foreach ($crons as $timestamp => $cronhooks) {
        if ($timestamp > $gmt_time) {
            break;
        }
        foreach ((array) $cronhooks as $hook => $args) {
            if (isset($schedules[$hook]['callback']) && !call_user_func($schedules[$hook]['callback'])) {
                continue;
            }
            $results[] = spawn_cron($gmt_time);
            break 2;
        }
    }
    if (in_array(false, $results, true)) {
        return false;
    }
    return count($results);
}

WordPress Version: 5.1

/**
 * Run scheduled callbacks or spawn cron for all scheduled events.
 *
 * Warning: This function may return Boolean FALSE, but may also return a non-Boolean
 * value which evaluates to FALSE. For information about casting to booleans see the
 * {@link https://php.net/manual/en/language.types.boolean.php PHP documentation}. Use
 * the `===` operator for testing the return value of this function.
 *
 * @since 2.1.0
 * @since 5.1.0 Return value added to indicate success or failure.
 *
 * @return bool|int On success an integer indicating number of events spawned (0 indicates no
 *                  events needed to be spawned), false if spawning fails for one or more events.
 */
function wp_cron()
{
    // Prevent infinite loops caused by lack of wp-cron.php
    if (strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
        return 0;
    }
    $crons = wp_get_ready_cron_jobs();
    if (empty($crons)) {
        return 0;
    }
    $gmt_time = microtime(true);
    $keys = array_keys($crons);
    if (isset($keys[0]) && $keys[0] > $gmt_time) {
        return 0;
    }
    $schedules = wp_get_schedules();
    $results = array();
    foreach ($crons as $timestamp => $cronhooks) {
        if ($timestamp > $gmt_time) {
            break;
        }
        foreach ((array) $cronhooks as $hook => $args) {
            if (isset($schedules[$hook]['callback']) && !call_user_func($schedules[$hook]['callback'])) {
                continue;
            }
            $results[] = spawn_cron($gmt_time);
            break 2;
        }
    }
    if (in_array(false, $results, true)) {
        return false;
    }
    return count($results);
}

WordPress Version: 4.3

/**
 * Run scheduled callbacks or spawn cron for all scheduled events.
 *
 * @since 2.1.0
 */
function wp_cron()
{
    // Prevent infinite loops caused by lack of wp-cron.php
    if (strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
        return;
    }
    if (false === $crons = _get_cron_array()) {
        return;
    }
    $gmt_time = microtime(true);
    $keys = array_keys($crons);
    if (isset($keys[0]) && $keys[0] > $gmt_time) {
        return;
    }
    $schedules = wp_get_schedules();
    foreach ($crons as $timestamp => $cronhooks) {
        if ($timestamp > $gmt_time) {
            break;
        }
        foreach ((array) $cronhooks as $hook => $args) {
            if (isset($schedules[$hook]['callback']) && !call_user_func($schedules[$hook]['callback'])) {
                continue;
            }
            spawn_cron($gmt_time);
            break 2;
        }
    }
}

WordPress Version: 3.7

/**
 * Run scheduled callbacks or spawn cron for all scheduled events.
 *
 * @since 2.1.0
 *
 * @return null When doesn't need to run Cron.
 */
function wp_cron()
{
    // Prevent infinite loops caused by lack of wp-cron.php
    if (strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) {
        return;
    }
    if (false === $crons = _get_cron_array()) {
        return;
    }
    $gmt_time = microtime(true);
    $keys = array_keys($crons);
    if (isset($keys[0]) && $keys[0] > $gmt_time) {
        return;
    }
    $schedules = wp_get_schedules();
    foreach ($crons as $timestamp => $cronhooks) {
        if ($timestamp > $gmt_time) {
            break;
        }
        foreach ((array) $cronhooks as $hook => $args) {
            if (isset($schedules[$hook]['callback']) && !call_user_func($schedules[$hook]['callback'])) {
                continue;
            }
            spawn_cron($gmt_time);
            break 2;
        }
    }
}