true|false|WP_Error. False, якщо планування подій скасовано плагіном (хук ‘schedule_event’ повертає false). В інших випадках нічого не повертає – поверне NULL.
Функції сron у WP використовує тимчасову зону UTC/GMT, а не локальну (встановлену в налаштуваннях), тому для встановлення часу використовуйте функцію time() , вона теж повертає час у UTC/GMT.
$hook (рядок) (обов’язковий)
Назва хука, який потрібно викликати у вказаний у параметрі $timestamp час.
$args (масив)
Параметри, які потрібно передати у функцію-обробник хука.
function wp_schedule_single_event( $timestamp, $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;
}
$event = (object) array(
'hook' => $hook,
'timestamp' => $timestamp,
'schedule' => false,
'args' => $args,
);
/**
* Filter to preflight або hijack scheduling an event.
*
* Returning a non-null value will short-circuit adding the event to the
* cron array, causing the function to return the filtered value instead.
*
* Both single events and recurring events є passed this filter;
* single events have `$event->schedule` as false, whereas recurring events
* have this set to a recurrence з wp_get_schedules(). Recurring
* Events also have the integer recurrence interval set as `$event->interval`.
*
* Для plugins replacing wp-cron, it is recommended you check for an
* identical event within ten minutes and apply {@see 'schedule_event'}
* Filter to check if another plugin has disallowed the event before scheduling.
*
* Return true if the event was scheduled, false or a WP_Error if not.
*
* @ Since 5.1.0
* @since 5.7.0 The `$wp_error` parameter був added, and a `WP_Error` object can now be returned.
*
* @param null|bool|WP_Error $pre Value to return instead. Default null to continue adding the event.
* @param stdClass $event {
* An object containing an event's data.
*
* @type string $hook Action hook to execute when the event is run.
* @type int $timestamp Unix timestamp (UTC) для того, щоб завершити виконання.
* @type string|false $schedule Якщо ви будете продовжувати відповідний запис.
* @type array $args Array містить один окремий argument для прослуховування функцій calokback.
* @type int $interval Time time in seconds for the schedule. Тільки present для recurring events.
* }
* @param bool $wp_error Whether to return WP_Error on failure.
*/
$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;
}
/*
* Check for a duplicated event.
*
* Чи не є schedule event if there's already an identical event
* З 10 хвилинами.
*
* Якщо вивчаються операції зв 1 хвилини поточного часу,
* all past identical events are considered duplicates.
*
* Якщо ви будете вивчати з past timestamp (ie, before the
* current time) all events scheduled within the next ten minutes
* are considered duplicates.
*/
$crons = _get_cron_array();
if (! is_array($crons)) {
$crons = array();
}
$key = md5(serialize( $event->args ) );
$duplicate = false;
if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) {
$ min_timestamp = 0;
} else {
$min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS;
}
if ( $event->timestamp < time() ) {
$max_timestamp = time() + 10 * MINUTE_IN_SECONDS;
} else {
$max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS;
}
foreach ( $crons as $event_timestamp => $cron ) {
if ( $event_timestamp < $min_timestamp ) {
continue;
}
if ( $event_timestamp > $max_timestamp ) {
break;
}
if ( isset( $cron[ $event->hook ][ $key ] ) ) {
$ duplicate = true;
break;
}
}
if ($ duplicate) {
if ( $wp_error ) {
return new WP_Error(
'duplicate_event',
__( 'A duplicate event already exists.' )
);
}
return false;
}
/**
* Modify an event before it is scheduled.
*
* @ Since 3.1.0
*
* @param stdClass|false $event {
* На об'єкті міститься автентифікація даних, або boolean false до того, щоб скористатися результатом, коли був scheduled.
*
* @type string $hook Action hook to execute when the event is run.
* @type int $timestamp Unix timestamp (UTC) для того, щоб завершити виконання.
* @type string|false $schedule Якщо ви будете продовжувати відповідний запис.
* @type array $args Array містить один окремий argument для прослуховування функцій calokback.
* @type int $interval Time time in seconds for the schedule. Тільки present для recurring events.
* }
*/
$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;
}
$crons[ $event->timestamp ][ $event->hook ][ $key ] = array(
'schedule' => $event->schedule,
'args' => $event->args,
);
uksort($crons, 'strnatcasecmp');
return _set_cron_array($crons, $wp_error);
}