Расписание событий с помощью WordPress Cron

Содержание скрыть

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

WordPress Cron
(Изображение: Дон Шуетце)

Вот где cron и WordPress Крон вступают в игру. Но они могут быть использованы для гораздо больше, чем заполнение почтовых ящиков до краев. Прежде чем мы погрузимся в специфику обоих, вот быстрый разбивка тем, которые мы рассмотрим ниже:

  • Что такое cron и как WordPress вписывается в него?
  • Представляя WordPress Cron
  • Ограничения WordPress Cron (и решения, чтобы исправить их)
  • Для каких задач используется WordPress Cron?
  • Как WordPress выполняет запланированные задачи?
  • Как запланировать задачи через WordPress Cron
  • Советы по разработке с WordPress Cron
  • Популярные плагины, которые используют WordPress Cron

Все еще заинтересованы? Давайте перейдем к нему.

Что такое Крон и как WordPress Fit в него?

Cron — это система, изначально созданная для UNIX, которая позволяет пользователям выполнять команды, программы и другие действия в указанное время. Как красноречиво говорит Википедия,«Крон – это планировщик рабочих мест, основанный на времени».

Дальнейшее чтение на SmashingMag:

В принципе, это означает, что вы можете запланировать действие, которое будет происходить в определенное время, без необходимости вручную выполнять код в это время. Но как это относится к вашему сайту – в частности, ваш сайт WordPress? Настройка веб-сайта WordPress для использования системы UNIX cron, встроенной в операционную систему вашего сервера, возможна; однако, это может быть трудно по двум основным причинам:

  1. Хозяин может не разрешить вам настроить cron по соображениям безопасности.
  2. Различные серверы могут потребовать настройки cron по-разному, что потребует знакомства с широким спектром систем.

Если команда WordPress не могла полагаться на использование cron каждого сервера, то как они запланировали задачи, которые должны быть выполнены? Они построили WordPress Cron.

Представляя WordPress Cron

WordPress Cron является то, что многие люди называют “псевдо-крон системы”. Разница заключается в том, как UNIX cron и WordPress Cron принять меры. Типичная система UNIX cron работает в таком порядке:

  1. Время, связанное с действием, происходит.
  2. Крон запускает действие, связанное с тем временем.

С WordPress Cron, он работает немного по-другому:

  1. Посетитель приходит на любую страницу на вашем сайте WordPress.
  2. WordPress Cron проверяет каждое событие cron, чтобы увидеть, прошло ли запланированное время.
  3. Если запланированное время для этого события прошло, то 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 загружается? Мы будем ходить через этот процесс здесь вместе (но это стоит иметь твердое понимание крючки и фильтры, прежде чем пройти через это):

  1. Посетитель запрашивает страницу на вашем сайте.
  2. В /wp-includes/default-filters.php , WordPress крючки wp_cron() функции init действия.
  3. Когда init действие происходит /wp-settings.php в, wp_cron() работает.
  4. wp_cron()Функция гарантирует, что WordPress Cron не отключен и что самое раннее запланированное событие cron прошло время его выполнения.
  5. Если он прошел время выполнения, затем работает и сначала проверяет, проводим spawn_cron() ли мы уже cron и, если да, то не запускает его снова.
    if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) )
      return;
    
  6. Начиная с строки 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'] );
    
  7. 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() , мы делаем две вещи:

  1. Мы используем wp’next-scheduled() для проверки того, было ли уже создано наше событие cron. И wp_next_scheduled() будет либо вернуть отметку времени следующего запланированного события для крючка wi_create_daily_backup () или вернуться, false сообщая нам, что наше событие cron не запланировано.
  2. Если $timestamp == false , то мы планируем наше событие cron для ежедневных резервных копирования. Мы планируем первое резервное копирование произойдет немедленно с помощью функции PHP time() , а затем мы проходим график повторения и наш 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.

Я настоятельно рекомендую WP Crontrol, если вы планируете использовать WordPress Cron API в плагине.

IDE Debugger

Если вы разрабатываете плагины с использованием интегрированной среды разработки (IDE) вместо базового текстового редактора, то отладчик может быть чрезвычайно полезным ресурсом для рассмотрения массива событий cron и создания новых событий. Если вы еще не используете IDE, два из самых популярных Eclipse и NetBeans, но еще много там на выбор.

WordPress Cron API часто используется в популярных плагинах на платформе WordPress. Чтобы дать вам почувствовать его использование, я расскажу, как два довольно популярных плагинов использовать API.

Akismet

Akismet является ведущим инструментом предотвращения спама для WordPress. На момент написания статьи, он был загружен более 14 миллионов раз.

Akismet

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.

Я настоятельно рекомендую WP Crontrol, если вы планируете использовать WordPress Cron API в плагине.

IDE Debugger

Если вы разрабатываете плагины с использованием интегрированной среды разработки (IDE) вместо базового текстового редактора, то отладчик может быть чрезвычайно полезным ресурсом для рассмотрения массива событий cron и создания новых событий. Если вы еще не используете IDE, два из самых популярных Eclipse и NetBeans, но еще много там на выбор.

WordPress Cron API часто используется в популярных плагинах на платформе WordPress. Чтобы дать вам почувствовать его использование, я расскажу, как два довольно популярных плагинов использовать API.

Akismet

Akismet является ведущим инструментом предотвращения спама для WordPress. На момент написания статьи, он был загружен более 14 миллионов раз.

Akismet

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

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

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

%d такие блоггеры, как: