Порой бывает необходимо выполнять какие-то действия периодический, например рассылка или какая-нибудь обработка данных. Хорошо если есть доступ к Cron-у на сервер, но если его нет, то можно использовать встроенный в WordPress. Осталось разобраться как собственно прицепится к нему.
Главная функция, которая собственно цепляется за cron, выглядит так:
1 |
wp_schedule_event($timestamp, $recurrence, $hook, $args); |
Разберёмся с параметрами:
- $timestamp - когда запустить cron, необходимо указать время в Unix-формате, если с текущего момента, то просто time()
- $recurrence - как часто запускать, по умолчанию доступны 3 варианта:
- hourly - раз в час
- twicedaily - каждые 12 часов
- daily - раз в день
так же можно добавить свои варианты, но об этом позже
- $hook - собственно название нашего cron-а, можно придумать любое, оно служит для идентификации для других функций
- $args - аргументы, которые будут передаваться нашей запускаемой функции (не обязательный параметр)
Для примера буду использовать активацию плагина, т.к. внутренний cron как раз используется в основном в плагинах.
1 2 3 4 5 6 7 8 9 10 11 |
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 письма каждый час.
С включением крона разобрались, теперь осталось научиться его отключать. Для этого используется следующая функция:
1 |
wp_unschedule_event( $timestamp, $hook); |
Параметры:
- $timestamp - время, когда крон будет запущен в следующий раз
- $hook - название нашего cron-а
Пример отключения при деактивации плагина:
1 2 3 4 5 6 |
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() и вызывается так:
1 |
wp_clear_scheduled_hook( 'funct_hourly' ); |
Ну и напоследок расскажу как задавать свои интервалы времени:
1 2 3 4 5 6 7 8 9 |
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 - это просто описание. Таким образом вы можете задать любой удобный для вас интервал.