Я не знаю, как вы, но я просыпаюсь каждое утро, по крайней мере 10 писем, которые у меня не было, когда я пошел спать. Хотя большинство людей, вероятно, знают, что эти письма не отправляются вручную некоторые лишены сна, кофе топливом стажера, многие люди не понимают все возможности и выходы из систем, которые автоматизируют задачи, такие как отправка электронной почты.
(Изображение: Дон Шуетце)
Вот где cron и WordPress Крон вступают в игру. Но они могут быть использованы для гораздо больше, чем заполнение почтовых ящиков до краев. Прежде чем мы погрузимся в специфику обоих, вот быстрый разбивка тем, которые мы рассмотрим ниже:
- Что такое cron и как WordPress вписывается в него?
- Представляя WordPress Cron
- Ограничения WordPress Cron (и решения, чтобы исправить их)
- Для каких задач используется WordPress Cron?
- Как WordPress выполняет запланированные задачи?
- Как запланировать задачи через WordPress Cron
- Советы по разработке с WordPress Cron
- Популярные плагины, которые используют WordPress Cron
Все еще заинтересованы? Давайте перейдем к нему.
Что такое Крон и как WordPress Fit в него?
Cron — это система, изначально созданная для UNIX, которая позволяет пользователям выполнять команды, программы и другие действия в указанное время. Как красноречиво говорит Википедия,«Крон – это планировщик рабочих мест, основанный на времени».
Дальнейшее чтение на SmashingMag:
- Как использовать машины: Быть продуктивным с задачами бегунов
- Как исправить в Интернете: Неясные методы бэк-Энда и секреты терминала
- 10 Полезные WordPress Крюк хаки
- Простой рабочий процесс от разработки к развертыванию
В принципе, это означает, что вы можете запланировать действие, которое будет происходить в определенное время, без необходимости вручную выполнять код в это время. Но как это относится к вашему сайту — в частности, ваш сайт WordPress? Настройка веб-сайта WordPress для использования системы UNIX cron, встроенной в операционную систему вашего сервера, возможна; однако, это может быть трудно по двум основным причинам:
- Хозяин может не разрешить вам настроить cron по соображениям безопасности.
- Различные серверы могут потребовать настройки cron по-разному, что потребует знакомства с широким спектром систем.
Если команда WordPress не могла полагаться на использование cron каждого сервера, то как они запланировали задачи, которые должны быть выполнены? Они построили WordPress Cron.
Представляя WordPress Cron
WordPress Cron является то, что многие люди называют «псевдо-крон системы». Разница заключается в том, как UNIX cron и WordPress Cron принять меры. Типичная система UNIX cron работает в таком порядке:
- Время, связанное с действием, происходит.
- Крон запускает действие, связанное с тем временем.
С WordPress Cron, он работает немного по-другому:
- Посетитель приходит на любую страницу на вашем сайте WordPress.
- WordPress Cron проверяет каждое событие cron, чтобы увидеть, прошло ли запланированное время.
- Если запланированное время для этого события прошло, то WordPress Cron выполняет любые действия, связанные с этим событием.
Ограничения WordPress Cron (и решения, чтобы исправить ‘Em)
Вы можете быть удивлены: «Что произойдет, если никто не посещает мой сайт на всех? Ли WordPress Крон не работать? Самое большое ограничение WordPress Cron проистекает из его неспособности работать без посетителей. Это приводит к нескольким потенциальным проблемам.
WordPress Крон является неточным (ноль посещений и нулевой Крон работает)
Если вы запланировали письмо, которое будет отправлено в 2:00 вечера в понедельник, то письмо, вероятно, не будет отправлено именно в это время, если ваш сайт получил визит ровно в 2:00 вечера. Вместо этого, письмо будет отправлено во время первого визита после 2:00 вечера.
В большинстве случаев это не оказывает большого влияния. Но что делать, если письмо было напоминанием о событии на следующий день, во вторник? Если следующий посетитель пришел во вторник вечером, то электронная почта, скорее всего, не служат никакой пользы, и, возможно, запутать посетителей.
Таким образом, рассмотреть последствия не посещений. Если веб-сайт не получает никакого трафика на всех, то WordPress Крон никогда не будет работать.
Решение заключается в создании более точной cron системы.
Если ваш сайт требует времени, чтобы быть точным, вы можете следовать одному из двух методов. Вы можете настроить cron вашего сервера, чтобы ударить wp-cron.php
через регулярный интервал, следуя инструкциям, изложенным в статье Хариш Chouhan о Wptuts. Если это кажется слишком сложным, вы можете использовать такой инструмент, как Pingdom, чтобы вызвать запрос HTTP непосредственно wp-cron.php
на .
Запуск тяжелых процессов может замедлить ваш сайт
Подобно запуску любого тяжелого процесса на странице нагрузки, WordPress Крон может замедлить ваш сайт значительно для посетителя, который вызывает тяжелый процесс, связанный с запланированным событием.
Решение заключается в том, чтобы держать WordPress Cron действия простыми.
Особенно, если вы работаете действия часто, держать действия привязаны к запланированным событиям cron как можно проще. Каждая лишняя унция сложности будет препятствовать производительности для ваших конечных пользователей.
Какие задачи WordPress Cron используется для?
Мы рассмотрели то, что WordPress Крон и каковы его ограничения. Теперь пришло время обсудить, для чего он на самом деле используется. WordPress Cron может быть использован для планирования двух типов крючков:
- те, чтобы выполнить на регулярной, повторяющийся интервал;
- тех, которые выполняться только один раз в определенное время.
Примеры задач, запланированных в регулярном, повторяющихся интервалах
WordPress ‘ядро и ряд плагинов использовать WordPress Cron для выполнения следующих задач на регулярной, повторяющиеся интервалы:
- резервное копирование веб-сайта,
- проверка версии WordPress, чтобы убедиться, что она в актуальном состоянии,
- проверка обновлений для плагинов и тем,
- оптимизация базы данных для повышения производительности.
Примеры задач, которые планируется выполнять только один раз в установленное время
Отдельные события, возникающие только один раз, используются для таких действий, как:
- публикация блога в определенное время,
- отправка электронной почты в определенное время.
Как WordPress выполняет запланированные задачи?
Прежде чем перейти в том, как запланировать свои собственные события, было бы полезно понять, как WordPress Cron работает. WordPress Cron работает с помощью двух файлов:
-
/wp-includes/cron.php
Этот файл содержит весь API WordPress Cron и функции, необходимые для планирования событий. -
/wp-cron.php
Этот файл на самом деле выполняет WordPress Cron и вызывает крючки, прикрепленные к запланированным событиям. Этот файл загружается через функцию spawn’cron() вcron.php
.
У нас есть файлы сейчас, но что происходит, когда страница WordPress загружается? Мы будем ходить через этот процесс здесь вместе (но это стоит иметь твердое понимание крючки и фильтры, прежде чем пройти через это):
- Посетитель запрашивает страницу на вашем сайте.
- В
/wp-includes/default-filters.php
, WordPress крючкиwp_cron()
функцииinit
действия. - Когда
init
действие происходит/wp-settings.php
в,wp_cron()
работает. -
wp_cron()
Функция гарантирует, что WordPress Cron не отключен и что самое раннее запланированное событие cron прошло время его выполнения. -
Если он прошел время выполнения, затем работает и сначала проверяет, проводим
spawn_cron()
ли мы уже cron и, если да, то не запускает его снова.if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) ) return;
-
Начиная с строки 247
cron.php
,spawn_cron()
загружаетсяwp-cron.php
через запрос HTTP. (Использованиеwp_remote_post()
для загрузкиwp-cron.php
не предотвращает загрузку оставшейся части страницы для посетителя.)$cron_request = apply_filters( 'cron_request', array( 'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ), 'key' => $doing_wp_cron, 'args' => array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) ) ); wp_remote_post( $cron_request['url'], $cron_request['args'] );
-
wp-cron.php
Файл загружается и циклирирует через все запланированные события cron, делая следующее:- Линия 85. Если событие находится на повторяющемся графике, то WordPress запускает wp’reschedule-event() для планирования следующего события этого события.
- Линия 90. WordPress не планирует текущее событие, используя wp’unschedule-event(), так что он не будет работать снова в будущем.
-
Линия 92. WordPress выполняет все функции, связанные с крючком, предусмотренных в cron событие, в том числе все действия, которые были запланированы для запуска в эту секунду или до этой второй, используя do’action’ref’array ().
foreach ($crons как $timestamp , $cronhooks)
если ($timestamp ($timestamp) $gmt времени)
перерыв;foreach ($cronhooks как $hook , $keys)
foreach ( $keys as $k => $v ) { $schedule = $v['schedule']; if ( $schedule != false ) { $new_args = array($timestamp, $schedule, $hook, $v['args']); call_user_func_array('wp_reschedule_event', $new_args); } wp_unschedule_event( $timestamp, $hook, $v['args'] ); do_action_ref_array( $hook, $v['args'] ); // If the hook ran too long and another cron process stole the lock, quit. if ( _get_cron_lock() != $doing_wp_cron ) return; }
}
}
Как и в случае с большим количеством исходного кода WordPress, процесс организован таким образом, что делает его довольно легко следовать. Я призываю вас посмотреть на код себя в обоих cron.php
и wp-cron.php
узнать больше.
Как запланировать задачи через WordPress Cron?
Если вы сделали это так далеко, то мы можем, наконец, обратить наше внимание на то, как использовать WordPress Cron в наших собственных плагинов.
Создание повторяющихся событий в WordPress Cron
Создание события, которое повторяется по фиксированному графику, осуществляется с помощью wp’schedule-event ($timestamp, $recurrence, $hook, $args),в котором используются следующие четыре параметра:
-
$timestamp
(требуется: все в один раз) Это время, когда вы хотите, чтобы событие произошло. Это должно быть в UNIX метки времени и должны быть в GMT. Если вы используете местное время, затем преобразуйте его в GMT сначала, иначе событие не будет гореть в нужное время. -
$recurrence
(требуется строка) Именно так часто должно происходить событие. Параметры поhourly
умолчанию,twicedaily
илиdaily
. Вы также можете добавить свои собственные опции, которые мы коснимся в ближайшее время. -
$hook
(требуется строка) Это название крючка действия, который вы хотели бы выполнить. Преимущество вызова крючка действия вместо функции непосредственно заключается в том, что вы можете связать несколько функций с одним крючком с помощью add’action(). -
$args
(необязательно: массив) Это любые аргументы, которые вы хотите передать крючковатой функции или функции. Это может быть идентификатор публикации, идентификатор расписания резервного копирования, идентификатор пользователя или любая другая информация, которая будет использоваться в ваших функциях.
Допустим, мы построили плагин, который резервное копирование базы данных WordPress один раз в день. Вот как выглядел бы код, если бы мы запланировали резервную операцию с WordPress Cron:
//On plugin activation schedule our daily database backup
register_activation_hook( __FILE__, 'wi_create_daily_backup_schedule' );
function wi_create_daily_backup_schedule(){
//Use wp_next_scheduled to check if the event is already scheduled
$timestamp = wp_next_scheduled( 'wi_create_daily_backup' );
//If $timestamp == false schedule daily backups since it hasn't been done previously
if( $timestamp == false ){
//Schedule the event for right now, then to repeat daily using the hook 'wi_create_daily_backup'
wp_schedule_event( time(), 'daily', 'wi_create_daily_backup' );
}
}
//Hook our function , wi_create_backup(), into the action wi_create_daily_backup
add_action( 'wi_create_daily_backup', 'wi_create_backup' );
function wi_create_backup(){
//Run code to create backup.
}
Для начала мы wi_create_daily_backup_schedule()
подключимся к register_activation_hook()
тому, чтобы наше событие резервного копирования cron было добавлено немедленно, когда плагин активирован. В wi_create_daily_backup_schedule()
, мы делаем две вещи:
- Мы используем wp’next-scheduled() для проверки того, было ли уже создано наше событие cron. И
wp_next_scheduled()
будет либо вернуть отметку времени следующего запланированного события для крючкаwi_create_daily_backup
() или вернуться,false
сообщая нам, что наше событие cron не запланировано. - Если
$timestamp == false
, то мы планируем наше событие cron для ежедневных резервных копирования. Мы планируем первое резервное копирование произойдет немедленно с помощью функции PHPtime()
, а затем мы проходим график повторения и нашdaily
wi_create_daily_backup
крюк.
После создания запланированного события, все, что осталось сделать, это связать нашу функцию резервного копирования к wi_create_backup
действию. Мы add_action( ‘wi_create_daily_backup’, ‘wi_create_backup’ )
используем, чтобы подключить нашу функцию. Затем мы записываем нашу wi_create_backup()
функцию для создания резервного копирования веб-сайта.
Добавление нового WordPress Cron Расписание
Как я уже упоминал при обсуждении повторяющихся событий, параметры по умолчанию для повторяющихся hourly
графиков, twicedaily
и daily
. Но что, если вместо того, чтобы запускать резервную часть ежедневно, мы хотели бы запустить его еженедельно? WordPress делает еженедельный график легко с cron_schedules
фильтром. Чтобы сделать расписание еженедельно, вы бы написать следующий код в плагине:
add_filter( 'cron_schedules', 'wi_add_weekly_schedule' );
function wi_add_weekly_schedule( $schedules ) {
$schedules['weekly'] = array(
'interval' => 7 * 24 * 60 * 60, //7 days * 24 hours * 60 minutes * 60 seconds
'display' => __( 'Once Weekly', 'my-plugin-domain' )
);
/*
You could add another schedule by creating an additional array element
$schedules['biweekly'] = array(
'interval' => 7 * 24 * 60 * 60 * 2
'display' => __( 'Every Other Week', 'my-plugin-domain' )
);
*/
return $schedules;
}
$schedules
Массив передается в нашу функцию и позволяет нам добавлять weekly
ключ с желаемым графиком. Для interval
ключа, мы должны включить количество секунд, которые мы хотели бы между раз это событие cron работает. Чтобы запустить один раз в неделю, мы вычисляем 7 дней и 24 часов, 60 минут и 60 секунд, чтобы дать нам общее количество секунд в неделю. Затем мы создаем название дисплея «Однажды в неделю», в случае, если другим нужно прочитать описание нашего расписания.
Не забудьте локализовать описание с помощью q (), так что он может быть переведен позже. Если вы заинтересованы в добавлении более одного расписания, просто создайте новый ключ массива $schedules
внутри, $schedules[‘biweekly’]
например, и добавьте интервал и описание. Чтобы завершить нашу функцию, мы возвращаем $schedules
массив, включая наше новое расписание.
Глядя на предыдущий пример нашего резервного графика, если бы мы хотели, чтобы он запускался еженедельно, мы бы просто взять это:
'daily', 'wi_create_daily_backup' );
И мы бы изменить его на это, используя новый weekly
график мы создали:
'weekly', 'wi_create_daily_backup' );
Теперь наша резервная работа будет работать раз в неделю.
Удаление запланированных событий Крон
Возвращаясь к нашему примеру резервного плагина, то, что мы сделали до сих пор есть одна проблема. Мы не удалили запланированное событие резервного копирования после деактивации плагина. Это не вызовет ошибки, когда событие выполняется ежедневно, но это заставит cron для запуска, возможно, замедление веб-сайта все так незначительно. Удалить запланированное мероприятие очень просто.
register_deactivation_hook( __FILE__, 'wi_remove_daily_backup_schedule' );
function wi_remove_daily_backup_schedule(){
wp_clear_scheduled_hook( 'wi_create_daily_backup' );
}
Очень много, как мы сделали на активации, мы подключить функцию, wi_remove_daily_backup_schedule()
к деактивации нашего плагина. Мы передаем крюк события wi_create_daily_backup
на wp’clear’scheduled-hook(),а затем график будет удален из WordPress Cron.
Стоит отметить, что wp_clear_scheduled_hook()
удалит все события, связанные с этим крючком. Если вы хотите удалить только одно событие, вместо этого используйте wp’unschedule-event() вместо этого; эта функция требует, чтобы вы прошли в метке времени события, которое вы хотите удалить.
Создать одно событие в WordPress Cron
Иногда требуется создание одного события в определенное время. Для создания единого события в WordPress Cron, мы должны использовать wp’schedule-single-event ($timestamp, $hook, $args). Параметры здесь точно такие wp_schedule_event()
же, как, за исключением того, что они не включают $recurrence
параметр, что позволяет событие происходить только один раз.
Допустим, мы хотим отправить напоминание по электронной почте для волонтерской деятельности, которая произойдет в будущем. Вы можете использовать этот код непосредственно внутри функции запуска, когда сообщение о добровольческой деятельности сохраняется в разделе WordPress’.
//Convert start time from local time to GMT since WP Cron sends based on GMT
$start_time_gmt = strtotime( get_gmt_from_date( date( 'Y-m-d H:i:s', $start_time ) ) . ' GMT' );
//Set reminder time for three days before event start time
$time_prior_event = 3 * 24 * 60 * 60; //3 days * 24 hours * 60 minutes * 60 seconds
$reminder_time = $start_time_gmt - $time_prior_event;
//Remove existing cron event for this post if one exists
//We pass $post_id because cron event arguments are required to remove the scheduled event
wp_clear_scheduled_hook( 'wi_send_reminder_email', array( $post_id ) );
//Schedule the reminder
wp_schedule_single_event( $reminder_time, 'wi_send_reminder_email', array( $post_id ) );
//...
В этом коде происходит ряд важных шагов. Во-первых, если время волонтерской деятельности хранится в переменной в местное время, то мы должны преобразовать его в GMT, потому что WordPress Cron не работает по местному времени. После преобразования в $start_time_gmt
переменную, мы устанавливаем время начала $reminder_time
деятельности добровольцев за вычетом количества секунд до события, которое мы хотим отправить по электронной почте.
Затем мы удаляем все запланированные события для этого крючка и публикуем возможность избежать планирования нашего мероприятия несколько раз, когда публикация сохраняется. Помните, что для его удаления необходимо пройти массив, включая те же аргументы, которые использовались для создания запланированного события. В этом случае мы передавая идентификатор поста. Это имеет смысл, в конце концов. Вы хотите удалить запланированное напоминание по электронной почте не для каждой волонтерской деятельности, только для той, которую сохраняет пользователь.
После того как мы создали время напоминания и очистили все ранее запланированные события, мы создаем новое событие с помощью с wp_schedule_single_event()
меткой $reminder_time
времени. Мы также проходим в $post_id
для этой конкретной должности, так что мы можем включить пользовательскую информацию в нашей электронной почте, такие как название поста, время деятельности, описание деятельности и любой другой информации.
Чтобы отправить электронное письмо, когда происходит событие cron, мы зацепили функцию, которую мы хотим выполнить при возникновении wi_send_reminder_email
события.
//Hook our function, wi_send_event_reminder_email(), into the action wi_send_reminder_email
add_action( 'wi_send_reminder_email', 'wi_send_event_reminder_email' );
function wi_send_event_reminder_email( $post_id ){
//Run code to send reminder email, customizing based on the post}
Советы по разработке с WordPress Cron
Когда вы кодируете с WordPress Cron, несколько инструментов, в частности, может реально помочь вашему процессу разработки.
WP Кронтрол
WP Crontrol является WordPress плагин, который поможет вам развиваться с помощью WordPress Cron API. Он отображает все запланированные события cron, позволяет отредить, запустить или удалить события cron с помощью графического интерфейса, а также позволяет увидеть все доступные графики cron.
Интерфейс администрирования WP Crontrol.
Я настоятельно рекомендую WP Crontrol, если вы планируете использовать WordPress Cron API в плагине.
IDE Debugger
Если вы разрабатываете плагины с использованием интегрированной среды разработки (IDE) вместо базового текстового редактора, то отладчик может быть чрезвычайно полезным ресурсом для рассмотрения массива событий cron и создания новых событий. Если вы еще не используете IDE, два из самых популярных Eclipse и NetBeans, но еще много там на выбор.
Примеры WordPress Крон используется в популярных плагинов
WordPress Cron API часто используется в популярных плагинах на платформе WordPress. Чтобы дать вам почувствовать его использование, я расскажу, как два довольно популярных плагинов использовать API.
Akismet
Akismet является ведущим инструментом предотвращения спама для WordPress. На момент написания статьи, он был загружен более 14 миллионов раз.
Akismet использует WordPress Cron API для ряда целей, в том числе:
- Перепроверка в будущем, является ли комментарий спамом в случае, если серверы Akismet недоступны во время проверки;
- Перепроверка ключа API Akismet, если плагин не может проверить в данный момент из-за недосягаемого сервера;
- Удалять старые спам-комментарии на регулярной основе;
Чтобы удалить старые спам-комментарии, Akismet создает ежедневное событие и удаляет комментарии в течение определенного возраста каждый день.
if ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_event') ) {
// WP 2.1+: delete old comments daily
if ( !wp_next_scheduled('akismet_scheduled_delete') )
wp_schedule_event(time(), 'daily', 'akismet_scheduled_delete');
}
Сломанная ссылка Проверка
возвращение $schedules;
}
$schedules
Массив передается в нашу функцию и позволяет нам добавлять weekly
ключ с желаемым графиком. Для interval
ключа, мы должны включить количество секунд, которые мы хотели бы между раз это событие cron работает. Чтобы запустить один раз в неделю, мы вычисляем 7 дней и 24 часов, 60 минут и 60 секунд, чтобы дать нам общее количество секунд в неделю. Затем мы создаем название дисплея «Однажды в неделю», в случае, если другим нужно прочитать описание нашего расписания.
Не забудьте локализовать описание с помощью q (), так что он может быть переведен позже. Если вы заинтересованы в добавлении более одного расписания, просто создайте новый ключ массива $schedules
внутри, $schedules[‘biweekly’]
например, и добавьте интервал и описание. Чтобы завершить нашу функцию, мы возвращаем $schedules
массив, включая наше новое расписание.
Глядя на предыдущий пример нашего резервного графика, если бы мы хотели, чтобы он запускался еженедельно, мы бы просто взять это:
'daily', 'wi_create_daily_backup' );
И мы бы изменить его на это, используя новый weekly
график мы создали:
'weekly', 'wi_create_daily_backup' );
Теперь наша резервная работа будет работать раз в неделю.
Удаление запланированных событий Крон
Возвращаясь к нашему примеру резервного плагина, то, что мы сделали до сих пор есть одна проблема. Мы не удалили запланированное событие резервного копирования после деактивации плагина. Это не вызовет ошибки, когда событие выполняется ежедневно, но это заставит cron для запуска, возможно, замедление веб-сайта все так незначительно. Удалить запланированное мероприятие очень просто.
register_deactivation_hook( __FILE__, 'wi_remove_daily_backup_schedule' );
function wi_remove_daily_backup_schedule(){
wp_clear_scheduled_hook( 'wi_create_daily_backup' );
}
Очень много, как мы сделали на активации, мы подключить функцию, wi_remove_daily_backup_schedule()
к деактивации нашего плагина. Мы передаем крюк события wi_create_daily_backup
на wp’clear’scheduled-hook(),а затем график будет удален из WordPress Cron.
Стоит отметить, что wp_clear_scheduled_hook()
удалит все события, связанные с этим крючком. Если вы хотите удалить только одно событие, вместо этого используйте wp’unschedule-event() вместо этого; эта функция требует, чтобы вы прошли в метке времени события, которое вы хотите удалить.
Создать одно событие в WordPress Cron
Иногда требуется создание одного события в определенное время. Для создания единого события в WordPress Cron, мы должны использовать wp’schedule-single-event ($timestamp, $hook, $args). Параметры здесь точно такие wp_schedule_event()
же, как, за исключением того, что они не включают $recurrence
параметр, что позволяет событие происходить только один раз.
Допустим, мы хотим отправить напоминание по электронной почте для волонтерской деятельности, которая произойдет в будущем. Вы можете использовать этот код непосредственно внутри функции запуска, когда сообщение о добровольческой деятельности сохраняется в разделе WordPress’.
//Convert start time from local time to GMT since WP Cron sends based on GMT
$start_time_gmt = strtotime( get_gmt_from_date( date( 'Y-m-d H:i:s', $start_time ) ) . ' GMT' );
//Set reminder time for three days before event start time
$time_prior_event = 3 * 24 * 60 * 60; //3 days * 24 hours * 60 minutes * 60 seconds
$reminder_time = $start_time_gmt - $time_prior_event;
//Remove existing cron event for this post if one exists
//We pass $post_id because cron event arguments are required to remove the scheduled event
wp_clear_scheduled_hook( 'wi_send_reminder_email', array( $post_id ) );
//Schedule the reminder
wp_schedule_single_event( $reminder_time, 'wi_send_reminder_email', array( $post_id ) );
//...
В этом коде происходит ряд важных шагов. Во-первых, если время волонтерской деятельности хранится в переменной в местное время, то мы должны преобразовать его в GMT, потому что WordPress Cron не работает по местному времени. После преобразования в $start_time_gmt
переменную, мы устанавливаем время начала $reminder_time
деятельности добровольцев за вычетом количества секунд до события, которое мы хотим отправить по электронной почте.
Затем мы удаляем все запланированные события для этого крючка и публикуем возможность избежать планирования нашего мероприятия несколько раз, когда публикация сохраняется. Помните, что для его удаления необходимо пройти массив, включая те же аргументы, которые использовались для создания запланированного события. В этом случае мы передавая идентификатор поста. Это имеет смысл, в конце концов. Вы хотите удалить запланированное напоминание по электронной почте не для каждой волонтерской деятельности, только для той, которую сохраняет пользователь.
После того как мы создали время напоминания и очистили все ранее запланированные события, мы создаем новое событие с помощью с wp_schedule_single_event()
меткой $reminder_time
времени. Мы также проходим в $post_id
для этой конкретной должности, так что мы можем включить пользовательскую информацию в нашей электронной почте, такие как название поста, время деятельности, описание деятельности и любой другой информации.
Чтобы отправить электронное письмо, когда происходит событие cron, мы зацепили функцию, которую мы хотим выполнить при возникновении wi_send_reminder_email
события.
//Hook our function, wi_send_event_reminder_email(), into the action wi_send_reminder_email
add_action( 'wi_send_reminder_email', 'wi_send_event_reminder_email' );
function wi_send_event_reminder_email( $post_id ){
//Run code to send reminder email, customizing based on the post}
Советы по разработке с WordPress Cron
Когда вы кодируете с WordPress Cron, несколько инструментов, в частности, может реально помочь вашему процессу разработки.
WP Кронтрол
WP Crontrol является WordPress плагин, который поможет вам развиваться с помощью WordPress Cron API. Он отображает все запланированные события cron, позволяет отредить, запустить или удалить события cron с помощью графического интерфейса, а также позволяет увидеть все доступные графики cron.
Интерфейс администрирования WP Crontrol.
Я настоятельно рекомендую WP Crontrol, если вы планируете использовать WordPress Cron API в плагине.
IDE Debugger
Если вы разрабатываете плагины с использованием интегрированной среды разработки (IDE) вместо базового текстового редактора, то отладчик может быть чрезвычайно полезным ресурсом для рассмотрения массива событий cron и создания новых событий. Если вы еще не используете IDE, два из самых популярных Eclipse и NetBeans, но еще много там на выбор.
Примеры WordPress Крон используется в популярных плагинов
WordPress Cron API часто используется в популярных плагинах на платформе WordPress. Чтобы дать вам почувствовать его использование, я расскажу, как два довольно популярных плагинов использовать API.
Akismet
Akismet является ведущим инструментом предотвращения спама для WordPress. На момент написания статьи, он был загружен более 14 миллионов раз.
Akismet использует WordPress Cron API для ряда целей, в том числе:
- Перепроверка в будущем, является ли комментарий спамом в случае, если серверы Akismet недоступны во время проверки;
- Перепроверка ключа API Akismet, если плагин не может проверить в данный момент из-за недосягаемого сервера;
- Удалять старые спам-комментарии на регулярной основе;
Чтобы удалить старые спам-комментарии, Akismet создает ежедневное событие и удаляет комментарии в течение определенного возраста каждый день.
if ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_event') ) {
// WP 2.1+: delete old comments daily
if ( !wp_next_scheduled('akismet_scheduled_delete') )
wp_schedule_event(time(), 'daily', 'akismet_scheduled_delete');
}
Сломанная ссылка Проверка
Broken Link Checker является WordPress плагин, который проверяет весь ваш сайт для сломанной ссылки. Он использует WordPress Cron для ряда регулярных мероприятий, в том числе:
- Проверка новых ссылок ежечасно, чтобы убедиться, что они не сломаны,
- Отправка уведомлений по электронной почте о сломанных ссылках на веб-сайте,
- Завершение обслуживания базы данных каждые два месяца,
- Обновление новостей о плагине каждый день,
Broken Link Checker создает каждый из этих графиков с помощью одной setup_cron_events()
функции, .
/**
* Install or uninstall the plugin's Cron events based on current settings.
*
* @uses wsBrokenLinkChecker::$conf Uses $conf->options to determine if events need to be (un)installed.
*
* @return void
*/
function setup_cron_events(){
//Link monitor
if ( $this->conf->options['run_via_cron'] ){
if (!wp_next_scheduled('blc_cron_check_links')) {
wp_schedule_event( time(), 'hourly', 'blc_cron_check_links' );
}
} else {
wp_clear_scheduled_hook('blc_cron_check_links');
}
//Email notifications about broken links
if ( $this->conf->options['send_email_notifications'] || $this->conf->options['send_authors_email_notifications'] ){
if ( !wp_next_scheduled('blc_cron_email_notifications') ){
wp_schedule_event(time(), $this->conf->options['notification_schedule'], 'blc_cron_email_notifications');
}
} else {
wp_clear_scheduled_hook('blc_cron_email_notifications');
}
//Run database maintenance every two weeks or so
if ( !wp_next_scheduled('blc_cron_database_maintenance') ){
wp_schedule_event(time(), 'bimonthly', 'blc_cron_database_maintenance');
}
//Check for news notices related to this plugin
if ( !wp_next_scheduled('blc_cron_check_news') ){
wp_schedule_event(time(), 'daily', 'blc_cron_check_news');
}
}
Заключение
К настоящему времени, вы, вероятно, croned из, но я рад, что вы застряли со мной. Теперь вы должны иметь твердое понимание того, что WordPress Cron есть, как она работает и как вы можете использовать его для автоматизации различных функций и функциональности в плагине.
Если у вас есть опыт работы с WordPress Cron или только начали играть вокруг, я хотел бы услышать от вас в комментариях. С какими проблемами вы столкнулись? Для чего ты его используешь? Любые советы по ускорению развития? Знаете ли вы о каких-либо плагинов, которые используют WordPress Cron API в инновационный способ?
(al ea)
Источник: smashingmagazine.com