wp_schedule_event()
Створює багаторазове крон-завдання. Встановлює хук, який буде викликатись кожного разу через вказаний інтервал часу.
У більшості випадків функція додає нову крон-завдання, навіть якщо вона вже існує.
Єдиний варіант коли функція не додасть, а оновить дані вже існуючого завдання – це коли збігається мітка часу, назва хука і параметри завдання, що додається, тобто. Усі параметри: $timestamp, $hook, $args
.
Якщо використовується інтервал часу, важливо спочатку додати цей інтервал через хук cron_schedules і тільки потім додавати крон-завдання за допомогою wp_schedule_event().
Крон завдання запускаються при відвідуванні сторінок сайту користувачем або роботом, коли час завдання вже настав.
Використовуйте wp_reschedule_event() , коли потрібно додати завдання і почати виконання через вказаний інтервал, а не відразу.
Використовуйте wp_clear_scheduled_hook() , щоб видалити цю подію .
- Використовуйте wp_schedule_single_event() , щоб запланувати одноразову подію .
Читайте також: WP Cron (планувальник) у WordPress
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
Приклади
#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' ); }
#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() { // робимо щось кожну годину }
#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 = 3600DAY_IN_SECONDS
– день у секундах – 60 * 60 * 24 = 86400WEEK_IN_SECONDS
– Тиждень в секундах – 60 * 60 * 24 * 7 = 604800
#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']; }
#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; }
#6 Клас для зручного додавання крон подій
Дивіться у статті Kama_Cron .
#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.0 | The $wp_error parameter був added. |