WordPress Cron — это одна из самых полезных функций, которую вы захотите изучить и понять, если, как и я, вы тратите много времени на работу с WordPress.
Возможность запуска определенных функций в сжатые сроки необходима для любой CMS, а WordPress имеет набор функций, которые помогают сделать этот процесс очень простым и практически без усилий.
В этой статье я расскажу о следующих функциях WordPress Cron:
- Чем WordPress Cron отличается от вашего обычного Cron?
- Планирование повторяющегося события
- Планирование одного события
- Отмена планирования события
- Указание пользовательских интервалов Cron
Что такое Крон?
Вы, вероятно, знакомы с термином «Cron», поскольку он относится к планировщику на основе времени в системах Unix, и хотя Cron в WordPress отличается; основная идея этого та же.
Некоторые примеры того, как WordPress использует внутреннюю систему Cron, проверяют обновления тем и плагинов и даже проверяют, есть ли сообщения, готовые к публикации.
Чем отличается WordPress Cron?
Если вы знакомы с Cron Unix, вы, вероятно, думаете, что Cron WordPress всегда в поиске новых задач и запуска их по мере их поступления. Это далеко от истины, и я объясню почему в ближайшее время.
WordPress Cron запускается при загрузке страницы, будь то интерфейсная или фоновая страница. Другими словами, когда страница загружается на ваш веб-сайт, WordPress проверит, есть ли какие-либо задачи или события, которые нужно запустить и выполнить. Если вы думаете, что это не идеально, вы абсолютно правы.
Если у вас есть веб-сайт, который не получает слишком много трафика, и у вас есть задача, которую нужно выполнить в определенное время, WordPress не будет знать, что задача должна быть выполнена, пока кто-то не заходит на ваш сайт. Даже если это будет робот поисковой системы, сканирующий ваш сайт.
Планирование событий с помощью Cron
Существует два варианта событий Cron, которые можно запланировать с помощью нескольких строк кода:
- Отдельные события — запускаются только один раз и никогда больше, пока они не будут перенесены снова.
- Периодические события — запускаются по расписанию и настроены на повторное появление в течение неопределенного периода времени.
Планирование повторяющегося события
Планирование повторяющегося события требует, чтобы вы создали пользовательское «Действие», которое также должно быть зарегистрировано в Cron. После запуска Cron запускается функция, прикрепленная к пользовательскому «действию», которое вы создали ранее.
Давайте посмотрим на следующий пример, где мы будем ежедневно удалять ревизии.
Сначала мы создаем наше собственное «действие», которое будет прикреплять к нему функцию, которую мы хотим запустить, когда Cron вызывает ловушку.
<?php // delete_post_revisions will be call when the Cron is executed add_action( 'delete_post_revisions', 'delete_all_post_revisions' ); // This function will run once the 'delete_post_revisions' is called function delete_all_post_revisions() { $args = array( 'post_type' => 'post', 'posts_per_page' => -1, // We don't need anything else other than the Post IDs 'fields' => 'ids', 'cache_results' => false, 'no_found_rows' => true ); $posts = new WP_Query( $args ); // Cycle through each Post ID foreach( (array)$posts->posts as $post_id ) { // Check for possible revisions $revisions = wp_get_post_revisions( $post_id, array( 'fields' => 'ids' ) ); // If we got some revisions back from wp_get_post_revisions if( is_array( $revisions ) && count( $revisions ) >= 1 ) { foreach( $revisions as $revision_id ) { // Do a final check on the Revisions if( wp_is_post_revision( $revision_id ) ) { // Delete the actual post revision wp_delete_post_revision( $revision_id); } } } } }
Для планирования повторяющегося события мы используем wp_schedule_event( $timestamp, $recurrence, $hook, $args )
которая принимает 4 аргумента:
- $ timestamp — (целое число) (обязательный) При первом возникновении события. Это должно быть в формате отметки времени UNIX. WP cron использует время UTC / GMT, а не местное время. Используйте time (), который всегда является GMT в WordPress. (current_time (‘timestamp’) — местное время в WordPress.)
- $ recurrence — (строка) (обязательно) Как часто событие должно повторяться. Допустимые значения: «
hourly
», «twicedaily
» и «daily
». Мы увидим, как создать наши собственные временные интервалы позже. - $ hook — (string) (обязательный) Имя хука действия для выполнения.
- $ args — (массив) (необязательно) Аргументы для передачи в функцию (и) хука.
Сначала мы удостоверимся, что событие не было запланировано ранее, и если это не так, мы идем вперед и планируем его
<?php // Make sure this event hasn't been scheduled if( !wp_next_scheduled( 'delete_post_revisions' ) ) { // Schedule the event wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); }
Обратите внимание, что вы также можете добавить этот фрагмент кода к действию. Если вы пишете плагин, вы можете настроить запланированное событие для запуска при первом посещении страницы настроек плагина. Для гораздо более простого примера, мы собираемся связать его с действием init
WordPress.
<?php // Add function to register event to WordPress init add_action( 'init', 'register_daily_revision_delete_event'); // Function which will register the event function register_daily_revision_delete_event() { // Make sure this event hasn't been scheduled if( !wp_next_scheduled( 'delete_post_revisions' ) ) { // Schedule the event wp_schedule_event( time(), 'daily', 'delete_post_revisions' ); } }
Теперь, когда вы знаете, как планировать повторяющиеся события, давайте взглянем на создание одного события, которое никогда не запустится, пока не будет перенесено.
Планирование одного события
Как следует из названия, одно событие — это то, которое запускается один раз, а затем останавливается. Это единственное событие все еще может быть перенесено снова, если это необходимо.
Концепция, лежащая в основе этого, такая же, как повторяющиеся события. Сначала вы регистрируете пользовательский хук, который вызывается Cron при запуске на сервере. Как только Cron вызывает ловушку, его функция выполняется, и именно так вы и делаете.
В качестве примера, мы собираемся установить дату истечения срока действия для сообщений. Срок действия сообщений истекает через 30 дней после публикации. Мы собираемся подключиться к publish_post
чтобы мы могли запланировать наше отдельное событие, как только публикация будет опубликована и начнется publish_post
отсчет.
Настройка функции, которая удалит пост через 30 дней.
<?php // delete_post_after_expiration will be called by Cron // We are going to be passing the Post ID so we need to specify that // we'll need 1 argument passed to the function add_action( 'delete_post_after_expiration', 'delete_post_after_expiration', 10, 1 ); // This function will run once the 'delete_post_after_expiration' is called function delete_post_after_expiration( $post_id ) { // Takes care of deleting the specified Post wp_delete_post( $post_id, true ); }
Довольно просто, правда? Теперь нам нужно запланировать событие, как только публикация действительно будет опубликована. Для выполнения этой задачи нам нужно использовать wp_schedule_single_event( $timestamp, $hook, $args )
которая принимает 3 аргумента.
- $ timestamp — (целое число) (обязательно) Время, когда вы хотите, чтобы событие произошло. Это должно быть в формате отметки времени UNIX.
- $ hook — (string) (обязательный) Имя хука действия для выполнения.
- $ args — (массив) (необязательно) Аргументы для передачи в функцию ловушки.
Вот краткий обзор того, как все эти действия и хуки соединены вместе.
<?php // schedule_post_expiration_event runs when a Post is Published add_action( 'publish_post', 'schedule_post_expiration_event' ); function schedule_post_expiration_event( $post_id ) { // Schedule the actual event wp_schedule_single_event( 30 * DAY_IN_SECONDS, 'delete_post_after_expiration', array( $post_id ) ); }
Мы используем некоторые временные константы, которые есть в WordPress, чтобы сделать нашу жизнь проще. Для получения дополнительной информации об этих константах вы можете перейти к разделу « Использование временных констант », но вот краткий обзор:
-
MINUTE_IN_SECONDS
= 60 (секунд) -
HOUR_IN_SECONDS
= 60 * MINUTE_IN_SECONDS -
DAY_IN_SECONDS
= 24 * HOUR_IN_SECONDS -
WEEK_IN_SECONDS
= 7 * DAY_IN_SECONDS -
YEAR_IN_SECONDS
= 365 * DAY_IN_SECONDS
Отмена планирования событий
Теперь, когда вы знаете, как планировать повторяющиеся и единичные события, также будет полезно узнать, как не планировать эти события.
Вам может быть интересно, почему вы хотите отменять расписание событий? На это есть веская причина, особенно если вы включаете в свои плагины некоторые события расписания.
Кроны хранятся в таблице wp_options и просто деактивируются и удаляются ваш плагин. WordPress все равно будет пытаться запускать ваши события, даже если указанный плагин больше не доступен. Сказав это, пожалуйста, убедитесь, что вы правильно запланировали события в вашем плагине или пользовательской реализации.
Отмена планирования событий Cron относительно проста, все, что вам нужно знать, это имя ловушки и время следующего запланированного запуска конкретного Cron. Мы будем использовать wp_next_scheduled()
чтобы wp_next_scheduled()
когда произойдет следующее вхождение, и только после этого мы можем wp_unschedule_event()
его, используя wp_unschedule_event()
.
Рассматривая наш первый пример, мы планируем событие следующим образом.
<?php // Get the timestamp of the next scheduled run $timestamp = wp_next_scheduled( 'delete_post_revisions' ); // Un-schedule the event wp_unschedule_event( $timestamp, 'delete_post_revisions' );
Настройка Cron Интервалы
Можно установить пользовательские интервалы Cron, которые вы можете использовать при планировании событий с помощью Cron. Для этого нам просто нужно подключиться к фильтру cron_schedules
и добавить наш собственный. Давайте посмотрим на добавление настраиваемого интервала, установленного для запуска каждые 10 минут.
<?php // Add custom cron interval add_filter( 'cron_schedules', 'add_custom_cron_intervals', 10, 1 ); function add_custom_cron_intervals( $schedules ) { // $schedules stores all recurrence schedules within WordPress $schedules['ten_minutes'] = array( 'interval' => 600, // Number of seconds, 600 in 10 minutes 'display' => 'Once Every 10 Minutes' ); // Return our newly added schedule to be merged into the others return (array)$schedules; }
Вывод
Использование WordPress Cron не может быть проще, и это очень хороший и интересный инструмент, который, несомненно, поможет вам сделать ваш плагин более надежным. Изучение всех этих функций и применение их на практике в реальных приложениях — лучший способ освоить Cron в WordPress для планирования событий.