Порой бывает необходимо выполнять какие-то действия периодический, например рассылка или какая-нибудь обработка данных. Хорошо если есть доступ к Cron-у на сервер, но если его нет, то можно использовать встроенный в WordPress. Осталось разобраться как собственно прицепится к нему.
Главная функция, которая собственно цепляется за cron, выглядит так:
wp_schedule_event($timestamp, $recurrence, $hook, $args);
Разберёмся с параметрами:
- $timestamp — когда запустить cron, необходимо указать время в Unix-формате, если с текущего момента, то просто time()
- $recurrence — как часто запускать, по умолчанию доступны 3 варианта:
- hourly — раз в час
- twicedaily — каждые 12 часов
- daily — раз в день
так же можно добавить свои варианты, но об этом позже
- $hook — собственно название нашего cron-а, можно придумать любое, оно служит для идентификации для других функций
- $args — аргументы, которые будут передаваться нашей запускаемой функции (не обязательный параметр)
Для примера буду использовать активацию плагина, т.к. внутренний cron как раз используется в основном в плагинах.
function funct_cron_hourly(){
wp_mail( 'me@example.net', 'Запустился, 'Кроновская функция была запущена' );
}
function my_plugin_activation() {
if ( ! wp_next_scheduled( 'funct_hourly' ) )
wp_schedule_event(time(), 'hourly', 'funct_hourly');
}
register_activation_hook(__FILE__, 'my_plugin_activation');
add_action('funct_hourly', 'funct_cron_hourly');
В данном примере, после активации плагина, будет запускаться функция funct_hourly (мы повесили её с помощью функции add_action на идентификатор cron-а), которая в свою очередь будет отправлять письмо с уведомлением о запуске. Обратите внимание на функцию wp_next_scheduled, она проверяет был ли запущен подобный cron или нет, иначе при каждой активации вы будете получать новый дубль cron-а. Так что в данном случае, если функцию проверки убрать и активировать плагин 3 раза, вы будете получать по 3 письма каждый час.
С включением крона разобрались, теперь осталось научиться его отключать. Для этого используется следующая функция:
wp_unschedule_event( $timestamp, $hook);
Параметры:
- $timestamp — время, когда крон будет запущен в следующий раз
- $hook — название нашего cron-а
Пример отключения при деактивации плагина:
function binet_cron_deactivation() {
$timestamp = wp_next_scheduled( 'funct_hourly' );
wp_unschedule_event( $timestamp, 'funct_hourly');
}
register_deactivation_hook(__FILE__, 'my_plugin_deactivation');
С помощью функции wp_next_scheduled мы получаем время, когда будет запущен в очередной раз наш cron, а потом передаём в функцию деактивации. Так же можно отключить все запланированные ранее кроны с помощью функции wp_clear_scheduled_hook(). Она основана на функции wp_unschedule_event() и вызывается так:
wp_clear_scheduled_hook( 'funct_hourly' );
Ну и напоследок расскажу как задавать свои интервалы времени:
add_filter( 'cron_schedules', 'cron_add_new' );
function cron_add_new( $schedules ) {
$schedules['weekly'] = array(
'interval' => 604800,
'display' => __( 'Раз в неделю' )
);
return $schedules;
}
Мы указали свою функцию cron_add_new, которая передаёт параметры для нового интервала. Здесь всё просто: указываем interval в количестве секунд, а так же display — это просто описание. Таким образом вы можете задать любой удобный для вас интервал.