Встроенный сron в WordPress

Порой бывает необходимо выполнять какие-то действия периодический, например рассылка или какая-нибудь обработка данных. Хорошо если есть доступ к Cron-у на сервер, но если его нет, то можно использовать встроенный в WordPress. Осталось разобраться как собственно прицепится к нему.

Главная функция, которая собственно цепляется за cron, выглядит так:

wp_schedule_event($timestamp, $recurrence, $hook, $args);

Разберёмся с параметрами:

  1. $timestamp — когда запустить cron, необходимо указать время в Unix-формате, если с текущего момента, то просто time()
  2. $recurrence — как часто запускать, по умолчанию доступны 3 варианта:
    • hourly — раз в час
    • twicedaily — каждые 12 часов
    • daily — раз в день

    так же можно добавить свои варианты, но об этом позже

  3. $hook — собственно название нашего cron-а, можно придумать любое, оно служит для идентификации для других функций
  4. $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);

Параметры:

  1. $timestamp — время, когда крон будет запущен в следующий раз
  2. $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 — это просто описание. Таким образом вы можете задать любой удобный для вас интервал.