WordPress.org

Make WordPress Core

Opened 2 years ago

Closed 21 months ago

#18100 closed defect (bug) (invalid)

Cron Loop does not work

Reported by: luis.ferro Owned by:
Priority: normal Milestone:
Component: Cron Version: 3.2
Severity: blocker Keywords: has-patch
Cc:

Description (last modified by kawauso)

The cron loop existing on cron.php in the wp-includes does not work.

The wp_cron() shows code that doesn't re-lists recurring events and does not fire any event. There is no other code firing those events.

This code is calling for a "callback" array element that is not set on the scheduler array.

After checking wp-cron.php, and adapting the code from that to wp_cron(), now everything works as it should.

Changed function looks like:

/**
 * Run scheduled callbacks or spawn cron for all scheduled events. Adapted from wp-cron.php
 *
 * @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;

    $local_time = time();
    $keys = array_keys($crons);

    if (isset($keys[0]) && $keys[0] > $local_time)
        return;

    foreach ($crons as $timestamp => $cronhooks) {
        if ($timestamp > $local_time)
            break;

        foreach ( (array)$cronhooks as $hook => $keys) {

            foreach ($keys as $k => $v) {

                $schedule = $v['schedule'];

                if ($schedule != false) {
                    $new_args = array($timestamp, $schedule, $hook, $v['args']);
                    call_user_func_array('wp_reschedule_event', $new_args);
                }

                wp_unschedule_event($timestamp, $hook, $v['args']);

                do_action_ref_array($hook, $v['args']);
            }
        }
    }
}

Cheers,

Attachments (1)

18100.patch (1.3 KB) - added by SergeyBiryukov 21 months ago.

Download all attachments as: .zip

Change History (5)

comment:1 kawauso2 years ago

  • Description modified (diff)
  • Keywords cron reschedule removed

comment:2 kawauso2 years ago

  • Keywords needs-refresh added

Please attach a patch for the modified function.

SergeyBiryukov21 months ago

comment:3 SergeyBiryukov21 months ago

  • Keywords has-patch added; needs-refresh removed

18100.patch reflects the changes. Didn't check the logic yet.

comment:4 ryan21 months ago

  • Milestone Awaiting Review deleted
  • Resolution set to invalid
  • Status changed from new to closed

wp_cron() is not supposed to fire events. It determines enough to know whether to call spawn_cron() which does an async, non-blocking request to wp-cron.php which fires the cron events. That patch will block page loads while processing cron events, which is not desired.

Note: See TracTickets for help on using tickets.