Китайские телефоны по наглой цене! 2 сим карты (обе активны), 3.2" сенсор, MP3, MP4 + аналог. TV за 4080 руб. КУПИ ЕГО! ЖМИ СЮДА!
Про то, как работает внутренний Cron на Wordpress
- JawsIk : 10 июля, 2009 Раздел: Wordpress, Программы и скрипты
- | Просмотров 732 всего, 2 сегодня.
Всё началось с того, что мне понадобилось в одном из своих проектов сделать регулярное выполнение кое-чего. В частности я разрабатывал плагин для одной конторы, у которой есть блог и в тоже время у которой есть интернет магазин. В магазине есть колонка “TOP товаров за неделю” и мне поставили задачу написать плагин, который выводит этот ещё и на блоге. В принципе проблем никаких, тем более что программеры сайта мне предоставляли XML этого топа, но дёргать каждый раз этот XML не хотелось, да и смысл, если этот топ меняется раз в неделю.
Сначала я думал просто написать сторонний скрипт, но потом вспомнил, что в есть ведь свой крон в Wordpress. Задачи его использовать раньше не стояло и я решил найти кое-какие решения в сети. Нашёл от SeoCoder-а. Скопировал скрипт, положил в папку плагинов и активировал. И … собственно не работает. (в последствии я нашёл 2 ошибки из которых я считаю обе критичны) Полез дальше в тырнет и увидел, что статью эту с этим кодом растащили по всему тырнету. Только ленивый наверное не запостил этот код. Но проблема заключалась в том, что код то не рабочий. Посему пришлось самому ковырять Вордпрессовский кодекс и кумекать что к чему. Вам же предоставляется результат, который уж точно работает, но при этом я ещё и расскажу, что и чего делает каждая функция. Приступим…
Сразу скажу, что для обычной работы крона Wordpress необходимо 2 функции (+2 редко, но тоже иногда нужные), хотя на самом деле их несколько больше. Кроме того тоже в начале статьи хочу обратить ваше внимание на то, что необходимо зарегистрировать хук (крючёк, который будет исполняться при любом заходе пользователя). Делается это так:
add_action('new_cron_hook’, 'my_function_cron');
Здесь new_cron_hook является названием хука. Именно это название я буду использоваться в последствии для примера.
А my_function_cron это имя функции, которая будет исполняться, когда вдруг где либо я укажу на название своего свеже-зарегистрированного хука. Дальше вы поймёте, как это работает.
Перейдём к функциям:
- wp_schedule_event($time, $period, $name_hook); – фунция которая ставит задачу крона, т.е. инициализирует (или инсталлирует так чтоли)
$time – время (в UNIX-формате) с которого начинается работа крона. Обычно начинают именно с текущего времени, поэтому указывают time()
$period – перод через который будет выполняться крон. hourly – раз в час, twicedaily – раз в 12 часов, daily – раз в сутки
$name_hook – как раз имя хука зарегистрированное нами через action, в нашем примере это ‘new_hook_cron’ - wp_reschedule_event( $time, $period, $name_hook, $args (optional)); – фунция, которая переносит задачу на другое время (например если у вас уже работает хук, а в настройках вы поменяли параметры или время следующего запуска, то нужно воспользоваться именно этой функцией.
$time, $period и $name_hook здеь используются так же как и в предыдущей функции. А последний параметр (аргументы) он вообще не обязателейн и нужен лишь, если необходимо передавать пароли или какие-то специфические параметры для функции к которой привязан ваш хук.
Часто бывает, что эту функцию не используют вовсе и это приводит к некоторым ошибкам, т.к. если ваш плагин имеет некоторые настройки по крону, то я считаю, что эту функцию необходимо использовать. Хотя в некоторых (даже моих начальных) решениях бывают конструкции, когда хук закрывают (следующей функцией) и тут же открывают (предыдущей функцией) заново, но с уже обновлёнными параметрами.
- wp_clear_scheduled_hook($name_hook); – это простая функция, задача которой убить (выключить или как бы сказать очистить крон от) хука, который зарегистрирован в Wordpress кроне. Её необходимо ставить в функции, которая выполняется при конструкции register_deactivation_hook, т.е. в тот момент, когда вы деактивируете ваш плагин.
$name_hook – как вы скорее всего уже догадались это имя нашего крон-хука, т.е. в нашем примере new_cron_hook.
многие по незнанию используют вместо этой функции, другую функцию, а именно wp_unschedule_event, и при этом используют её неправильно и крон не выключается. (но об этом ниже)
- wp_schedule_single_event($time, $name_hook); – функция очень похожая на первую (wp_schedule_event) функцию, но, как видите здесь нет параметра период, т.е. указав время, запуск будет произведён лишь один единственный раз.
Это тоже достаточно специфическая функция, которая применяется реже, но для некоторых решений она очень даже может пригодиться.
Внимательный читатель наверняка спросит, а как же функция, о которой было обещано рассказать ниже, итак я расскажу о ней, но для начала объясню специфику (вернее как чаще всего) используют запуск крона.
Итак чаще всего запускают крон так: wp_schedule_event(time(), ‘hour’, ‘new_hook’);
Здесь я прошу обратить внимание на то, как указывается время, а именно на то, что мы не знаем сами какое время запускаем. Мы просто говорим запустить функцию с текущим временем и использум для этого функцию без параметров в виде time(). Я хочу обратить на это внимание, что мы понятия не имеем как раз сколько же времени на текущий момент в форме “UNIX timestamp”, а просто говорим - “начиня с текущего”.
Далее хочу обратить внимание, что даже если мы знаем число, которое мы вставили в параметр время, то через час (12 часов или день) время следующего запуска поменяется и мы уже не знаем его.
Но опять же повторюсь, по незнанию люди для завершения работы крона используют функцию wp_unschedule_event и при этом пишут так:
wp_unschedule_event(time(), ‘new_hook’);
т.е. дословно говоря так: “Выключи хук у которого следующий запуск будет как раз в текущую секунду времени”.
Естественно вероятность того, что время следующего запуска совпадёт с текущим временем просто даже не рассматривается, т.к. возможна только в американсокм кино
для дебилов. А это значит, что даже если вы выключили плагин, то крон продолжает работать, а т.к. уже текущей функции нет, то он просто созадёт ошибки, которые нагружают сервер.
Но самое весёое в том, что случается в тот момент, когда вы повторно включаете плагин. А случается следующее – задачи крона плодятся и получается очень инетерсный каламбур. Когда вы при отладке включили 10 раз плагин и выключили и т.о. запустили 10 одинаковых задач (пускай например вставить пост каждый час). Итак вы пошли пить чай, потом отвлеклись и вернувшись через час решили протестировать и обновили свою страницу и что же вы видите? А видите вы то, что через час вместо одного поста добавилось 10 одинаковых.
Меня же это повергло в некий шок и я включил и выключил (тестируя плагин) ещё раз эдак 50 и дошло до того, что я уже визуально стал ощущать ошибочную нагрузку при выключенном плагине. Ествественно решил всё функцией wp_clear_scheduled_hook , которая убила все процессы и в последствии стал использовать именно её.
В конце статьи хочу предоставить правельный код, демонстрирующий работу крона:
/*
Plugin Name: (Zu) Hourly Poster
Plugin URI: http://blog.jawsik.com
Description: Публикация каждый час
Author: ZUMA
Version: 0.2
Author URI: http://blog.jawsik.com
*/
function zu_cron_activation() {
wp_schedule_event(time(), 'hourly', 'cron_hourly');
}
function zu_cron_deactivation() {
wp_clear_scheduled_hook('cron_hourly');
}
function zu_cron_hourly() {
$my_post = array(‘post_title’ => ‘Новая запись создана:’ . date(‘Y-m-d в H:i:s’),
‘post_content’ => ‘Это очередная запись <br> Unix-время создания:’ . time(),
‘post_status’ => ‘publish’,
‘post_author’ => 1,
'post_category'’ => array(0)
);
wp_insert_post( $my_post );
}
register_activation_hook(__FILE__, 'zu_cron_activation');
register_deactivation_hook(__FILE__, 'zu_cron_deactivation');
add_action('cron_hourly'’, ‘zu_cron_hourly’);
?>
Да, кстати обращайте внимание на кавычки в коде… а то Wordpress любит их менять.
Кстати на заметку:
- Рекомендую посмотреть улётный мульфильм от Энфорты про правильный инет – Жинь офисных жЫвотных. Редкостно интересное видео.
- Появились быстрые и качественные специалисты из компании Seoprogon, которые проведут ручную регистрацию в каталогах сайтов и статей. Такой подход не просто увеличивает общий объем ссылок на ваш ресурс, а плюс привлекает на него новых целевых посетителей.
- Обратите внимание на доступный автомобиль Lada Kalina sport, универсал, хэтчбек. Так же хочу уточнить, что цены на эти авто в условиях кризиса стали гораздо привлекательней.



11 июля, 2009 (09:40)
дополню
в вордпрессе задано два интервала hourly и daily, если нужно свой интервал сделать, то помогает навешать фильтр на функцию cron_schedules. например:
function more_reccurences($schedules) {
$schedules['my_period'] = array('interval' => 21600, 'display' => __('Every 6 Hours'));
return $schedules;
}
add_filter('cron_schedules', 'more_reccurences');
11 июля, 2009 (14:58)
Кстати великолепная находка по поводу добавления фильтра...