Opened 2 years ago
Closed 21 months ago
#18100 closed defect (bug) (invalid)
Cron Loop does not work
| Reported by: |
|
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)
Change History (5)
SergeyBiryukov
— 21 months ago
comment:3
SergeyBiryukov
— 21 months ago
- Keywords has-patch added; needs-refresh removed
18100.patch reflects the changes. Didn't check the logic yet.
comment:4
ryan
— 21 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.
Please attach a patch for the modified function.