Что такое WP-Cron и зачем он нужен
WP-Cron — это встроенная в WordPress система планирования задач, которая позволяет автоматически запускать определённые действия через заданные интервалы времени. Это может быть отправка писем, обновление данных, очистка кеша, создание резервных копий и многое другое. По сути, WP-Cron — это аналог системного cron в Linux, но работает он не по расписанию сервера, а при заходе пользователя на сайт.
Из-за этого у WP-Cron есть свои особенности и ограничения, которые важно понимать при использовании для автоматизации. Например, если на сайт долго никто не заходит, задачи могут запускаться с задержкой. С другой стороны, для большинства сайтов с регулярным трафиком WP-Cron отлично справляется с задачами без дополнительной настройки.
В этой статье мы рассмотрим, как правильно использовать WP-Cron, как создавать собственные задачи, и приведём примеры полезных плагинов и кода для практического применения.
Как создавать и регистрировать задачи WP-Cron
Основные функции для работы с WP-Cron
Для работы с WP-Cron в WordPress есть несколько ключевых функций:
wp_schedule_event()— регистрирует повторяющуюся задачу;wp_clear_scheduled_hook()— удаляет запланированную задачу;wp_next_scheduled()— проверяет, есть ли уже запланированная задача;add_action()— связывает функцию с событием WP-Cron.
Пример регистрации задачи, которая будет запускаться раз в час:
function wpsolution_register_hourly_event() {
if ( ! wp_next_scheduled( 'wpsolution_hourly_event_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpsolution_hourly_event_hook' );
}
}
add_action( 'wp', 'wpsolution_register_hourly_event' );
function wpsolution_hourly_event_function() {
// Логика задачи
error_log('WP-Cron: ежечасная задача выполнена');
}
add_action( 'wpsolution_hourly_event_hook', 'wpsolution_hourly_event_function' );Здесь мы создаём событие с хук-именем wpsolution_hourly_event_hook, которое будет срабатывать каждый час. Внутри функции wpsolution_hourly_event_function можно разместить любой код, который должен выполняться по расписанию.
Добавление своих интервалов времени
По умолчанию WP-Cron поддерживает интервалы 'hourly', 'twicedaily' и 'daily'. Чтобы добавить собственный интервал, можно использовать фильтр cron_schedules:
function wpsolution_custom_cron_intervals( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 300 секунд = 5 минут
'display' => 'Каждые 5 минут'
);
return $schedules;
}
add_filter( 'cron_schedules', 'wpsolution_custom_cron_intervals' );После этого можно использовать новый интервал при регистрации события, например:
wp_schedule_event( time(), 'every_five_minutes', 'wpsolution_five_min_event' );Решение проблемы с запуском WP-Cron на «мертвых» сайтах
Поскольку WP-Cron запускается только при посещении сайта, на низкотрафиковых проектах задачи могут запускаться с большой задержкой. Чтобы избежать этого, рекомендуется отключить встроенный механизм и настроить системный cron на сервере.
Для отключения WP-Cron в файле wp-config.php добавьте:
define( 'DISABLE_WP_CRON', true );Далее в планировщике задач сервера (например, crontab в Linux) создайте задачу, которая раз в 5 минут будет запускать скрипт wp-cron.php:
*/5 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Такой подход гарантирует, что задачи будут запускаться точно по расписанию, независимо от посещаемости сайта.
Практические примеры использования WP-Cron
Пример 1: Автоматическая очистка старых ревизий постов
С течением времени база данных WordPress может разрастаться из-за большого количества ревизий записей. С помощью WP-Cron можно регулярно удалять ревизии старше определённого срока.
function wpsolution_delete_old_revisions() {
global $wpdb;
$days = 30; // Удалять ревизии старше 30 дней
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$wpdb->query( $wpdb->prepare(
"DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < %s",
$date
));
}
function wpsolution_schedule_revision_cleanup() {
if ( ! wp_next_scheduled( 'wpsolution_revision_cleanup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpsolution_revision_cleanup_hook' );
}
}
add_action( 'wp', 'wpsolution_schedule_revision_cleanup' );
add_action( 'wpsolution_revision_cleanup_hook', 'wpsolution_delete_old_revisions' );Этот код создаст ежедневную задачу, которая будет удалять ревизии старше 30 дней, помогая поддерживать базу данных в порядке.
Пример 2: Отправка еженедельной рассылки с новыми постами
Для сайтов с блогом полезно автоматически отправлять подписчикам подборку новых материалов. Вот простой пример, как это сделать с WP-Cron и функцией wp_mail:
function wpsolution_send_weekly_newsletter() {
$args = array(
'post_type' => 'post',
'date_query' => array(
'after' => '1 week ago',
),
'posts_per_page' => 10
);
$posts = get_posts( $args );
if ( empty($posts) ) return;
$message = "Новые статьи за неделю:\n";
foreach ( $posts as $post ) {
$message .= $post->post_title . " - " . get_permalink($post) . "\n";
}
$to = 'example@example.com'; // Здесь можно использовать список рассылки
$subject = 'Еженедельная рассылка с WPSolution.ru';
wp_mail( $to, $subject, $message );
}
function wpsolution_schedule_weekly_newsletter() {
if ( ! wp_next_scheduled( 'wpsolution_weekly_newsletter_hook' ) ) {
wp_schedule_event( time(), 'weekly', 'wpsolution_weekly_newsletter_hook' );
}
}
add_action( 'wp', 'wpsolution_schedule_weekly_newsletter' );
add_action( 'wpsolution_weekly_newsletter_hook', 'wpsolution_send_weekly_newsletter' );<Этот пример можно доработать, подключив список подписчиков из базы данных или сторонних сервисов рассылки.
Полезные плагины для управления WP-Cron
Cron Control
Плагин позволяет просматривать все запланированные задачи WP-Cron, запускать их вручную, удалять и создавать новые через удобный интерфейс. Особенно полезен для отладки и мониторинга cron-задач на сайте.
WP Crontrol
Один из самых популярных плагинов для работы с WP-Cron. Позволяет редактировать задачи, добавлять свои интервалы, просматривать логи и управлять cron-событиями без необходимости писать код.
Использование этих плагинов существенно облегчает работу с автоматизацией и помогает быстро находить и устранять проблемы с выполнением задач.
Советы и рекомендации по работе с WP-Cron
Для стабильной работы системы автоматизации важно придерживаться нескольких правил:
- Не создавайте слишком частые задачи без необходимости, это может привести к нагрузке на сервер.
- Используйте системный cron для сайтов с низкой посещаемостью, чтобы избежать задержек.
- Добавляйте логирование внутри функций задач, чтобы легче отслеживать их выполнение и ошибки.
- Тестируйте задачи на тестовом сайте перед запуском на боевом.
В целом WP-Cron — мощный инструмент, который при правильной настройке позволит решить множество задач по автоматизации сайта WordPress.