2006-03-07 16:43:59 -05:00
< ? php
2008-09-04 15:12:40 -04:00
/**
* WordPress CRON API
*
* @ package WordPress
*/
2006-04-06 01:25:50 -04:00
2008-09-04 15:12:40 -04:00
/**
* Schedules a hook to run only once .
*
2009-12-08 14:59:34 -05:00
* Schedules a hook which will be executed once by the WordPress actions core at
2008-09-04 15:12:40 -04:00
* a time which you specify . The action will fire off when someone visits your
* WordPress site , if the schedule time has passed .
*
* @ since 2.1 . 0
* @ link http :// codex . wordpress . org / Function_Reference / wp_schedule_single_event
*
* @ param int $timestamp Timestamp for when to run the event .
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook to execute when cron is run .
* @ param array $args Optional . Arguments to pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
*/
2006-10-08 13:50:21 -04:00
function wp_schedule_single_event ( $timestamp , $hook , $args = array ()) {
2008-10-15 02:00:42 -04:00
// don't schedule a duplicate if there's already an identical event due in the next 10 minutes
$next = wp_next_scheduled ( $hook , $args );
if ( $next && $next <= $timestamp + 600 )
return ;
2008-10-29 16:26:20 -04:00
2006-09-13 19:54:15 -04:00
$crons = _get_cron_array ();
$key = md5 ( serialize ( $args ));
$crons [ $timestamp ][ $hook ][ $key ] = array ( 'schedule' => false , 'args' => $args );
2006-10-03 23:49:56 -04:00
uksort ( $crons , " strnatcasecmp " );
2006-09-13 19:54:15 -04:00
_set_cron_array ( $crons );
2006-03-07 16:43:59 -05:00
}
2006-04-06 01:25:50 -04:00
2008-09-04 15:12:40 -04:00
/**
* Schedule a periodic event .
*
* Schedules a hook which will be executed by the WordPress actions core on a
* specific interval , specified by you . The action will trigger when someone
* visits your WordPress site , if the scheduled time has passed .
*
2009-04-08 16:16:59 -04:00
* Valid values for the recurrence are hourly , daily and twicedaily . These can
* be extended using the cron_schedules filter in wp_get_schedules () .
*
2008-09-04 15:12:40 -04:00
* @ since 2.1 . 0
*
* @ param int $timestamp Timestamp for when to run the event .
* @ param string $recurrence How often the event should recur .
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook to execute when cron is run .
* @ param array $args Optional . Arguments to pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
* @ return bool | null False on failure , null when complete with scheduling event .
*/
2006-10-08 13:50:21 -04:00
function wp_schedule_event ( $timestamp , $recurrence , $hook , $args = array ()) {
2006-09-13 19:54:15 -04:00
$crons = _get_cron_array ();
2006-03-07 16:43:59 -05:00
$schedules = wp_get_schedules ();
2006-09-13 19:54:15 -04:00
$key = md5 ( serialize ( $args ));
2006-04-06 01:25:50 -04:00
if ( ! isset ( $schedules [ $recurrence ] ) )
2006-03-07 16:43:59 -05:00
return false ;
2006-09-13 19:54:15 -04:00
$crons [ $timestamp ][ $hook ][ $key ] = array ( 'schedule' => $recurrence , 'args' => $args , 'interval' => $schedules [ $recurrence ][ 'interval' ] );
2006-10-03 23:49:56 -04:00
uksort ( $crons , " strnatcasecmp " );
2006-09-13 19:54:15 -04:00
_set_cron_array ( $crons );
2006-03-07 16:43:59 -05:00
}
2008-09-04 15:12:40 -04:00
/**
* Reschedule a recurring event .
*
* @ since 2.1 . 0
*
* @ param int $timestamp Timestamp for when to run the event .
* @ param string $recurrence How often the event should recur .
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook to execute when cron is run .
* @ param array $args Optional . Arguments to pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
* @ return bool | null False on failure . Null when event is rescheduled .
*/
2006-10-08 13:50:21 -04:00
function wp_reschedule_event ( $timestamp , $recurrence , $hook , $args = array ()) {
2006-09-13 19:54:15 -04:00
$crons = _get_cron_array ();
2006-03-07 16:43:59 -05:00
$schedules = wp_get_schedules ();
2006-09-13 19:54:15 -04:00
$key = md5 ( serialize ( $args ));
2006-03-07 16:43:59 -05:00
$interval = 0 ;
2006-04-06 01:25:50 -04:00
2006-03-07 16:43:59 -05:00
// First we try to get it from the schedule
2006-04-06 01:25:50 -04:00
if ( 0 == $interval )
2006-03-07 16:43:59 -05:00
$interval = $schedules [ $recurrence ][ 'interval' ];
// Now we try to get it from the saved interval in case the schedule disappears
2006-04-06 01:25:50 -04:00
if ( 0 == $interval )
2006-09-13 19:54:15 -04:00
$interval = $crons [ $timestamp ][ $hook ][ $key ][ 'interval' ];
2006-03-07 16:43:59 -05:00
// Now we assume something is wrong and fail to schedule
2006-04-06 01:25:50 -04:00
if ( 0 == $interval )
2006-03-07 16:43:59 -05:00
return false ;
2009-04-16 20:23:48 -04:00
$now = time ();
if ( $timestamp >= $now )
$timestamp = $now + $interval ;
else
$timestamp = $now + ( $interval - (( $now - $timestamp ) % $interval ));
2006-04-06 01:25:50 -04:00
2006-09-13 19:54:15 -04:00
wp_schedule_event ( $timestamp , $recurrence , $hook , $args );
2006-03-07 16:43:59 -05:00
}
2008-09-04 15:12:40 -04:00
/**
* Unschedule a previously scheduled cron job .
*
* The $timestamp and $hook parameters are required , so that the event can be
* identified .
*
* @ since 2.1 . 0
*
* @ param int $timestamp Timestamp for when to run the event .
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook , the execution of which will be unscheduled .
* @ param array $args Arguments to pass to the hook ' s callback function .
* Although not passed to a callback function , these arguments are used
* to uniquely identify the scheduled event , so they should be the same
* as those used when originally scheduling the event .
2008-09-04 15:12:40 -04:00
*/
2006-09-13 19:54:15 -04:00
function wp_unschedule_event ( $timestamp , $hook , $args = array () ) {
$crons = _get_cron_array ();
$key = md5 ( serialize ( $args ));
unset ( $crons [ $timestamp ][ $hook ][ $key ] );
if ( empty ( $crons [ $timestamp ][ $hook ]) )
unset ( $crons [ $timestamp ][ $hook ] );
2006-03-07 16:43:59 -05:00
if ( empty ( $crons [ $timestamp ]) )
2006-04-06 01:25:50 -04:00
unset ( $crons [ $timestamp ] );
2006-09-13 19:54:15 -04:00
_set_cron_array ( $crons );
2006-03-07 16:43:59 -05:00
}
2008-09-04 15:12:40 -04:00
/**
* Unschedule all cron jobs attached to a specific hook .
*
* @ since 2.1 . 0
*
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook , the execution of which will be unscheduled .
2009-12-19 06:47:16 -05:00
* @ param array $args Optional . Arguments that were to be pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
*/
2009-12-19 06:47:16 -05:00
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
2009-12-24 06:12:04 -05:00
if ( ! is_array ( $args ) ) {
_deprecated_argument ( __FUNCTION__ , 'args' , '3.0.0' , __ ( 'This argument has changed to an array so as to match with the behaviour of all the other cron functions.' ) );
2009-12-19 06:47:16 -05:00
$args = array_slice ( func_get_args (), 1 );
2009-12-24 06:12:04 -05:00
}
2007-02-27 10:24:54 -05:00
2006-08-06 23:50:55 -04:00
while ( $timestamp = wp_next_scheduled ( $hook , $args ) )
2006-09-13 19:54:15 -04:00
wp_unschedule_event ( $timestamp , $hook , $args );
2006-03-07 16:43:59 -05:00
}
2008-09-04 15:12:40 -04:00
/**
* Retrieve the next timestamp for a cron event .
*
* @ since 2.1 . 0
*
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook to execute when cron is run .
* @ param array $args Optional . Arguments to pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
* @ return bool | int The UNIX timestamp of the next time the scheduled event will occur .
*/
2006-09-13 19:54:15 -04:00
function wp_next_scheduled ( $hook , $args = array () ) {
$crons = _get_cron_array ();
$key = md5 ( serialize ( $args ));
2006-03-07 16:43:59 -05:00
if ( empty ( $crons ) )
return false ;
2006-09-13 19:54:15 -04:00
foreach ( $crons as $timestamp => $cron ) {
if ( isset ( $cron [ $hook ][ $key ] ) )
return $timestamp ;
}
2006-03-07 16:43:59 -05:00
return false ;
}
2008-08-01 01:00:07 -04:00
/**
* Send request to run cron through HTTP request that doesn ' t halt page loading .
*
* @ since 2.1 . 0
*
2008-09-04 15:12:40 -04:00
* @ return null Cron could not be spawned , because it is not needed to run .
2008-08-01 01:00:07 -04:00
*/
2009-02-07 08:32:34 -05:00
function spawn_cron ( $local_time = 0 ) {
if ( ! $local_time )
$local_time = time ();
if ( defined ( 'DOING_CRON' ) || isset ( $_GET [ 'doing_wp_cron' ]) )
return ;
2008-09-18 03:09:38 -04:00
/*
* 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 ;
2007-02-27 10:24:54 -05:00
2009-02-07 08:32:34 -05:00
/*
* 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' );
if ( $flag > $local_time + 10 * 60 )
$flag = 0 ;
// don't run if another process is currently running it or more than once every 60 sec.
if ( $flag + 60 > $local_time )
return ;
2008-09-18 03:09:38 -04:00
//sanity check
$crons = _get_cron_array ();
2006-06-27 02:59:35 -04:00
if ( ! is_array ( $crons ) )
2006-06-27 02:04:27 -04:00
return ;
2007-02-27 10:24:54 -05:00
2006-06-27 02:04:27 -04:00
$keys = array_keys ( $crons );
2009-02-07 08:32:34 -05:00
if ( isset ( $keys [ 0 ]) && $keys [ 0 ] > $local_time )
2006-04-06 01:25:50 -04:00
return ;
2009-02-07 08:32:34 -05:00
if ( defined ( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {
if ( ! empty ( $_POST ) || defined ( 'DOING_AJAX' ) )
return ;
2008-09-18 03:09:38 -04:00
2009-02-07 08:32:34 -05:00
set_transient ( 'doing_cron' , $local_time );
ob_start ();
wp_redirect ( add_query_arg ( 'doing_wp_cron' , '' , stripslashes ( $_SERVER [ 'REQUEST_URI' ])) );
echo ' ' ;
2008-09-18 03:09:38 -04:00
2009-02-07 08:32:34 -05:00
// flush any buffers and send the headers
while ( @ ob_end_flush () );
flush ();
@ include_once ( ABSPATH . 'wp-cron.php' );
2008-09-18 03:09:38 -04:00
return ;
2009-02-07 08:32:34 -05:00
}
2008-09-18 03:09:38 -04:00
2009-02-07 08:32:34 -05:00
set_transient ( 'doing_cron' , $local_time );
2007-06-13 22:25:30 -04:00
2009-02-07 08:32:34 -05:00
$cron_url = get_option ( 'siteurl' ) . '/wp-cron.php?doing_wp_cron' ;
2009-02-08 10:26:16 -05:00
wp_remote_post ( $cron_url , array ( 'timeout' => 0.01 , 'blocking' => false , 'sslverify' => apply_filters ( 'https_local_ssl_verify' , true )) );
2006-03-07 16:43:59 -05:00
}
2008-09-04 15:12:40 -04:00
/**
* Run scheduled callbacks or spawn cron for all scheduled events .
*
* @ since 2.1 . 0
*
* @ return null When doesn ' t need to run Cron .
*/
2006-03-07 16:43:59 -05:00
function wp_cron () {
2008-09-18 03:09:38 -04:00
2007-01-30 08:06:56 -05:00
// Prevent infinite loops caused by lack of wp-cron.php
2009-02-07 08:32:34 -05:00
if ( strpos ( $_SERVER [ 'REQUEST_URI' ], '/wp-cron.php' ) !== false || ( defined ( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) )
2007-01-30 08:06:56 -05:00
return ;
2009-02-07 08:32:34 -05:00
if ( false === $crons = _get_cron_array () )
2006-06-10 16:43:49 -04:00
return ;
2009-02-07 08:32:34 -05:00
$local_time = time ();
2006-06-10 16:43:49 -04:00
$keys = array_keys ( $crons );
2009-02-07 08:32:34 -05:00
if ( isset ( $keys [ 0 ]) && $keys [ 0 ] > $local_time )
2006-03-07 16:43:59 -05:00
return ;
$schedules = wp_get_schedules ();
2006-04-06 01:25:50 -04:00
foreach ( $crons as $timestamp => $cronhooks ) {
2008-09-18 03:09:38 -04:00
if ( $timestamp > $local_time ) break ;
2008-08-06 16:31:54 -04:00
foreach ( ( array ) $cronhooks as $hook => $args ) {
2006-04-06 01:25:50 -04:00
if ( isset ( $schedules [ $hook ][ 'callback' ]) && ! call_user_func ( $schedules [ $hook ][ 'callback' ] ) )
2006-03-07 16:43:59 -05:00
continue ;
2008-09-18 03:09:38 -04:00
spawn_cron ( $local_time );
2006-03-07 16:43:59 -05:00
break 2 ;
}
}
}
2008-09-04 15:12:40 -04:00
/**
* Retrieve supported and filtered Cron recurrences .
*
* The supported recurrences are 'hourly' and 'daily' . A plugin may add more by
* hooking into the 'cron_schedules' filter . The filter accepts an array of
* arrays . The outer array has a key that is the name of the schedule or for
* example 'weekly' . The value is an array with two keys , one is 'interval' and
* the other is 'display' .
*
* The 'interval' is a number in seconds of when the cron job should run . So for
* 'hourly' , the time is 3600 or 60 * 60. For weekly , the value would be
* 60 * 60 * 24 * 7 or 604800. The value of 'interval' would then be 604800.
*
* The 'display' is the description . For the 'weekly' key , the 'display' would
* be < code > __ ( 'Once Weekly' ) </ code >.
*
* For your plugin , you will be passed an array . you can easily add your
* schedule by doing the following .
* < code >
* // filter parameter variable name is 'array'
* $array [ 'weekly' ] = array (
* 'interval' => 604800 ,
* 'display' => __ ( 'Once Weekly' )
* );
* </ code >
*
* @ since 2.1 . 0
*
* @ return array
*/
2006-03-07 16:43:59 -05:00
function wp_get_schedules () {
$schedules = array (
2006-04-06 01:25:50 -04:00
'hourly' => array ( 'interval' => 3600 , 'display' => __ ( 'Once Hourly' ) ),
2008-08-01 00:26:32 -04:00
'twicedaily' => array ( 'interval' => 43200 , 'display' => __ ( 'Twice Daily' ) ),
2006-04-06 01:25:50 -04:00
'daily' => array ( 'interval' => 86400 , 'display' => __ ( 'Once Daily' ) ),
2006-03-07 16:43:59 -05:00
);
2006-04-06 01:25:50 -04:00
return array_merge ( apply_filters ( 'cron_schedules' , array () ), $schedules );
2006-03-07 16:43:59 -05:00
}
2006-04-06 01:25:50 -04:00
2008-09-04 15:12:40 -04:00
/**
* Retrieve Cron schedule for hook with arguments .
*
* @ since 2.1 . 0
*
2008-12-19 15:47:20 -05:00
* @ param string $hook Action hook to execute when cron is run .
* @ param array $args Optional . Arguments to pass to the hook ' s callback function .
2008-09-04 15:12:40 -04:00
* @ return string | bool False , if no schedule . Schedule on success .
*/
2006-09-25 21:14:49 -04:00
function wp_get_schedule ( $hook , $args = array ()) {
$crons = _get_cron_array ();
$key = md5 ( serialize ( $args ));
if ( empty ( $crons ) )
return false ;
foreach ( $crons as $timestamp => $cron ) {
if ( isset ( $cron [ $hook ][ $key ] ) )
return $cron [ $hook ][ $key ][ 'schedule' ];
}
return false ;
}
2006-09-13 19:54:15 -04:00
//
// Private functions
//
2008-09-04 15:12:40 -04:00
/**
* Retrieve cron info array option .
*
* @ since 2.1 . 0
* @ access private
*
* @ return array CRON info array .
*/
2006-09-13 19:54:15 -04:00
function _get_cron_array () {
$cron = get_option ( 'cron' );
if ( ! is_array ( $cron ) )
return false ;
if ( ! isset ( $cron [ 'version' ]) )
$cron = _upgrade_cron_array ( $cron );
unset ( $cron [ 'version' ]);
return $cron ;
}
2008-09-04 15:12:40 -04:00
/**
* Updates the CRON option with the new CRON array .
*
* @ since 2.1 . 0
* @ access private
*
* @ param array $cron Cron info array from { @ link _get_cron_array ()} .
*/
2006-09-13 19:54:15 -04:00
function _set_cron_array ( $cron ) {
$cron [ 'version' ] = 2 ;
update_option ( 'cron' , $cron );
}
2008-09-04 15:12:40 -04:00
/**
* Upgrade a Cron info array .
*
* This function upgrades the Cron info array to version 2.
*
* @ since 2.1 . 0
* @ access private
*
* @ param array $cron Cron info array from { @ link _get_cron_array ()} .
* @ return array An upgraded Cron info array .
*/
2006-09-13 19:54:15 -04:00
function _upgrade_cron_array ( $cron ) {
if ( isset ( $cron [ 'version' ]) && 2 == $cron [ 'version' ])
return $cron ;
$new_cron = array ();
2008-08-06 16:31:54 -04:00
foreach ( ( array ) $cron as $timestamp => $hooks ) {
foreach ( ( array ) $hooks as $hook => $args ) {
2006-09-13 19:54:15 -04:00
$key = md5 ( serialize ( $args [ 'args' ]));
$new_cron [ $timestamp ][ $hook ][ $key ] = $args ;
}
}
$new_cron [ 'version' ] = 2 ;
update_option ( 'cron' , $new_cron );
return $new_cron ;
}
2008-09-18 03:09:38 -04:00
// stub for checking server timer accuracy, using outside standard time sources
function check_server_timer ( $local_time ) {
return true ;
}