Все что нужно знать про WP Cron в WordPress

3 мин. 44 сек.
329
2

Что такое cron и в чем его отличие от wp-cron?

Cron — команда UNIX, которая используется для выполнение периодических задач, через заданный промежуток времени.

Wp-cron — псевдо-крон, который необходим для выполнение функционала обычного крона, но в рамках wordpress. Он необходим для следующих задач:

  • проверка обновлений ядра, плагинов, тем
  • функционал сторонних плагинов, которые используют cron.

Особенности wp-cron

  1. Крон-задача это хук, который запускает через определенное время
  2. Работать с крон-задачи можно из wordpress
  3. Wp-cron запускается при запуске сайте т.е. при маленькой посещаемости сайта крон будет запаздывать, а при большой создавать лишнюю нагрузку

Все крон задачи хранятся в опции ‘cron‘. Каждая задача это массив состоящий из времени, хука, расписания и аргументов.

1562527413 => array( // key - время следующего выполнения в timestamp
	"wp_version_check" => array( //hook name
		"40cd750bba9870f18aada2478b24840a" => array( // key - md5( serialize( $event->args ) );
			"schedule" => "twicedaily", // Название интервала
			"args"     => array(), // Аргументы
			"interval" => 43200 // Интервал в timestamp
		)
	)
)

Посмотреть список всех задач можно с помощью:

var_dump( get_option( 'cron' ) );

Добавить свою крон задачу

Зарегистрировать задачу можно следующими функциями:

wp_schedule_single_event( $timestamp, $hook, $args = array() );
wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() );
  • $timestamp — время, в которое выполнится крон-задача;
  • $recurrence — промежуток, через который выполнится задача:
    hourly — ежечасно;
    twicedaily — дважды в день;
    daily — ежедневно.
  • $hook — произвольное название крон-задачи, которая является обычным хуком
  • $args = array() — массив параметров, который необходимо передать в хук.

Как видим отличие в том, что wp_schedule_single_event выполняется один раз, а wp_schedule_event через промежуток($recurrence).

Так же, чтобы не создавать дубли крон-задач, что является типичной ошибкой новичков, необходимо перед добавлением всегда проверять наличие этой задачи с помощью:

wp_next_scheduled( $hook, $args );

Данная функция вернет время, в которое выполнится крон-задача если она уже создана.

Готовый пример:

$args = array( 'first', 'second' );
if ( ! wp_next_scheduled( 'dmx_cron', $args ) ) { // проверяем наличие крон-задачи
	wp_schedule_event( time(), 'hourly', 'dmx_cron', $args ); // создаем крон-задачу если такой нет
}

// Добавляем хук на нашу крон-задачу
add_action( 'dmx_cron', 'dmx_cron_callback', 10, 2 );
function dmx_cron_callback( $arg1, $arg2 ) {
	//something do
}

Удалить крон-задачу можно следующими способами:

wp_clear_scheduled_hook( 'dmx_cron', array('first', 'second') );
wp_unschedule_event( wp_next_scheduled( 'dmx_cron' ), 'dmx_cron' );
wp_unschedule_hook( 'dmx_cron' );

Различие между функциями можно почитать в документации.

Мы так же можем добавить свой интервал если это необходимо:

add_filter( 'cron_schedules', 'dmx_interval'); 
function dmx_interval( $recurrence ) {
	$recurrence['dmx_5_min'] = array(
		'interval' => 600, // 60seconds * 5 min
		'display' => 'Каждые 5 минут'
	);
	return $recurrence ;
}

Все функции:

  • wp_schedule_single_event — создать крон-задачу, которая выполнится всего 1 раз;
  • wp_schedule_event — создать крон-задачу, которая будет выполняться через определенный интервал;
  • wp_reschedule_event — пересоздает новую задачу, со сдвигом на указанный интервал;
  • wp_unschedule_event — удалить крон-задачу;
  • wp_clear_scheduled_hook — удаляет все крон-задачи прикрепленные к указанному хуку и имеющие указанные параметры;
  • wp_unschedule_hook — удаляет абсолютно все крон-задачи по названию.
  • wp_next_scheduled — проверяет наличие крон-задачи и так же получает время ее следующего выполнения;
  • spawn_cron — посылает запрос на запуск wp-cron через HTTP-запрос;
  • wp_cron — запускает крон-задачу;
  • wp_get_schedules — получить все зарегистрированные интервалы;
  • wp_get_schedule — получить интервал указанной крон-задачи;
  • wp_get_ready_cron_jobs — получает все задачи, которые нужно выполнить в текущее время.

Уменьшение нагрузки на сервер отключением wp-cron

При каждой загрузке страницы подключается файл wp-cron.php в котором происходит работа запускается крон-задачи wordpress’а если это нужно.

Есть возможность отключить этот функционал и запускать их вручную или через серверный крон.

Чтобы отключить крон достаточно написать в wp-config.php

define('DISABLE_WP_CRON', true);

Для того, чтобы функционал wp-cron работал необходимо на хостинге настроить cron-задачу, которая будет запускать wp-cron. Делается это очень легко.

wget -O /dev/null -t 1 -q 'https://wp-punk.com/wp-cron.php?doing_wp_cron=1'

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *