WP-Cron — это встроенный механизм WordPress для запуска запланированных задач, таких как публикация отложенных записей, очистка кэша, отправка уведомлений и другие автоматические операции. В этой статье разберём, как правильно использовать WP-Cron, настроить собственные задачи и избежать распространённых проблем, связанных с его работой.
Что такое WP-Cron и как он работает
В отличие от классического системного cron, WP-Cron работает на основе посещений сайта. Это значит, что WordPress проверяет наличие запланированных задач при каждом обращении пользователя к сайту. Если задачи есть, он запускает их выполнение.
Такой подход удобен, потому что не требует настройки сервера, но может привести к задержкам, если посещаемость сайта низкая. Кроме того, задачи могут запускаться неоднократно при одновременных заходах пользователей.
Для повышения надёжности иногда рекомендуют отключать WP-Cron и настроить системный cron, который будет вызывать обработку задач по расписанию.
Настройка системного cron для WP-Cron
Чтобы отключить автоматический запуск WP-Cron при посещении сайта, нужно в файле wp-config.php добавить строку:
define('DISABLE_WP_CRON', true);Далее, в системном cron (например, на Linux-сервере) создаём задачу, вызывающую обработку WP-Cron каждые 5 минут:
*/5 * * * * wget -q -O - https://yourdomain.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Такой подход гарантирует регулярный запуск задач без зависимости от посетителей.
Как создавать свои задачи в WP-Cron
Для добавления собственной задачи нужно использовать функцию wp_schedule_event. Эта функция регистрирует событие, которое WordPress будет запускать по расписанию.
Пример: добавим задачу, которая будет выполняться каждый час:
function wpconsult_schedule_hourly_task() {
if (!wp_next_scheduled('wpconsult_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wpconsult_hourly_event');
}
}
add_action('wp', 'wpconsult_schedule_hourly_task');Здесь мы проверяем, не запланировано ли уже событие с именем wpconsult_hourly_event, и если нет – создаём новое.
Далее регистрируем функцию-обработчик:
function wpconsult_handle_hourly_event() {
// Ваш код, который должен выполняться каждый час
error_log('WPConsult: Запущена ежечасная задача');
}
add_action('wpconsult_hourly_event', 'wpconsult_handle_hourly_event');При срабатывании задачи будет вызвана функция wpconsult_handle_hourly_event.
Использование кастомных интервалов
WordPress поддерживает стандартные интервалы: 'hourly', 'twicedaily', 'daily'. Если нужно добавить свой, например, каждые 10 минут, нужно зарегистрировать новый интервал:
function wpconsult_custom_cron_schedules($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wpconsult_custom_cron_schedules');Теперь можно использовать этот интервал при планировании задач:
wp_schedule_event(time(), 'every_ten_minutes', 'wpconsult_ten_minute_event');Практические примеры использования WP-Cron
Регулярная очистка временных данных
Если ваш сайт генерирует временные файлы или кэш, полезно настроить их регулярную очистку. Например, создадим задачу, которая удаляет устаревшие записи из таблицы базы данных:
function wpconsult_cleanup_temp_data() {
global $wpdb;
$table = $wpdb->prefix . 'temp_data';
$wpdb->query($wpdb->prepare(
"DELETE FROM $table WHERE created_at < %s",
date('Y-m-d H:i:s', strtotime('-1 day'))
));
error_log('WPConsult: Очистка временных данных выполнена');
}
add_action('wpconsult_cleanup_event', 'wpconsult_cleanup_temp_data');
function wpconsult_schedule_cleanup() {
if (!wp_next_scheduled('wpconsult_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpconsult_cleanup_event');
}
}
add_action('wp', 'wpconsult_schedule_cleanup');Эта задача будет запускаться ежедневно и удалять записи старше одного дня.
Отправка email-уведомлений по расписанию
WP-Cron отлично подходит для рассылки уведомлений. Пример: отправляем администратору отчёт раз в неделю.
function wpconsult_send_weekly_report() {
$to = get_option('admin_email');
$subject = 'Еженедельный отчёт сайта';
$message = 'Отчёт о состоянии сайта за прошедшую неделю.';
wp_mail($to, $subject, $message);
error_log('WPConsult: Еженедельный отчёт отправлен');
}
add_action('wpconsult_weekly_report_event', 'wpconsult_send_weekly_report');
function wpconsult_schedule_weekly_report() {
if (!wp_next_scheduled('wpconsult_weekly_report_event')) {
wp_schedule_event(time(), 'weekly', 'wpconsult_weekly_report_event');
}
}
add_action('wp', 'wpconsult_schedule_weekly_report');Обратите внимание, для интервала 'weekly' нужно добавить кастомный интервал, так как по умолчанию его нет:
function wpconsult_add_weekly_cron_schedule($schedules) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __('Еженедельно')
);
return $schedules;
}
add_filter('cron_schedules', 'wpconsult_add_weekly_cron_schedule');Типичные проблемы с WP-Cron и их решения
Задачи не выполняются или выполняются с задержкой
Основная причина — отсутствие посещений сайта. Если на сайте мало трафика, WP-Cron не запускается автоматически. Решение — отключить WP-Cron и настроить системный cron, как описано выше.
Дублирование выполнения задач
Иногда при одновременных обращениях WP-Cron может запустить одну задачу несколько раз подряд. Чтобы избежать этого, можно использовать флаг блокировки в базе данных или transient:
function wpconsult_handle_event_with_lock() {
if (get_transient('wpconsult_cron_lock')) {
return; // Задача уже выполняется
}
set_transient('wpconsult_cron_lock', true, 300); // Блокируем на 5 минут
// Ваш код задачи
delete_transient('wpconsult_cron_lock');
}
add_action('wpconsult_event_with_lock', 'wpconsult_handle_event_with_lock');Такой подход предотвращает параллельное выполнение.
WP-Cron не запускается из-за проблем с сервером
Некоторые хостинги блокируют внутренние HTTP-запросы, которые WP-Cron использует для запуска. Проверьте, доступен ли URL https://yourdomain.ru/wp-cron.php?doing_wp_cron и нет ли ограничений на запросы с самого сервера.
Полезные плагины для управления WP-Cron
- Cron Control — позволяет просматривать и управлять запланированными задачами через админку.
- WP Crontrol — расширенный инструмент для добавления, редактирования и удаления cron-задач.
- Advanced Cron Manager — удобный интерфейс и расширенные возможности по диагностике cron-задач.
Использование этих плагинов поможет быстро находить и исправлять проблемы с WP-Cron.
Заключение по использованию WP-Cron на wpconsult.ru
WP-Cron — мощный инструмент, который при правильной настройке позволяет автоматизировать множество задач в WordPress. Рекомендуется:
- Использовать системный cron для надёжности.
- Добавлять кастомные интервалы при необходимости.
- Использовать блокировки для предотвращения дублирующих запусков.
- Тестировать задачи и следить за логами.
Такой подход обеспечит стабильную работу сайта и эффективное выполнение фоновых процессов.