wp_schedule_event() WP 2.1.0

Створює багаторазове крон-завдання. Встановлює хук, який буде викликатись кожного разу через вказаний інтервал часу.

У більшості випадків функція додає нову крон-завдання, навіть якщо вона вже існує.

Єдиний варіант коли функція не додасть, а оновить дані вже існуючого завдання – це коли збігається мітка часу, назва хука і параметри завдання, що додається, тобто. Усі параметри: $timestamp, $hook, $args.

Якщо використовується інтервал часу, важливо спочатку додати цей інтервал через хук cron_schedules і тільки потім додавати крон-завдання за допомогою wp_schedule_event().

Крон завдання запускаються при відвідуванні сторінок сайту користувачем або роботом, коли час завдання вже настав.

  • Використовуйте wp_reschedule_event() , коли потрібно додати завдання і почати виконання через вказаний інтервал, а не відразу.

  • Використовуйте wp_clear_scheduled_hook() , щоб видалити цю подію .

  • Використовуйте wp_schedule_single_event() , щоб запланувати одноразову подію .
Основа для:
wp_reschedule_event()

Хуки з функції

Повертає

true|false|WP_Error. null коли планування завершено. false у разі невдачі.

Використання

wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error );
$timestamp
(число) (обов’язковий)

Початкова позначка часу, з якою хук почне працювати. Потрібно вказувати у форматі UNIX (32165487).

WP cron використовує час UTC/GMT, а чи не локальне. Використовуйте функцію time() , яка завжди в GMT WP. current_time(‘timestamp’) – це локальний час у WP.

$recurrence
(рядок) (обов’язковий)

Назва наявного інтервалу вказує, як часто має повторюватися подія.

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

  • hourly – щогодини;
  • twicedaily – двічі на день;
  • daily – щодня.

Ви можете додати свій інтервал через фільтр wp_get_schedules() .

$hook
(рядок) (обов’язковий)
Назва завдання – WP хук, який потрібно виконувати.
$args
(масив)
Аргументи, які потрібно передати в хук, що виконується.


За замовчуванням: []
$wp_error
(true/false) (WP 5.7)
true – поверне об’єкт
WP_Error при невдачі.


Типово: false

Приклади

0

#1 Створюємо крон завдання під час активації плагіна

Заплануємо щогодинну дію для плагіна. Для цього викличемо wp_schedule_event() при активації плагіна (якщо робити не при активації, то отримаємо безліч запланованих подій!).

// Додамо крон-завдання під час активації плагіна
register_activation_hook( __FILE__, 'my_activation' );

// Видалимо крон завдання при деактивації плагіна
register_deactivation_hook( __FILE__, 'my_deactivation');

// php функція, яка буде виконуватися при настанні крон-події
add_action( 'my_hourly_event', 'do_this_hourly');

function my_activation() {

	// видалимо про всяк випадок все такі ж завдання cron, щоб
	// додати нові з "чистого листа" це може знадобитися,
	// якщо до цього підключалася така ж задача неправильно (без перевірки, що вона вже є).
	wp_clear_scheduled_hook( 'my_hourly_event' );

	// Чи перевіримо чи немає завдання з таким же хуком
	// цей пункт не потрібен, тому що ми вище видалили всі завдання...
	// if( ! wp_next_scheduled( 'my_hourly_event' ) )

	// додамо нове cron завдання
	wp_schedule_event( time(), 'hourly', 'my_hourly_event');
}

function do_this_hourly() {
	// робимо щось кожну годину
}

function my_deactivation() {
	wp_clear_scheduled_hook( 'my_hourly_event' );
}
0

#2 Створюємо крон завдання якщо її ще немає

Цей приклад не покладається на активацію плагіну (через директорію плагінів), натомість він додає подію, якщо її не існує:

// додаємо запланований хук
add_action( 'wp', 'add_my_cron_event');

// додаємо функцію крон-завдання
add_action( 'my_hourly_event', 'do_this_hourly');

function add_my_cron_event() {

	if( ! wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event');
	}
}

function do_this_hourly() {
	// робимо щось кожну годину
}
0

#3 Додавання нового інтервалу

Щоб додати новий інтервал Cron до WordPress, використовуємо фільтр cron_schedules .

Додамо інтервал «5 хвилин» (що робити кожні 5 хвилин):

// реєструємо 5-хвилинний інтервал
add_filter( 'cron_schedules', 'cron_add_five_min');

// реєструємо подію
add_action( 'wp', 'my_activation' );

// додаємо функцію до вказаного хука
add_action( 'my_five_min_event', 'do_every_five_min');

function cron_add_five_min( $schedules ) {
	$schedules['five_min'] = array(
		'interval' => 60 * 5,
		'display' => 'Раз на 5 хвилин'
	);
	return $schedules;
}

function my_activation() {
	if ( ! wp_next_scheduled( 'my_five_min_event' ) ) {
		wp_schedule_event( time(), 'five_min', 'my_five_min_event');
	}
}

function do_every_five_min() {
	// робимо щось кожні 5 хвилин
}

Константи WordPress, які можуть стати в нагоді при створенні крон інтервалу:

  • HOUR_IN_SECONDS– Година в секундах – 60 * 60 = 3600
  • DAY_IN_SECONDS– день у секундах – 60 * 60 * 24 = 86400
  • WEEK_IN_SECONDS– Тиждень в секундах – 60 * 60 * 24 * 7 = 604800
0

#4 Ще приклад створення крон завдання (робочий приклад)

Що робить приклад: отримує курс рубля по відношенню до долара та записує результат у опції. Робиться це всього 2 рази на добу, для чого власне і потрібен крон. Далі, де потрібно, дані можна дуже швидко отримати з опції, куди вони були записані.

Отримання даних валют працює на основі бібліотеки PHP Simple HTML DOM Parse

// Cron

// Реєструємо розклад під час активації плагіна
register_activation_hook( __FILE__, 'activation_geting_course_dollar' );

// Видаляємо розклад при деактивації плагіна
register_deactivation_hook( __FILE__, 'deactivation_geting_course_dollar' );

// Хук та функція, яка виконуватиметься за Кроном
add_action( 'geting_course_dollar', 'get_real_course_dollar');

// Перевірка існування розкладу під час роботи плагіна про всяк пожежний випадок
if( ! wp_next_scheduled( 'geting_course_dollar' ) ) {
	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');
}

function activation_geting_course_dollar() {
	wp_clear_scheduled_hook( 'geting_course_dollar');
	wp_schedule_event( time(), 'twicedaily', 'geting_course_dollar');
}

function deactivation_geting_course_dollar() {
	wp_clear_scheduled_hook('geting_course_dollar');
}

function get_real_course_dollar(){

	include 'inc/simple_html_dom.php';

	$html = file_get_html( 'https://news.yandex.ru/quotes/1.html');
	$value = $html->find('.quote_current_yes', 0)->find('.quote__value',0)->plaintext;
	$date = $html->find('.quote_current_yes', 0)->find('.quote__date',0)->plaintext;
	$course = array( 'dollar' => $value, 'date' => $date, 'check' => current_time('mysql',1) );

	update_option('i_price_course_dollar', $course, 'no');
}

// Виводить дані курсу
function the_course_dollar( $data = null ){
	echo get_course_dollar ($ data);
}

// Повертає дані курсу
function get_course_dollar( $data = null ){

	$course = get_option('i_price_course_dollar');

	if ( !$data || $data == 'dollar')
		return $course['dollar'];

	if ( $data == 'date')
		return $course['date'];

	if ( $data == 'check')
		return $course['check'];
}
0

#5 Оновлення ще не виконаної крон задачі

Допустимо у нас у плагіні є налаштування інтервалу якоїсь крон завдання. І нам потрібно оновлювати інтервал завдання в залежності від зазначеної настройки.

Перше, що потрібно зробити, це видалити поточне завдання і додати нове. Також потрібно врахувати зміну налаштування під час зміни інтервалу для крон завдання.

Цей приклад показує, як зробити таку операцію з плагіном ACF. При оновленні налаштування якого потрібно оновити крон завдання.

// функція виконання крон задачі 'rs_cron_event'
add_action( 'rs_cron_event', 'rs_cron_rebuild_meta_products');

// додамо наш новий інтервал для крона
add_filter( 'cron_schedules', 'rs_cron_interval');

// Функція оновлення поля
add_filter( 'acf/update_value/name=rs_time_period', 'my_acf_update_value', 10, 3);

function rs_cron_rebuild_meta_products() {
	// виконуємо завдання крон
	$headers = 'Від: My Name <[email protected]>' . "rn";
	wp_mail('[email protected]', 'Тема', 'Зміст', $headers);
}

function rs_cron_interval( $schedules, $value = '' ){
	// щоб можна було вказати значення жорстко
	if(! $value)
		$value = intval( get_option('options_rs_time_period')?: 12);

	$schedules['rs_time_period'] = array(
		'interval' => $value * HOUR_IN_SECONDS ,
		'display' => 'Задається в налаштуваннях плагіна RS'
	);

	return $schedules;
}

function my_acf_update_value( $new_period, $post_id, $field ) {

	$old_period = get_option('options_rs_time_period');

	// опція змінилася, перезапишемо крон завдання з новим налаштуванням!
	if( $new_period != $old_period ){
		// видалимо наявне крон завдання
		$timestamp = wp_next_scheduled('rs_cron_event');
		wp_unschedule_event( $timestamp, 'rs_cron_event');

		// Змінимо інтервал щоб завдання додалося правильно...
		add_filter( 'cron_schedules', function( $schedules ) use ( $new_period ){
			return rs_cron_interval( $schedules, $new_period ); // милиця жорстко вкажемо інтервал
		} );

		// додамо крон завдання знову
		wp_reschedule_event( time(), 'rs_time_period', 'rs_cron_event' );
	}

	return $new_period;
}
0

#6 Клас для зручного додавання крон подій

Дивіться у статті Kama_Cron .

0

#7 Параметри для php функції крон-завдання

Аргументи слід передавати як елементи індексного масиву.

register_activation_hook( __FILE__, 'my_activation' );

function my_activation() {

	$args = [$args_1, $args_2];

	if ( ! wp_next_scheduled ( 'my_hourly_event', $args ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event', $args );
	}
}

Не забудьте вказати, скільки аргументів має отримати функція – 4-й параметр add_action() .

add_action( 'my_hourly_event', 'do_this_hourly', 10, 2);

function do_this_hourly( $args_1, $args_2 ) {
	// do something every hour
}

список змін

З версії 2.1.0Введено.
З версії 5.1.0Відновлювальна величина внесена в boolean позначення успіху або помилки, pre_schedule_event filtr added до шорт-circuit функцій.
З версії 5.7.0The $wp_error parameter був added.

Код wp_schedule_event() WP 6.0.2

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'],
	);

	/** Цей filter is documented в 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;
	}

	/** Цей filter is documented в 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();
	if (! is_array($crons)) {
		$crons = 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);
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *