X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/699231ae09f7057a4d0000cdf32e50a3df6a04ca..5aa86a9053fb0fa15846bb60aac2fb8fdfff524a:/wp-includes/cron.php diff --git a/wp-includes/cron.php b/wp-includes/cron.php index 921f8c86..27f29711 100644 --- a/wp-includes/cron.php +++ b/wp-includes/cron.php @@ -26,8 +26,16 @@ function wp_schedule_single_event( $timestamp, $hook, $args = array()) { return; $crons = _get_cron_array(); - $key = md5(serialize($args)); - $crons[$timestamp][$hook][$key] = array( 'schedule' => false, 'args' => $args ); + $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args ); + $event = apply_filters('schedule_event', $event); + + // A plugin disallowed this event + if ( ! $event ) + return false; + + $key = md5(serialize($event->args)); + + $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args ); uksort( $crons, "strnatcasecmp" ); _set_cron_array( $crons ); } @@ -42,6 +50,8 @@ function wp_schedule_single_event( $timestamp, $hook, $args = array()) { * Valid values for the recurrence are hourly, daily and twicedaily. These can * be extended using the cron_schedules filter in wp_get_schedules(). * + * Use wp_next_scheduled() to prevent duplicates + * * @since 2.1.0 * * @param int $timestamp Timestamp for when to run the event. @@ -53,10 +63,20 @@ function wp_schedule_single_event( $timestamp, $hook, $args = array()) { function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) { $crons = _get_cron_array(); $schedules = wp_get_schedules(); - $key = md5(serialize($args)); + if ( !isset( $schedules[$recurrence] ) ) return false; - $crons[$timestamp][$hook][$key] = array( 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] ); + + $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] ); + $event = apply_filters('schedule_event', $event); + + // A plugin disallowed this event + if ( ! $event ) + return false; + + $key = md5(serialize($event->args)); + + $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval ); uksort( $crons, "strnatcasecmp" ); _set_cron_array( $crons ); } @@ -90,10 +110,10 @@ function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array()) { $now = time(); - if ( $timestamp >= $now ) - $timestamp = $now + $interval; - else - $timestamp = $now + ($interval - (($now - $timestamp) % $interval)); + if ( $timestamp >= $now ) + $timestamp = $now + $interval; + else + $timestamp = $now + ($interval - (($now - $timestamp) % $interval)); wp_schedule_event( $timestamp, $recurrence, $hook, $args ); } @@ -136,7 +156,7 @@ function wp_clear_scheduled_hook( $hook, $args = array() ) { // Backward compatibility // Previously this function took the arguments as discrete vars rather than an array like the rest of the API if ( !is_array($args) ) { - _deprecated_argument( __FUNCTION__, '3.0.0', __('This argument has changed to an array to match the behavior of the other cron functions.') ); + _deprecated_argument( __FUNCTION__, '3.0', __('This argument has changed to an array to match the behavior of the other cron functions.') ); $args = array_slice( func_get_args(), 1 ); } @@ -180,25 +200,17 @@ function spawn_cron( $local_time = 0 ) { if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) ) return; - /* - * do not even start the cron if local server timer has drifted - * such as due to power failure, or misconfiguration - */ - $timer_accurate = check_server_timer( $local_time ); - if ( !$timer_accurate ) - return; - /* * multiple processes on multiple web servers can run this code concurrently * try to make this as atomic as possible by setting doing_cron switch */ - $flag = get_transient('doing_cron'); + $lock = get_transient('doing_cron'); - if ( $flag > $local_time + 10*60 ) - $flag = 0; + if ( $lock > $local_time + 10*60 ) + $lock = 0; // don't run if another process is currently running it or more than once every 60 sec. - if ( $flag + 60 > $local_time ) + if ( $lock + WP_CRON_LOCK_TIMEOUT > $local_time ) return; //sanity check @@ -214,10 +226,11 @@ function spawn_cron( $local_time = 0 ) { if ( !empty($_POST) || defined('DOING_AJAX') ) return; - set_transient( 'doing_cron', $local_time ); + $doing_wp_cron = $local_time; + set_transient( 'doing_cron', $doing_wp_cron ); ob_start(); - wp_redirect( add_query_arg('doing_wp_cron', '', stripslashes($_SERVER['REQUEST_URI'])) ); + wp_redirect( add_query_arg('doing_wp_cron', $doing_wp_cron, stripslashes($_SERVER['REQUEST_URI'])) ); echo ' '; // flush any buffers and send the headers @@ -228,9 +241,10 @@ function spawn_cron( $local_time = 0 ) { return; } - set_transient( 'doing_cron', $local_time ); + $doing_wp_cron = $local_time; + set_transient( 'doing_cron', $doing_wp_cron ); - $cron_url = get_option( 'siteurl' ) . '/wp-cron.php?doing_wp_cron'; + $cron_url = get_option( 'siteurl' ) . '/wp-cron.php?doing_wp_cron=' . $doing_wp_cron; wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', true)) ); } @@ -393,8 +407,3 @@ function _upgrade_cron_array($cron) { update_option( 'cron', $new_cron ); return $new_cron; } - -// stub for checking server timer accuracy, using outside standard time sources -function check_server_timer( $local_time ) { - return true; -}