Что такое автоматические задачи (cron) в WordPress и зачем они нужны
Автоматические задачи в WordPress — это запланированные события, которые выполняются через определенные промежутки времени без участия пользователя. Они позволяют выполнять рутинные операции: отправку писем, очистку базы данных, обновление кэша, публикацию запланированного контента и многое другое.
Для реализации таких задач в WordPress используется встроенная система WP-Cron. Однако у неё есть особенности и ограничения, которые важно понимать, чтобы задачи выполнялись надежно и своевременно.
В этой статье мы подробно разберем, как создавать и управлять автоматическими задачами в WordPress с помощью собственного набора функций WPClass Cron, включая примеры кода и советы по отладке.
Основы работы с WP-Cron: как WordPress запускает задачи
WP-Cron — это имитация системного cron, которая запускается при каждом посещении сайта. То есть, если к сайту никто не заходит, задачи не будут запускаться. Это может привести к задержкам и нерегулярности выполнения.
Чтобы создать задачу, нужно зарегистрировать событие с помощью функции wp_schedule_event. Пример регистрации ежедневной задачи:
if ( !wp_next_scheduled( 'wpclass_daily_event' ) ) {
wp_schedule_event( time(), 'daily', 'wpclass_daily_event' );
}Здесь мы проверяем, не запланирована ли уже задача, и если нет — создаем её, чтобы она запускалась каждый день.
Далее нужно повесить функцию-обработчик на это событие:
add_action( 'wpclass_daily_event', 'wpclass_execute_daily_task' );
function wpclass_execute_daily_task() {
// Код задачи
}Это базовый принцип работы с WP-Cron. Однако у него есть недостатки, например, он зависит от посещений сайта и не подходит для точных временных задач.
Создание собственного планировщика с WPClass Cron
Чтобы расширить возможности и повысить надежность, мы создадим собственный класс, который будет:
- Управлять регистрацией и удалением cron задач;
- Позволять создавать задачи с кастомным интервалом;
- Обрабатывать ошибки и логировать выполнение;
- Поддерживать ручной запуск задач из админки.
Пример такого класса:
class WPClass_Cron {
public static function register_event( $hook, $interval = 'hourly' ) {
if ( ! wp_next_scheduled( $hook ) ) {
wp_schedule_event( time(), $interval, $hook );
}
}
public static function clear_event( $hook ) {
$timestamp = wp_next_scheduled( $hook );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, $hook );
}
}
public static function run_task( $hook, callable $callback ) {
add_action( $hook, $callback );
}
public static function log( $message ) {
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( '[WPClass Cron] ' . $message );
}
}
}Использование:
// Регистрируем задачу
WPClass_Cron::register_event( 'wpclass_hourly_event', 'hourly' );
// Обработчик задачи
WPClass_Cron::run_task( 'wpclass_hourly_event', function() {
// Ваш код задачи
WPClass_Cron::log( 'Hourly task executed' );
});Добавление кастомных интервалов в WP-Cron
По умолчанию WP-Cron поддерживает интервалы: hourly (часовой), twicedaily (два раза в день), daily (ежедневный). Если нужна своя частота, например, каждые 10 минут, можно добавить её через хук cron_schedules:
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 600 секунд = 10 минут
'display' => 'Каждые 10 минут'
);
return $schedules;
});Теперь при регистрации задачи можно использовать 'every_ten_minutes' в качестве интервала.
Ручной запуск и отладка cron задач
Иногда нужно протестировать задачу без ожидания cron. Для этого можно создать функцию, которая вызовет обработчик напрямую:
function wpclass_run_cron_task_now() {
do_action( 'wpclass_hourly_event' );
}
// Вызов
wpclass_run_cron_task_now();Для удобства можно добавить кнопку в админ-панель, которая будет запускать задачу одним кликом. Это облегчает отладку и проверку.
Также полезно вести логирование задач через error_log или использовать плагины для мониторинга WP-Cron, например, WP Crontrol.
Примеры практических задач с использованием WPClass Cron
Автоматическая очистка старых ревизий постов
Ревизии занимают место в базе данных и со временем могут замедлять сайт. Создадим задачу, которая удаляет ревизии старше 30 дней.
WPClass_Cron::register_event( 'wpclass_cleanup_revisions', 'daily' );
WPClass_Cron::run_task( 'wpclass_cleanup_revisions', function() {
global $wpdb;
$days = 30;
$deleted = $wpdb->query( $wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < NOW() - INTERVAL %d DAY",
$days
) );
WPClass_Cron::log( "Deleted $deleted old revisions" );
});Отправка рассылки подписчикам по расписанию
Для отправки новостей раз в неделю:
add_filter( 'cron_schedules', function( $schedules ) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => 'Еженедельно'
);
return $schedules;
});
WPClass_Cron::register_event( 'wpclass_weekly_newsletter', 'weekly' );
WPClass_Cron::run_task( 'wpclass_weekly_newsletter', function() {
// Логика отправки рассылки
WPClass_Cron::log( 'Weekly newsletter sent' );
});Устранение проблем с WP-Cron и альтернативные решения
Если задачи не запускаются, проверьте:
- Включена ли константа
DISABLE_WP_CRONвwp-config.php. Еслиtrue, встроенный WP-Cron отключен; - Настроен ли системный cron на вызов
wp-cron.phpчерез wget или curl; - Нет ли ошибок в коде обработчиков;
- Используются ли правильные интервалы и хуки.
Для критичных задач рекомендуют отключать встроенный WP-Cron и настраивать системный cron на сервере:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Это гарантирует запуск задач каждые 5 минут вне зависимости от посещаемости сайта.
Выводы и рекомендации
WP-Cron — мощный инструмент, но требует понимания работы и настройки. Используя собственный класс WPClass Cron, вы получаете удобный интерфейс для управления задачами, логирования и кастомных интервалов. Не забывайте про отладку и мониторинг, чтобы автоматические задачи работали стабильно и эффективно.