Make WordPress Core

Changeset 4189


Ignore:
Timestamp:
09/13/2006 11:54:15 PM (20 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.