WordPress.org

Make WordPress Core

Changeset 4189


Ignore:
Timestamp:
09/13/2006 11:54:15 PM (15 years ago)
Author:
ryan
Message:

cron and future post publishing fixes. fixes #3058

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-cron.php

    r4077 r4189  
    77    exit;
    88
    9 $crons = get_option('cron');
     9$crons = _get_cron_array();
    1010$keys = array_keys($crons);
    1111if (!is_array($crons) || $keys[0] > time())
     
    1313foreach ($crons as $timestamp => $cronhooks) {
    1414    if ($timestamp > time()) break;
    15     foreach($cronhooks as $hook => $args) {
    16         do_action($hook, $args['args']);
    17         $schedule = $args['schedule'];
    18         if($schedule != false) {
    19             $args = array_merge( array($timestamp, $schedule, $hook), $args['args']);
    20             call_user_func_array('wp_reschedule_event', $args);
     15    foreach ($cronhooks as $hook => $keys) {
     16        foreach ($keys as $key => $args) {
     17            do_action_ref_array($hook, $args['args']);
     18            $schedule = $args['schedule'];
     19            if ($schedule != false) {
     20                $args = array_merge( array($timestamp, $schedule, $hook), $args['args']);
     21                call_user_func_array('wp_reschedule_event', $args);
     22            }
     23            wp_unschedule_event($timestamp, $hook);
    2124        }
    22         wp_unschedule_event($timestamp, $hook);
     25        wp_unschedule_event($timestamp, $hook, $args);
    2326    }
    2427}
  • trunk/wp-includes/cron.php

    r4144 r4189  
    33function wp_schedule_single_event( $timestamp, $hook ) {
    44    $args = array_slice( func_get_args(), 2 );
    5     $crons = get_option( 'cron' );
    6     $crons[$timestamp][$hook] = array( 'schedule' => false, 'args' => $args );
     5    $crons = _get_cron_array();
     6    $key = md5(serialize($args));
     7    $crons[$timestamp][$hook][$key] = array( 'schedule' => false, 'args' => $args );
    78    ksort( $crons );
    8     update_option( 'cron', $crons );
     9    _set_cron_array( $crons );
    910}
    1011
    1112function wp_schedule_event( $timestamp, $recurrence, $hook ) {
    1213    $args = array_slice( func_get_args(), 3 );
    13     $crons = get_option( 'cron' );
     14    $crons = _get_cron_array();
    1415    $schedules = wp_get_schedules();
     16    $key = md5(serialize($args));
    1517    if ( !isset( $schedules[$recurrence] ) )
    1618        return false;
    17     $crons[$timestamp][$hook] = array( 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
     19    $crons[$timestamp][$hook][$key] = array( 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
    1820    ksort( $crons );
    19     update_option( 'cron', $crons );
     21    _set_cron_array( $crons );
    2022}
    2123
    2224function wp_reschedule_event( $timestamp, $recurrence, $hook ) {
    2325    $args = array_slice( func_get_args(), 3 );
    24     $crons = get_option( 'cron' );
     26    $crons = _get_cron_array();
    2527    $schedules = wp_get_schedules();
     28    $key = md5(serialize($args));
    2629    $interval = 0;
    2730
     
    3134    // Now we try to get it from the saved interval in case the schedule disappears
    3235    if ( 0 == $interval )
    33         $interval = $crons[$timestamp][$hook]['interval'];
     36        $interval = $crons[$timestamp][$hook][$key]['interval'];
    3437    // Now we assume something is wrong and fail to schedule
    3538    if ( 0 == $interval )
     
    3942        $timestamp += $interval;
    4043
    41     wp_schedule_event( $timestamp, $recurrence, $hook );
     44    wp_schedule_event( $timestamp, $recurrence, $hook, $args );
    4245}
    4346
    44 function wp_unschedule_event( $timestamp, $hook ) {
    45     $crons = get_option( 'cron' );
    46     unset( $crons[$timestamp][$hook] );
     47function wp_unschedule_event( $timestamp, $hook, $args = array() ) {
     48    $crons = _get_cron_array();
     49    $key = md5(serialize($args));
     50    unset( $crons[$timestamp][$hook][$key] );
     51    if ( empty($crons[$timestamp][$hook]) )
     52        unset( $crons[$timestamp][$hook] );
    4753    if ( empty($crons[$timestamp]) )
    4854        unset( $crons[$timestamp] );
    49     update_option( 'cron', $crons );
     55    _set_cron_array( $crons );
    5056}
    5157
     
    5460   
    5561    while ( $timestamp = wp_next_scheduled( $hook, $args ) )
    56         wp_unschedule_event( $timestamp, $hook );
     62        wp_unschedule_event( $timestamp, $hook, $args );
    5763}
    5864
    59 function wp_next_scheduled( $hook, $args = '' ) {
    60     $crons = get_option( 'cron' );
     65function wp_next_scheduled( $hook, $args = array() ) {
     66    $crons = _get_cron_array();
     67    $key = md5(serialize($args));
    6168    if ( empty($crons) )
    6269        return false;
    63     foreach ( $crons as $timestamp => $cron )
    64         if ( isset( $cron[$hook] ) ) {
    65             if ( empty($args) )
    66                 return $timestamp;
    67             if ( $args == $cron[$hook]['args'] )
    68                 return $timestamp;
    69         }
     70    foreach ( $crons as $timestamp => $cron ) {
     71        if ( isset( $cron[$hook][$key] ) )
     72            return $timestamp;
     73    }
    7074    return false;
    7175}
    7276
    7377function spawn_cron() {
    74     $crons = get_option( 'cron' );
     78    $crons = _get_cron_array();
    7579   
    7680    if ( !is_array($crons) )
     
    9397
    9498function wp_cron() {
    95     $crons = get_option( 'cron' );
     99    $crons = _get_cron_array();
    96100   
    97101    if ( !is_array($crons) )
     
    122126}
    123127
     128//
     129// Private functions
     130//
     131
     132function _get_cron_array()  {
     133    $cron = get_option('cron');
     134    if ( ! is_array($cron) )
     135        return false;
     136
     137    if ( !isset($cron['version']) )
     138        $cron = _upgrade_cron_array($cron);
     139
     140    unset($cron['version']);
     141
     142    return $cron;
     143}
     144
     145function _set_cron_array($cron) {
     146    $cron['version'] = 2;
     147    update_option( 'cron', $cron );
     148}
     149
     150function _upgrade_cron_array($cron) {
     151    if ( isset($cron['version']) && 2 == $cron['version'])
     152        return $cron;
     153
     154    $new_cron = array();
     155
     156    foreach ($cron as $timestamp => $hooks) {
     157        foreach ( $hooks as $hook => $args ) {
     158            $key = md5(serialize($args['args']));
     159            $new_cron[$timestamp][$hook][$key] = $args;
     160        }
     161    }
     162
     163    $new_cron['version'] = 2;
     164    update_option( 'cron', $new_cron );
     165    return $new_cron;
     166}
     167
    124168?>
  • trunk/wp-includes/post.php

    r4180 r4189  
    699699    // Schedule publication.
    700700    if ( 'future' == $post_status )
    701         wp_schedule_single_event(mysql2date('U', $post_date), 'publish_future_post', $post_ID);
     701        wp_schedule_single_event(strtotime($post->post_date_gmt. ' GMT'), 'publish_future_post', $post_ID);
    702702       
    703703    do_action('save_post', $post_ID);
Note: See TracChangeset for help on using the changeset viewer.