wp_schedule_event() — при помощи WP_Cron создаём задачу, выполняющуюся регулярно через заданные промежутки времени

Цель этой статьи — показать на простых примерах и целиком разобраться в том, как в WordPress запланировать задачу (функцию), которая будет выполняться регулярно через заданный вами промежуток времени.

Прежде, чем перейти к примерам, взглянем на саму функцию.

wp_schedule_event( $timestamp, $recurrence, $hook, $args = array())
$timestamp
(целое число) Время в UNIX формате, в которое задача выполнится в первый раз. На UNIX формате времени я уже подробно останавливался в предыдущей статье.
$recurrence
(строка) Интервал времени, через который задача будет выполняться вновь, однако этот параметр не позволяет задать непосредственно временной промежуток, он работает только с уже предопределёнными интервалами, то есть вам следует указать имя интервала, по умолчанию доступны:
  • hourly — ежечасно,
  • twicedaily — дважды в день, а если точнее, то каждые 12 часов,
  • daily — ежедневно.

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

$hook
(строка) Название хука, который запустится функцией wp_schedule_event(), после чего уже будут выполнены все функции, которые привязаны к этому хуку. Если вы не знакомы с хуками, то это предложение может показаться вам непонятным — не стоит беспокоиться, на примерах ниже всё будет показано наглядно.
$args
(массив) Массив параметров, которые будут переданы в хук, а соответственно и во все привязанные к нему функции.

Примеры

1. Каждый час отправляем email.

Не спрашивайте зачем, основная цель — показать, как всё это работает, а там вы уже и сами свои функции подставить сможете. Письма мы будем отправлять через стандартную WP функцию wp_mail().

// функция, привязанная к хуку, понятное дело, что их может быть несколько
function true_otpravka_email() {
    wp_mail('true@truemisha.ru','Тема тестового письма','Тестовое сообщение');
}
 
// собственно вот он и хук, true_hook_1
add_action('true_hook_1', 'true_otpravka_email');
 
// time() - текущее время в UNIX-формате, то есть в первый раз задача выполнится моментально
if( !wp_next_scheduled('true_hook_1') )
    wp_schedule_event( time(), 'hourly', 'true_hook_1');

Так как код мы отправляем в functions.php и так как у функции wp_schedule_event() нет никакой встроенной проверки на дубликаты задач, мы сами проверяем, не было ли уже запланировано событие при помощи wp_next_scheduled(), которая возвращает false, если указанный хук ещё не был запланирован, либо же UNIX-время его следующего выполнения.

У этого примера есть и альтернативный вариант — вариант, который позволят на каждый email (тему/сообщение) запланировать уникальную задачу.

// видите, мы не создаём никаких дополнительных функций, а wp_mail вешаем на хук напрямую
add_action('true_hook_1', 'wp_mail', 10, 3);
 
$parametri = array( 'true@truemisha.ru','Тема тестового письма','Тестовое сообщение' );
 
// если хотя бы один из вышеуказанных параметров изменится, хук уже будет считаться уникальным и запланируется снова
if( !wp_next_scheduled('true_hook_1', $parametri ) )
    wp_schedule_event( time(), 'hourly', 'true_hook_1', $parametri );

2. Регистрируем собственный интервал времени и отправляем себе письмо каждые два часа.

Единственное, что вам понадобится для создания собственного интервала, это вспомнить таблицу умножения, а именно то, что в минуте 60 секунд, в часе 3600, в дне 86400, в неделе 604800, в месяце… пожалуй стоит притормозить.

// создание интервала делается на раз-два при помощи хука cron_schedules
add_filter( 'cron_schedules', 'true_moi_interval'); 
 
function true_moi_interval( $raspisanie ) {
    // как я уже упоминал в заголовке, будем высылать письмо каждые два часа, если торопитесь - поставьте раз в две минуты
    $raspisanie['kajd_2_chas'] = array(
        'interval' => 7200,
        'display' => 'Каждые два часа'
    );
    /* пример еженедельного интервала
    $raspisanie['nedelya'] = array(
        'interval' => 604800,
        'display' => 'Раз в неделю'
    );
    */
    return $raspisanie;
}
 
// ну а дальше уже всё то же самое, что мы делали, только уже с другим интервалом
add_action('true_hook_1', 'wp_mail', 10, 3);
 
$parametri = array( 'true@truemisha.ru','Тема тестового письма','Тестовое сообщение' );
 
if( !wp_next_scheduled('true_hook_1', $parametri ) )
    wp_schedule_event( time(), 'kajd_2_chas', 'true_hook_1', $parametri );

3. Как просмотреть, какие задачи запланированы и как отменить их выполнение?

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

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: