Wp_schedule_event() - функция планироващика WP_Cron в WP
Опубликовано: 01.09.2018
Цель этой статьи — показать на простых примерах и целиком разобраться в том, как в WordPress запланировать задачу (функцию), которая будет выполняться регулярно через заданный вами промежуток времени.
[Wordpress Development] Basic Wordpress Plugin Development [018] Cron Jobs
Прежде, чем перейти к примерам, взглянем на саму функцию.
wp_schedule_event ( $timestamp , $recurrence , $hook , $args = array ( ) ) |
Но вы также легко и просто можете создать свой собственный интервал, о том как — читайте ниже .
WordPress Cron Job
$hook (строка) Название хука, который запустится функцией wp_schedule_event(), после чего уже будут выполнены все функции, которые привязаны к этому хуку. Если вы не знакомы с хуками, то это предложение может показаться вам непонятным — не стоит беспокоиться, на примерах ниже всё будет показано наглядно. $args (массив) Массив параметров, которые будут переданы в хук, а соответственно и во все привязанные к нему функции.
1. Каждый час отправляем email.
Не спрашивайте зачем, основная цель — показать, как всё это работает, а там вы уже и сами свои функции подставить сможете. Письма мы будем отправлять через стандартную WP функцию wp_mail() .
// функция, привязанная к хуку, понятное дело, что их может быть несколько function true_otpravka_email ( ) { wp_mail ( '[email protected]' ,'Тема тестового письма' ,'Тестовое сообщение' ) ; } // собственно вот он и хук, 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 ( '[email protected]' ,'Тема тестового письма' ,'Тестовое сообщение' ) ; // если хотя бы один из вышеуказанных параметров изменится, хук уже будет считаться уникальным и запланируется снова 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 ( '[email protected]' ,'Тема тестового письма' ,'Тестовое сообщение' ) ; if ( !wp_next_scheduled ( 'true_hook_1' , $parametri ) ) wp_schedule_event ( time ( ) , 'kajd_2_chas' , 'true_hook_1' , $parametri ) ; |
3. Как просмотреть, какие задачи запланированы и как отменить их выполнение?
На этом я тоже уже подробно останавливался в предыдущей статье, про просмотр задач тут , а про снятие их с регистрации тут .