WP-Cron — это встроенный в WordPress механизм для выполнения запланированных задач. Его можно использовать для автоматизации рутинных процессов: от публикации отложенных записей до очистки базы данных и отправки уведомлений. В этой статье рассмотрим, как правильно использовать WP-Cron, как создавать свои задачи, как отлаживать и оптимизировать работу планировщика.
Что такое WP-Cron и как он работает
WP-Cron не является системным планировщиком, как cron в Unix-системах. Вместо этого он запускается при каждом посещении сайта — при загрузке любой страницы WordPress проверяет, есть ли запланированные задачи, срок которых наступил, и если да — выполняет их.
Из-за такой реализации есть важное ограничение: если на сайт долго не заходят, задачи могут задерживаться. Поэтому для высоконагруженных или малопосещаемых сайтов рекомендуют отключать WP-Cron и запускать системный cron.
WP-Cron хранит список задач в базе данных, в таблице options в опции cron. Задачи — это события с привязкой к времени и callback-функцией.
Как создавать и регистрировать свои задачи в WP-Cron
Чтобы добавить задачу в WP-Cron, нужно использовать функцию wp_schedule_event(). Она принимает три основных параметра: время первого запуска, интервал повторения и имя хука, который будет вызван.
Пример регистрации события, которое будет запускаться раз в час:
function wp_shablon_schedule_hourly_event() {
if ( ! wp_next_scheduled( 'wp_shablon_hourly_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wp_shablon_hourly_hook' );
}
}
add_action( 'wp', 'wp_shablon_schedule_hourly_event' );Далее нужно создать функцию-обработчик хука wp_shablon_hourly_hook:
function wp_shablon_do_hourly_task() {
// Ваш код, например, очистка кэша или отправка email
}
add_action( 'wp_shablon_hourly_hook', 'wp_shablon_do_hourly_task' );Важно проверять, не запланировано ли событие уже, чтобы не создавать дубликаты. Для этого и используется wp_next_scheduled().
Добавление кастомных интервалов для WP-Cron
В WordPress есть стандартные интервалы: 'hourly', 'twicedaily', 'daily'. Если нужно задать свой, добавьте фильтр:
function wp_shablon_custom_cron_intervals( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 5 минут в секундах
'display' => 'Каждые 5 минут'
);
return $schedules;
}
add_filter( 'cron_schedules', 'wp_shablon_custom_cron_intervals' );Теперь можно использовать интервал every_five_minutes при планировании задачи.
Примеры практического использования WP-Cron
Автоматическая очистка базы данных
Регулярная очистка таблиц и опций помогает поддерживать производительность. Создадим задачу для удаления устаревших записей в таблице мета:
function wp_shablon_cleanup_old_postmeta() {
global $wpdb;
$wpdb->query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key = '_wp_shablon_temp' AND meta_value < NOW() - INTERVAL 30 DAY" );
}
add_action( 'wp_shablon_daily_cleanup', 'wp_shablon_cleanup_old_postmeta' );
function wp_shablon_schedule_cleanup() {
if ( ! wp_next_scheduled( 'wp_shablon_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wp_shablon_daily_cleanup' );
}
}
add_action( 'wp', 'wp_shablon_schedule_cleanup' );Отправка напоминаний по email
Если у вас есть сайт с пользователями, можно настроить отправку еженедельных напоминаний:
function wp_shablon_send_weekly_reminders() {
$users = get_users( array( 'role' => 'subscriber' ) );
foreach ( $users as $user ) {
wp_mail( $user->user_email, 'Напоминание', 'Не забудьте проверить наш сайт!' );
}
}
add_action( 'wp_shablon_weekly_reminder', 'wp_shablon_send_weekly_reminders' );
function wp_shablon_schedule_weekly_reminder() {
if ( ! wp_next_scheduled( 'wp_shablon_weekly_reminder' ) ) {
wp_schedule_event( time(), 'weekly', 'wp_shablon_weekly_reminder' );
}
}
add_action( 'wp', 'wp_shablon_schedule_weekly_reminder' );Для работы интервала 'weekly' нужно добавить его через фильтр cron_schedules, аналогично примеру с 5 минутами.
Как отключить WP-Cron и использовать системный cron для повышения стабильности
Для сайтов с высокой нагрузкой или низкой посещаемостью рекомендуется отключать WP-Cron и запускать задания через системный планировщик.
Чтобы отключить WP-Cron, добавьте в wp-config.php:
define( 'DISABLE_WP_CRON', true );Далее создайте системную задачу в crontab на сервере, которая будет запускать WP-Cron раз в 15 минут:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или через curl:
*/15 * * * * curl -s https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Так вы гарантируете выполнение задач точно по расписанию без зависимости от посещаемости.
Отладка и мониторинг WP-Cron
Чтобы увидеть, какие задачи запланированы, можно использовать плагин WP Crontrol. Он позволяет просматривать, запускать вручную и редактировать задачи.
Если задачи не выполняются, проверьте, не блокирует ли сервер внешние запросы, так как WP-Cron использует HTTP-запрос к самому себе.
Для логирования выполнения задач можно добавить в обработчики запись в файл или использовать системные логи.
Резюме и рекомендации по использованию WP-Cron
WP-Cron — мощный инструмент для автоматизации, но требует понимания своих особенностей. Для небольших сайтов с постоянным трафиком встроенный WP-Cron работает отлично. Для серьезных проектов лучше перейти на системный cron.
Всегда проверяйте, что задачи не дублируются, добавляйте пользовательские интервалы и используйте плагины для мониторинга. Это поможет избежать проблем с производительностью и задержками в выполнении.
Для более расширенного управления кронами рекомендуем ознакомиться с плагинами и решениями на WPSHOP, где есть инструменты для оптимизации и расширения функционала WordPress.