Как использовать WP-Cron для запланированных задач в WordPress

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.

Как использовать REST API в WordPress для расширения функционала
14.11.2025
Как отключить автоматическое обновление WooCommerce без риска для сайта
20.04.2026
WooCommerce: как исправить ошибку дублирования SKU при импорте товаров
24.04.2026
WooCommerce: настройка подразделений магазина с разными складскими запасами
20.04.2026
Как автоматически редактировать изображения при загрузке в WordPress
16.03.2026