Как использовать WP-Cron для автоматизации задач в WordPress

WP-Cron — это встроенная в WordPress система имитации планировщика задач, которая позволяет запускать запланированные события без необходимости настраивать системный cron на сервере. Использование WP-Cron помогает автоматизировать рутинные задачи на сайте, такие как публикация отложенных записей, обновление кэша или отправка уведомлений.

Что такое WP-Cron и как он работает

WP-Cron — это псевдо-cron, который срабатывает при посещении сайта. Когда пользователь заходит на сайт, WordPress проверяет, есть ли задачи, срок выполнения которых наступил, и запускает их. Это значит, что WP-Cron не работает постоянно в фоне, а активируется только при заходе посетителя. Из-за этого на сайтах с низкой посещаемостью расписание задач может выполняться с задержками.

Для проверки запланированных задач можно использовать функцию wp_get_scheduled_event() или плагин WP Crontrol.

Создание и регистрация задания в WP-Cron

Чтобы создать собственное запланированное событие, нужно зарегистрировать хук и задать интервал выполнения.

Добавление пользовательского интервала срабатывания

По умолчанию WordPress поддерживает интервалы: hourly (час), twicedaily (два раза в день), daily (ежедневно). Для других интервалов добавим свой:

add_filter('wpcontent_custom_cron_schedules', 'wpcontent_add_custom_cron_interval');
function wpcontent_add_custom_cron_interval($schedules) {
    $schedules['every_five_minutes'] = array(
        'interval' => 300, // 5 минут в секундах
        'display' => __('Каждые 5 минут')
    );
    return $schedules;
}

Этот фильтр добавляет интервал в 5 минут.

Регистрация события и его обработчика

Далее регистрируем событие и функцию-обработчик:

// При активации плагина или темы
if (!wp_next_scheduled('wpcontent_five_minute_event')) {
    wp_schedule_event(time(), 'every_five_minutes', 'wpcontent_five_minute_event');
}

// Хук для выполнения задачи
add_action('wpcontent_five_minute_event', 'wpcontent_do_five_minute_task');

function wpcontent_do_five_minute_task() {
    // Здесь логика задачи, например, очистка временных данных
    error_log('WP-Cron: выполнена задача каждые 5 минут');
}

Здесь wp_schedule_event() планирует задачу, а функция wpcontent_do_five_minute_task() выполняется при срабатывании события.

Отладка и управление WP-Cron

Для удобства мониторинга и управления задачами рекомендуем использовать плагин WP Crontrol. С ним можно просматривать все запланированные события, запускать их вручную, удалять или создавать новые без кода.

Также полезно знать, что WP-Cron может не срабатывать, если на сайте нет посетителей. Для критичных задач лучше настроить системный cron на сервере и отключить WP-Cron, добавив в wp-config.php строку:

define('DISABLE_WP_CRON', true);

А затем создать задачу в системном cron, которая будет запускать WP-Cron по URL сайта:

* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Практические примеры использования WP-Cron

Автоматическое удаление старых записей из пользовательской таблицы

Предположим, у вас есть таблица с логами, и нужно регулярно очищать записи старше 30 дней.

add_action('wpcontent_cleanup_old_logs', 'wpcontent_delete_old_logs');

function wpcontent_delete_old_logs() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'custom_logs';
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));
    $wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE log_date < %s", $date));
}

Задачу можно запланировать, например, на ежедневный запуск:

if (!wp_next_scheduled('wpcontent_cleanup_old_logs')) {
    wp_schedule_event(time(), 'daily', 'wpcontent_cleanup_old_logs');
}

Отправка email-уведомлений о новых комментариях

Если нужно посылать письмо раз в час с отчетом о новых комментариях, можно собрать комментарии в транзиент и отправлять по расписанию.

Пример хранения новых комментариев:

add_action('comment_post', 'wpcontent_store_new_comment');
function wpcontent_store_new_comment($comment_ID) {
    $comments = get_transient('wpcontent_new_comments') ?: array();
    $comments[] = $comment_ID;
    set_transient('wpcontent_new_comments', $comments, HOUR_IN_SECONDS);
}

И отправка письма по расписанию:

add_action('wpcontent_send_comment_report', 'wpcontent_send_comment_report_function');

function wpcontent_send_comment_report_function() {
    $comments = get_transient('wpcontent_new_comments');
    if (empty($comments)) return;

    $message = "Новые комментарии за последний час:\n";
    foreach ($comments as $comment_id) {
        $comment = get_comment($comment_id);
        $message .= "- " . $comment->comment_author . ": " . $comment->comment_content . "\n";
    }

    wp_mail('admin@example.com', 'Отчет о новых комментариях', $message);
    delete_transient('wpcontent_new_comments');
}

if (!wp_next_scheduled('wpcontent_send_comment_report')) {
    wp_schedule_event(time(), 'hourly', 'wpcontent_send_comment_report');
}

Рекомендации по оптимизации и безопасности WP-Cron

WP-Cron может создавать нагрузку, если задачи тяжелые или слишком частые. Рекомендуется:

  • Минимизировать количество однотипных задач.
  • Использовать системный cron для критичных и частых задач.
  • Отслеживать выполнение через логи и плагины.
  • Ограничивать права функций, выполняемых по cron, чтобы избежать уязвимостей.

Также избегайте запуска долгих задач, которые могут превышать лимиты времени PHP.

Заключение

WP-Cron — мощный инструмент автоматизации в WordPress, который при правильной настройке и использовании облегчает управление сайтом и расширяет его функциональность. Благодаря простоте добавления собственных событий и возможности гибкой настройки расписания, он подходит как для новичков, так и для опытных разработчиков.

Как удалить неиспользуемые метаданные в WordPress без перегрузки базы данных
19.12.2025
Как удалить наследуемые виджеты в WordPress
26.03.2026
Как массово обновить атрибуты товаров WooCommerce через код
12.06.2026
Решение проблемы неработающего обновления товаров WooCommerce при использовании кэширования
16.05.2026
Решение проблемы неработающего фильтра товаров WooCommerce по атрибутам
02.06.2026