wp_schedule_event

Ставит в очередь хук-событие, который WordPress будет выполнять в указанный вами интервал времени.

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

Крон задачи выполняются асинхронно. Т.е. для выполнения ожидаемых крон задач, WordPress отправляет запрос на файл http://site.ru/wp-cron.php. Этот файл самодостаточный: он устанавливает константу define(‘DOING_CRON’, true);, затем подгружает среду WordPress и выполняет все ожидаемые задачи. Поэтому для дебага крон функции нужно напрямую обращаться к файлу http://site.ru/wp-cron.php. (см. пункт “дебаг крона”).

При отправке запроса в файл http://site.ru/wp-cron.php и выполнении очередной задачи WordPress автоматический добавляет новую задачу в планировщик и удаляет текущую, используя при этом: wp_reschedule_event(), wp_unschedule_event().

Чтобы удалить имеющееся событие используйте wp_clear_scheduled_hook()

Константы WordPress которые могут пригодится при создании задач:
HOUR_IN_SECONDS – час в секундах – 60*60 = 3600
DAY_IN_SECONDS – день в секундах – 60*60*24 = 86400
WEEK_IN_SECONDS – неделя в секундах – 60*60*24*7 = 604800
YEAR_IN_SECONDS – год в секундах – 60*60*24*7*365 = 220752000
Оглавление ▴


  • Использование


  • Параметры


  • Дебаг Крона в WordPress


  • Примеры


  • #1. Запланируем действие которое будет выполняться каждый час.


  • #2. Многоразовый вызов wp_schedule_event()


  • #3. Добавление нового интервала


  • #4. Готовый Класс для удобного добавления крон событий


  • #5 Полный пример создания крон задачи


  • Заметки


  • Плагин для контроля Крон задач

Хуки из функции:
schedule_event
Возвращает

false в случае неудачи, null когда планирование завершено.

Использование

<?php wp_schedule_event($timestamp, $recurrence, $hook, $args); ?>


Параметры

$timestamp(число) (обязательный)
Начальная метка времени, с которой хук начнет работать. Нужно указывать в формате UNIX (32165487). WP cron использует время UTC/GMT, а не локальное. Используйте функцию time(), которая всегда в GMT в WP. (current_time(‘timestamp’) – это локальное время в WP).
По умолчанию: нет
$recurrence(строка) (обязательный)

Как часто должно повторяться действие. Допустимые значения ниже. Вы можете создать свой интервал используя фильтр cron_schedules из функции wp_get_schedules().

  • hourly – ежечасно;

  • twicedaily – дважды в день;

  • daily – ежедневно.
    По умолчанию: нет
$hook(строка) (обязательный)
Название хука, который нужно выполнять.
По умолчанию: нет
$args(массив)
Аргументы, которые нужно передать в выполняемый хук.
По умолчанию: нет

к началу

Дебаг Крона в WordPress

Правильно говорить – профилирование функции прикрепленной к хуку, который вызывается кроном. Но для краткости путь это будет “Дебаг Крона”, никто же не против?

Крон задачи выполняются асинхронно и поэтому при загрузке страниц сайта вы не увидите ничего, даже если в функции крона выведите что-то на экран, пр: die('вижу').

Чтобы увидеть возможные ошибки, нужно поставить интервал поменьше и открыть файл http://site.ru/wp-cron.php. Обращаясь к этому файлу, вы увидите что возвращают ваши функции, если наступило время их выполнения. В том числе вы сможете увидеть PHP ошибки (включите константу WP_DEBUG в wp-config.php).

Если нужно, чтобы автоматические задачи временно не восполнялись пока вы “дебагите” новую функцию, то в файле /wp-config.php установите константу

print_r( _get_cron_array() );


к началу

Примеры

#1. Запланируем действие которое будет выполняться каждый час.

Запланируем ежечасное действие для плагина, вызовем wp_schedule_event при активации плагина (при другом вызове, мы получим множество запланированных событий!)

register_activation_hook(__FILE__, 'my_activation');
function my_activation() {
	// удалим на всякий случай все такие же задачи cron, чтобы добавить новые с "чистого листа"
	// это может понадобиться, если до этого подключалась такая же задача неправильно (без проверки что она уже есть)
	wp_clear_scheduled_hook( 'my_hourly_event' );

	// Проверим нет ли уже задачи с таким же хуком
	// этот пункт не нужен, потому что мы выше удалил все задачи...
	// if( ! wp_next_scheduled( 'my_hourly_event' ) ) 

	// добавим новую cron задачу
	wp_schedule_event( time(), 'hourly', 'my_hourly_event');
}

// Будет грамотно проверить выполняется ли крон, если нет - ничего не делаем
// Можно не проводить эту проверку, в принципе
if( defined('DOING_CRON') && DOING_CRON ){
	add_action('my_hourly_event', 'do_this_hourly');
	function do_this_hourly() {
		// делаем что-либо каждый час
	}
}

// При дезактивации плагина или в других случаях, обязательно нужно удалить ранее созданную задачу:
register_deactivation_hook( __FILE__, 'my_deactivation');
function my_deactivation() {
	wp_clear_scheduled_hook('my_hourly_event');
}


к началу

#2. Многоразовый вызов wp_schedule_event()

Этот пример не полагается на активацию плагина (через директорию плагинов), вместо этого он добавляет событие, если его не существует:

// добавляем запланированный хук
add_action('wp', 'my_activation');
function my_activation() {
	if( ! wp_next_scheduled( 'my_hourly_event' ) ) {
		wp_schedule_event( time(), 'hourly', 'my_hourly_event');
	}
}

// добавляем функцию к указанному хуку
add_action('my_hourly_event', 'do_this_hourly');
function do_this_hourly() {
	// делаем что-либо каждый час
}

Крон задача удаляется так:

wp_clear_scheduled_hook('my_hourly_event');

При этому удаляться все задачи с таким названием выполняемого хука. Их может быть несколько, если неправильно их регистрировать.

к началу

#3. Добавление нового интервала

Чтобы добавить новый интервал Cron в WordPress, используем фильтр cron_schedules.

Добавим интервал события – раз в 5 минут:

<?php
function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {
	// Make sure timestamp is a positive integer
	if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {
		return false;
	}

	$crons = _get_cron_array();
	$schedules = wp_get_schedules();

	if ( !isset( $schedules[$recurrence] ) )
		return false;

	$event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );
	/** This filter is documented in wp-includes/cron.php */
	$event = apply_filters( 'schedule_event', $event );

	// A plugin disallowed this event
	if ( ! $event )
		return false;

	$key = md5(serialize($event->args));

	$crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval );
	uksort( $crons, "strnatcasecmp" );
	_set_cron_array( $crons );
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *