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 адреса не оприлюднюватиметься. Обов’язкові поля позначені *