wp_reschedule_event()WP 2.1.0

Создает новую крон задачу, которая начнет выполнятся через указанный интервал времени.

Почти всегда функция добавляет новую крон-задачу, даже если она уже существует.

Единственный вариант когда функция не добавит, а обновит данные уже существующей задачи - это когда совпадает метка времени, название хука и параметры задачи, т.е. все параметры функции: $timestamp, $hook, $args.

Это обертка для функции wp_schedule_event(), в задачу которой входит пересчитать $timestamp и создать очередную крон задачу.

Эта функция отличается от wp_schedule_event() тем что она добавляет задача которая начнет выполнение через время указанное в $recurrence, а wp_schedule_event() начнет выполнять задачу сразу же.

Эту функцию использует сам WordPress в работе крона. После того как очередная задача выполнена, она удаляется и с помощью этой функции создается такая же новая задача.

Работает на основе: wp_schedule_event()
Хуки из функции

Возвращает

true|false|WP_Error.

  • false или WP_Error - в случае ошибки, когда не удалось добавить задачу. Объект WP_Error вернется только при $wp_error = true.
  • true - если задача добавлена.

Использование

wp_reschedule_event( $timestamp, $recurrence, $hook, $args, $wp_error );
$timestamp(число) (обязательный)
Начальная метка времени, с которой хук начнет работать.
$recurrence(строка) (обязательный)

Название имеющегося интервала, указывает как часто должно повторяться событие.

Допустимые значения:

  • hourly - ежечасно;
  • twicedaily - дважды в день;
  • daily - ежедневно.

Вы можете добавить свой интервал через фильтр cron_schedules, который находится в функции wp_get_schedules().

$hook(строка) (обязательный)
Название хука, который нужно выполнять.
$args(массив)
Аргументы, которые нужно передать в выполняемый хук.
Default: array()
$wp_error(true/false) (WP 5.7)
true - вернет объект WP_Error при неудаче.
По умолчанию: false

Подробное описание параметров и примеры смотрите в описании функции wp_schedule_event()

Примеры

0

#1 Добавим крон-задачу с задержкой

Крон-задача добавленная таким образом начнет выполняться через указанный интервал времени - через час с текущего момента.

$event_hook_name = 'my_currencies_update';
$interval = 'hourly';

// убедимся что крон задачи нет
if ( ! wp_next_scheduled( $event_hook_name ) ) {
	// добавляем крон задачу
	wp_reschedule_event( time(), $interval, $event_hook_name );
}

Список изменений

С версии 2.1.0 Введена.
С версии 5.1.0 Return value modified to boolean indicating success or failure, pre_reschedule_event filter added to short-circuit the function.
С версии 5.7.0 The $wp_error parameter was added.

Код wp_reschedule_event() WP 6.4.3

function wp_reschedule_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();
	$interval  = 0;

	// First we try to get the interval from the schedule.
	if ( isset( $schedules[ $recurrence ] ) ) {
		$interval = $schedules[ $recurrence ]['interval'];
	}

	// Now we try to get it from the saved interval in case the schedule disappears.
	if ( 0 === $interval ) {
		$scheduled_event = wp_get_scheduled_event( $hook, $args, $timestamp );

		if ( $scheduled_event && isset( $scheduled_event->interval ) ) {
			$interval = $scheduled_event->interval;
		}
	}

	$event = (object) array(
		'hook'      => $hook,
		'timestamp' => $timestamp,
		'schedule'  => $recurrence,
		'args'      => $args,
		'interval'  => $interval,
	);

	/**
	 * Filter to override rescheduling of a recurring event.
	 *
	 * Returning a non-null value will short-circuit the normal rescheduling
	 * process, causing the function to return the filtered value instead.
	 *
	 * For plugins replacing wp-cron, return true if the event was successfully
	 * rescheduled, false or a WP_Error if not.
	 *
	 * @since 5.1.0
	 * @since 5.7.0 The `$wp_error` parameter was 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 object             $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) for when to next run the event.
	 *     @type string $schedule  How often the event should subsequently recur.
	 *     @type array  $args      Array containing each separate argument to pass to the hook's callback function.
	 *     @type int    $interval  The interval time in seconds for the schedule.
	 * }
	 * @param bool               $wp_error Whether to return a WP_Error on failure.
	 */
	$pre = apply_filters( 'pre_reschedule_event', null, $event, $wp_error );

	if ( null !== $pre ) {
		if ( $wp_error && false === $pre ) {
			return new WP_Error(
				'pre_reschedule_event_false',
				__( 'A plugin prevented the event from being rescheduled.' )
			);
		}

		if ( ! $wp_error && is_wp_error( $pre ) ) {
			return false;
		}

		return $pre;
	}

	// Now we assume something is wrong and fail to schedule.
	if ( 0 === $interval ) {
		if ( $wp_error ) {
			return new WP_Error(
				'invalid_schedule',
				__( 'Event schedule does not exist.' )
			);
		}

		return false;
	}

	$now = time();

	if ( $timestamp >= $now ) {
		$timestamp = $now + $interval;
	} else {
		$timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) );
	}

	return wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error );
}