Главная Новости

WP-Cron - планировщик задач в WordPress


Опубликовано: 01.09.2018

видео WP-Cron - планировщик задач в WordPress

Настрою ленты для плагина WPGrabber на WordPress

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



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


cron задача в 1 минуту на хостингере

Наглядные примеры WP-Cron:

ну конечно же это проверка обновлений в WordPress, которая, если не ошибаюсь, происходит дважды в день, запланированные посты, также хороший пример, это когда премиумная подписка пользователя на сайте закончилась и его роль нужно поменять скажем с premium на subscriber.

Теперь давайте рассмотрим более практические примеры в рамках сайта на WordPress.


php Пример работы file put contents и крон cron, cron job

WP-Cron — это очень просто, однако я помню то время, когда боялся к нему подступиться. Просто читайте эту статью последовательно и сразу же выполняйте данные здесь примеры и этого будет достаточно, чтобы освоить планировщик задач в WordPress.

Проверим, работает ли WP-Cron у вас на сайте и если нет, попробуем исправить 

Обычно на сайтах WordPress с планировщиком всё окей, однако всё же бывают случаи, когда он не работает. Поэтому, прежде чем перейти к примерам, давайте убедимся, что с ним всё окей.

Делается это очень просто — нам нужно создать пост и в качестве даты публикации установить время в будущем, ну и понятное дело, чтобы долго ждать не пришлось, можно поставить время на 2 или 5 минут позже текущего.

Если WP_Cron работает на вашем сайте, то пост просто опубликуется через пару минут, а если не работает, то вот что вы получите:

Если у вас пост опубликовался, то можете пропустить следующую главу.

Как исправить WP_Cron? 

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

Прежде всего попробуйте открыть файл wp-config.php и проверьте, нет ли там строчки, отключающей CRON define('DISABLE_WP_CRON', true);. Если есть, попробуйте её просто удалить и посмотрите, что получится. Если в wp-config.php всё в порядке, то… сами добавим эту строку… если быть точным, то мы попробуем подключить альтернативную конфигурацию планировщика, для это в wp-config.php помещаем следующий код:
define ( 'DISABLE_WP_CRON' , true ) ; define ( 'ALTERNATE_WP_CRON' , true ) ;
Если не помогло, то вы можете попробовать использовать системный планировщик в вашей хостинг-панели. Опять-таки нужно отключить (хотя он и так не работает) виртуальный WP_Cron строчкой:
define ( 'DISABLE_WP_CRON' , true ) ;

В хостинг-панели (например cPanel) вам нужно найти соответствующий инструмент планировщика. Заходим в него и в поле «Команда для выполнения» (или что-то типо того) указываем URL вашего файла wp-cron.php на сайте, а если быть точным, то:

wget -O /dev/null http://ваш-сайт.ru/wp-cron.php?doing_wp_cron
Всё ещё ничего не получается?.. Да пишите сразу в супорт хостинга со словами «че за фигня», если помочь не могут, то переходите на другой хостинг. Например на мой . Просто дело в том, что проблемы с виртуальным WP_Cron — это в большинстве случаев проблемы с сервером, а решать их должен именно супорт, я так считаю.

Попробуем запланировать собственную задачу, которая выполнится в определённое время 

Для этих целей в WordPress существует функция wp_schedule_single_event() (подробнее по ссылке, но переходить не обязательно, я и тут всё расскажу).

Пример 1. Пошагово. 

Если вы всё же мельком взглянете на документацию функции, то возможно в целом вам будет понятна следующая строчка.

В первом параметре мы указываем время в UNIX-формате , в данном случае time() — текущее время, +60 — + 60 секунд, это значит, что событие запланируется на выполнение ровно через минуту после запуска функции. Второй параметр — это название хука WordPress, который запустится через минуту. Про хуки и фильтры я обязательно подробно напишу отдельную статью. А пока что постараюсь просто подробно описать на примерах.
wp_schedule_single_event ( time ( ) + 60 , 'misha_action_hook' ) ;

Окей, начало у нас есть, теперь вопрос — куда это вставить? Просто в functions.php не получится, ведь тогда событие будет пытаться запланироваться каждый раз при загрузке/обновлении любой страницы сайта.

Поэтому код непосредственно с запуском этой функции лучше всего добавлять в обработчики форм. Форма отправлена — событие запланировано. Всё просто.

Однако я воспользуюсь тем, что при смене темы WordPress на страницу передаётся параметр GET activated, равный true — в таком случае я смогу вставить код прямо в functions.php в следующем виде:

if ( $_GET [ 'activated' ] == 'true' ) wp_schedule_single_event ( time ( ) + 60 , 'misha_action_hook' ) ;

Это означает, что как только кто-то переключится на текущую тему, событие запланируется.

Хорошо, что же теперь делать с misha_action_hook? Повторяю — это не функция! Просто очень частой ошибкой бывает, что люди начинают писать функцию function misha_action_hook(лалала) — это неправильно, а правильно будет так:

// вот он хук и мы вешаем на него произвольную функцию add_action ( 'misha_action_hook' , 'test' ) ; // конечно можно повесить и несколько функций на один хук! function test ( ) { // просто банально поменяю емайл администратора на сайте, на мой взгляд проще всего протестировать update_option ( 'admin_email' ,'[email protected]' ) ; }

Незнакомая функция? Читайте подробнее про update_option() .

Вставляем всё это пошагово в functions.php, переключаемся сначала на какую-нибудь левую тему, а потом обратно на текущую, замечаем минуту и потом смотрим емайл в настройках.

Пример 1. Готовый код. 

Для вашего удобства вот полностью готовый код из примера.

if ( $_GET [ 'activated' ] == 'true' ) wp_schedule_single_event ( time ( ) + 60 , 'misha_action_hook' ) ; add_action ( 'misha_action_hook' , 'test' ) ; function test ( ) { update_option ( 'admin_email' ,'[email protected]' ) ; }

Разве не просто?

И напоследок — у функции wp_schedule_single_event() есть ещё один, третий аргумент, который содержит параметры, передаваемые в хук, и тут я предлагаю вам два варианта — вы можете перейти по ссылке на функцию, чтобы почитать о ней подробнее там, либо переходите к следующему примеру, хоть он уже и про другую функцию, но параметр с аргументами работает у них одинаково.

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

В этом нам поможет функция wp_schedule_event() (если хотите подробнее — перейдите по ссылке).

Пример 2. Пошагово. 

В отличие от предыдущего примера, который можно сказать был вступительным, у этой функции я рассмотрю все четыре параметра.

Значит сначала взгялнем на эту строчку кода:

wp_schedule_event ( time ( ) , 'hourly' , 'misha_hook_1' , array ( '[email protected]' , 'Тест тема' , 'Тест сообщение' ) ) ;
В первом параметре указывается время первого выполнения задачи, при помощи функции time() я указал текущее время, то есть тот самый момент, когда функция будет запущена. Напоминаю, что время в UNIX-формате . Второй параметр — это один из предопределенных вордпрессом интервалов времени, hourly — раз в час, twicedaily — дважды в день, daily — раз в день. О том, как задать собственный интервал, читайте ниже . Третий параметр — это название хука, я надеюсь, что в предыдущем примере я хоть немного пролил на это свет и теперь хоть немного, но понятно, что это значит. А вот четвертый — это одномерный массив из параметров, передаваемых в хук, в данном случае misha_hook_1.

Куда вставлять?

Тут я хочу обратить ваше внимание, что сколько раз вы запустите функцию wp_schedule_event() , то столько раз и запланируется повторяющееся событие!

А это значит, что по сути неважно, куда вы её вставите, главное сделайте проверку, что точно такая же задача уже не запланирована. В этом вам поможет функция wp_next_scheduled() .

$parametri = array ( '[email protected]' , 'Тест тема' , 'Тест сообщение' ) ; // если ещё не запланировано - планируем if ( !wp_next_scheduled ( 'misha_hook_1' , $parametri ) ) wp_schedule_event ( time ( ) , 'hourly' , 'misha_hook_1' , $parametri ) ;

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

Ну а дальше — функция и хук. Я не сказал вам, что моя цель — ежечасно отправлять себе сообщение с сайта.

// вот он хук и мы вешаем на него произвольную функцию, цифра 3 - количество передаваемых параметров add_action ( 'misha_hook_1' , 'misha_send' , 10 , 3 ) ; // конечно можно повесить и несколько функций на один хук! function misha_send ( $to , $subject , $msg ) { // отправляем емайл каждый час wp_mail ( $to , $subject , $msg ) ; }

Для отправки писем я использую стандартную функцию WordPress — wp_mail() . Обратите внимание, что необязательно создавать функцию misha_send(), а можно сразу повесить wp_mail() на хук.

Пример 2. Готовый код. 

Ну и конечно же готовый код в одном листинге для вашего удобства.
$parametri = array ( '[email protected]' , 'Тест тема' , 'Тест сообщение' ) ; if ( !wp_next_scheduled ( 'misha_hook_1' , $parametri ) ) wp_schedule_event ( time ( ) , 'hourly' , 'misha_hook_1' , $parametri ) ; add_action ( 'misha_hook_1' , 'misha_send' , 10 , 3 ) ; function misha_send ( $to , $subject , $msg ) { wp_mail ( $to , $subject , $msg ) ; }

Небольшой простой код — этот можно забацать прямо в functions.php.

Как задать свой собственный интервал? 

Если вас не устраивают стандартные вордпрессовские интервалы времени, вы с лёгкостью можете задать свой собственный.

Делается это предельно просто добавлением следующего хука в functions.php вашей темы:

add_filter ( 'cron_schedules' , 'true_moi_interval' ) ; function true_moi_interval ( $raspisanie ) { // $raspisanie - это массив, состоящий из всех зарегистрированных интервалов // наша задача - добавить в него свой собственный интервал, к примеру пусть будет 3 минуты $raspisanie [ 'kajd_3_min' ] = array ( 'interval' => 180 , // в одной минуте 60 секунд, в трёх минутах - 180 'display' => 'Каждые три минуты' // отображаемое имя ) ; return $raspisanie ; }

Всё, интервал зарегистрирован, теперь можно использовать его имя kajd_3_min при планировке повторяющихся событий.

Как посмотреть все запланированные задачи 

Делается это довольно просто двумя способами — либо через плагин, либо через код. Если вам часто приходится мониторить, то конечно лучше и удобнее воспользоваться плагином, но обо всём по порядку.

Через код 

Cron-задачи хранятся в виде массива прямо в таблице wp_options базы данных. А значит их можно получить при помощи функции get_option() . И вот как это делается.

// получаем все задачи из базы данных $cron_zadachi = get_option ( 'cron' ) ; // можно использовать функции print_r() или var_dump() для вывода всех задач var_dump ( $cron_zadachi ) ;

В результате они выведутся примерно в таком формате:

Используя плагин 

Зная из предыдущей главы, как выводятся задачи, вы теперь с лёгкостью и сами сможете написать плагин для мониторинга, а я поделюсь с вами тем плагином, который использую сам и в общем-то пока он меня устраивает — бесплатный Advanced Cron Manager (добавляйте прямо через админку). Если вы знаете плагины получше, прошу поделиться в комментариях ????

Заходим в Инструменты > Cron Manager и все задачи перед нами:

В колонке Schedule мы видим название интервала, single же означает, что задача выполнится только 1 раз, а затем сама удалится из расписания.

Конечно немного неудобно то, что в этом плагине не указывается сразу UNIX-штамп времени для каждой задачи, но его можно легко получить при помощи функции strtotime().

echo strtotime ( '28.07.2016 08:53:01' ) ; // 1469695981

Как удалить задачу из расписания? 

Удаление задач происходит при помощи одной из двух функций — wp_clear_scheduled_hook() или wp_unschedule_event() , отличие второй от первой заключается в том, что она может удалить более конкретную задачу, если вам интересны подробности, переходите по ссылкам и читайте описания этих функций.

Что же касается наших примеров 1 и 2, для удаления этих событий нам подойдёт любая из них, поэтому давайте первое событие с хуком misha_hook_1 удалим функцией wp_clear_scheduled_hook() , а второе с хуком misha_action_hook функцией wp_unschedule_event() .

// удаляем первое событие wp_clear_scheduled_hook ( 'misha_hook_1' , array ( '[email protected]' , 'Тест тема' , 'Тест сообщение' ) ) ; // удаляем второе событие wp_unschedule_event ( wp_next_scheduled ( 'misha_action_hook' ) , 'misha_action_hook' ) ;

Первый параметр функции wp_unschedule_event() — это штамп времени, который вы можете получить при помощи wp_next_scheduled() , либо глянуть его при выводе всех задач через код, тут это будет 1469678041.

Функции для работы с WP_Cron

wp_schedule_single_event() — как, используя WP_Cron, запланировать задачу, которая выполнится в определённое время. Функция позволяет запланировать задачу, которая выполнится в опредёленное время. Описание функции и примеры. wp_schedule_event() — при помощи WP_Cron создаём задачу, выполняющуюся регулярно через заданные промежутки времени На примерах разберём, как при помощи WP_Cron WordPress создать задачу, выполняющуюся регулярно через заданные нами промежутки времени. wp_unschedule_event() — удаляет указанное событие из расписания Удаляет из массива расписания единственное событие, которое должно выполниться в указанное время и привязано к заданному хуку. wp_clear_scheduled_hook() — удаляет из расписания все события, связанные с указанным хуком Функция удаляет из расписания все события, связанные с указанным хуком. wp_next_scheduled() — возвращает ближайшее время выполнения указанного хука Функция WP, возвращает время следующего выполнения указанной запланированной задачи. Подробное описание + примеры.
rss