wp_schedule_event( int $timestamp, string $recurrence, string $hook, array $args = array(), bool $wp_error = false ): bool|WP_Error
Schedules a recurring event.
Contents
Description
Schedules a hook which will be triggered by WordPress at the specified interval.
The action will trigger when someone visits your WordPress site if the scheduled time has passed.
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 duplicate events.
Use wp_schedule_single_event() to schedule a non-recurring event.
Parameters
-
$timestamp
int Required -
Unix timestamp (UTC) for when to next run the event.
-
$recurrence
string Required -
How often the event should subsequently recur.
See wp_get_schedules() for accepted values. -
$hook
string Required -
Action hook to execute when the event is run.
-
$args
array Optional -
Array containing arguments to pass to the hook's callback function. Each value in the array is passed to the callback as an individual parameter.
The array keys are ignored.Default:
array()
-
$wp_error
bool Optional -
Whether to return a WP_Error on failure.
Default:
false
Return
bool|WP_Error True if event successfully scheduled. False or WP_Error on failure.
Source
File: wp-includes/cron.php
.
View all references
function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) {
// Make sure timestamp is a positive integer.
if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
if ( $wp_error ) {
return new WP_Error(
'invalid_timestamp',
__( 'Event timestamp must be a valid Unix timestamp.' )
);
}
return false;
}
$schedules = wp_get_schedules();
if ( ! isset( $schedules[ $recurrence ] ) ) {
if ( $wp_error ) {
return new WP_Error(
'invalid_schedule',
__( 'Event schedule does not exist.' )
);
}
return false;
}
$event = (object) array(
'hook' => $hook,
'timestamp' => $timestamp,
'schedule' => $recurrence,
'args' => $args,
'interval' => $schedules[ $recurrence ]['interval'],
);
/** This filter is documented in wp-includes/cron.php */
$pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error );
if ( null !== $pre ) {
if ( $wp_error && false === $pre ) {
return new WP_Error(
'pre_schedule_event_false',
__( 'A plugin prevented the event from being scheduled.' )
);
}
if ( ! $wp_error && is_wp_error( $pre ) ) {
return false;
}
return $pre;
}
/** This filter is documented in wp-includes/cron.php */
$event = apply_filters( 'schedule_event', $event );
// A plugin disallowed this event.
if ( ! $event ) {
if ( $wp_error ) {
return new WP_Error(
'schedule_event_false',
__( 'A plugin disallowed this event.' )
);
}
return false;
}
$key = md5( serialize( $event->args ) );
$crons = _get_cron_array();
$crons[ $event->timestamp ][ $event->hook ][ $key ] = array(
'schedule' => $event->schedule,
'args' => $event->args,
'interval' => $event->interval,
);
uksort( $crons, 'strnatcasecmp' );
return _set_cron_array( $crons, $wp_error );
}
Hooks
-
apply_filters( 'pre_schedule_event',
null|bool|WP_Error $result ,object $event ,bool $wp_error ) -
Filter to override scheduling an event.
-
apply_filters( 'schedule_event',
object|false $event ) -
Modify an event before it is scheduled.
Changelog
Version | Description |
---|---|
5.7.0 | The $wp_error parameter was added. |
5.1.0 | Return value modified to boolean indicating success or failure, 'pre_schedule_event' filter added to short-circuit the function. |
2.1.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.
Schedule hourly event with multiple arguments
wp_schedule_event() pass arguments by reference, so we have to send multiple data as indexed array.
Don’t forgot to add total number of argument as $accepted_args on add_action().
Don’t forget to clean the scheduler on deactivation:
Top ↑
Feedback
In this example the event is only rescheduled when reactivating the plugin. Most likely a developer would want to perform the evening scheduling within the init hook. — By Sander van Dragt —
When clearing the scheduled hook you need to also pass the argument array the same way you did when you were creating the schedule, or else it would not clear. In your example the schedule would not be deleted on plugin deactivation because
wp_clear_scheduled_hook( 'my_hourly_event' );
is missing the arguments. Fix:wp_clear_scheduled_hook( 'my_hourly_event', array($args_1, $args_2) );
— By Uriahs Victor —Schedule an hourly event
To schedule an hourly event in a plugin, call
wp_schedule_event
on activation (otherwise you will end up with a lot of scheduled events!):Don’t forget to clean the scheduler on deactivation:
Top ↑
Feedback
In this example the event is only rescheduled when reactivating the plugin. Most likely a developer would want to perform the evening scheduling within the init hook. It’s also missing a check to see whether the event is already scheduled. — By Sander van Dragt —
It should be noted that depending on how resource-intensive your hook is, the default behavior of “Waiting until a user visits the site” may not be suitable. Of course you should try to make your code as efficient as possible – but if you have a specific case where it’s still resource intensive you do not want to keep the user sitting on a white screen while your hook does it’s work.
For specific situations you might want to consider disabling WP’s internal CRON by placing this line:
define('DISABLE_WP_CRON', 'true');
into the file:
wp-config.php
Then create a CRON job with your hosting control panel to fetch the URL:
https://example.com/wp-cron.php?doing_wp_cron
OR execute:
/usr/bin/php -q /path-to-your-wp-installation/wp-cron.php
Your specific environment may vary.
Note: If you are using custom recurrences make sure to call wp_schedule_event after you added the cron_schedules filter.
An actual working best-practice minimal example.
Per Minute.
Usage