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

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

Что такое WP-Cron и зачем он нужен в WordPress

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

Основные преимущества WP-Cron:

  • Не требует доступа к серверным настройкам.
  • Легко создавать и управлять событиями через код.
  • Подходит для большинства задач автоматизации на WordPress.

Но есть и недостаток — при низкой посещаемости сайта задачи могут срабатывать с задержкой. Для решения этой проблемы можно настроить системный cron, который будет вызывать wp-cron.php регулярно, но это тема для отдельного материала.

Типичные задачи для автоматизации с помощью WP-Cron

WP-Cron отлично подходит для следующих сценариев:

  • Отправка регулярных email-рассылок.
  • Автоматическое обновление контента или данных.
  • Очистка базы данных от устаревших записей.
  • Создание резервных копий.
  • Публикация отложенных записей.

Рассмотрим на практике, как создавать и управлять такими задачами.

Как добавить собственное запланированное событие в WP-Cron

Для начала нужно зарегистрировать новое событие и функцию, которая будет выполняться при его запуске.

Пример кода для регистрации ежечасного события, которое выполняет функцию wpone_hourly_task:

function wpone_register_cron_event() {
    if ( ! wp_next_scheduled( 'wpone_hourly_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'wpone_hourly_event' );
    }
}
add_action( 'wp', 'wpone_register_cron_event' );

function wpone_hourly_task() {
    // Ваш код, который должен выполняться каждый час
    error_log('WPOne: Ежечасная задача выполнена');
}
add_action( 'wpone_hourly_event', 'wpone_hourly_task' );

Ключевые моменты:

  • wp_schedule_event — регистрирует новое событие, если оно еще не запланировано.
  • wp_next_scheduled — проверяет, есть ли уже запланированное событие.
  • add_action — связывает событие и функцию, которая будет выполняться.

Этот код нужно добавить в файл functions.php вашей темы или в плагин.

Добавление пользовательских интервалов для WP-Cron

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

Пример добавления интервала в 10 минут:

function wpone_custom_cron_schedules( $schedules ) {
    $schedules['every_ten_minutes'] = array(
        'interval' => 600, // 600 секунд = 10 минут
        'display'  => __( 'Каждые 10 минут' ),
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'wpone_custom_cron_schedules' );

После этого можно использовать 'every_ten_minutes' при планировании событий:

wp_schedule_event( time(), 'every_ten_minutes', 'wpone_ten_minute_event' );

Пример: Автоматическая очистка таблиц постов с меткой "черновик" старше 30 дней

Задача: автоматически удалять записи со статусом "черновик", которые не обновлялись более месяца.

function wpone_cleanup_old_drafts() {
    global $wpdb;
    $threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
    $deleted = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $wpdb->posts WHERE post_status = %s AND post_modified < %s",
            'draft',
            $threshold
        )
    );
    error_log('WPOne: Удалено старых черновиков: ' . $deleted);
}

// Планируем запуск один раз в сутки
function wpone_setup_cleanup_cron() {
    if ( ! wp_next_scheduled( 'wpone_cleanup_drafts_event' ) ) {
        wp_schedule_event( time(), 'daily', 'wpone_cleanup_drafts_event' );
    }
}
add_action( 'wp', 'wpone_setup_cleanup_cron' );
add_action( 'wpone_cleanup_drafts_event', 'wpone_cleanup_old_drafts' );

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

Полезные плагины для управления WP-Cron

Если хочется удобного интерфейса для работы с WP-Cron, рекомендую несколько плагинов:

  • WP Crontrol — позволяет просматривать, добавлять, удалять и запускать запланированные события прямо из админки.
  • Crony Cronjob Manager — простой менеджер для создания и контроля cron-задач.
  • Advanced Cron Manager — расширенный интерфейс с возможностью экспорта и импорта задач.

Эти инструменты полезны для отладки и мониторинга работы автоматизации.

Советы по работе с WP-Cron на реальных проектах

1. Учитывайте нагрузку на сервер. Частые cron-задачи могут замедлять сайт, особенно если они тяжелые — старайтесь оптимизировать функции.

2. Используйте системный cron при больших нагрузках. Если сайт посещают редко, WP-Cron может не срабатывать вовремя. В этом случае настройте системный cron, который будет вызывать wp-cron.php.

3. Обрабатывайте ошибки внутри задач. Используйте логирование и обработку исключений, чтобы понимать, почему задачи могут не выполняться.

4. Удаляйте ненужные cron-события. Если вы удаляете плагин или функцию, не забывайте очищать планировщик.

Как удалить запланированное событие

function wpone_clear_cron_event() {
    $timestamp = wp_next_scheduled( 'wpone_hourly_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpone_hourly_event' );
    }
}
// Вызовите эту функцию при деактивации плагина или по необходимости
Как удалить неиспользуемые роли и права в WordPress без рисков
04.02.2026
Как отладить проблемы со скрытым кодом в WordPress
09.12.2025
Как использовать REST API WordPress для создания собственных приложений
13.11.2025
Создание многоязычного сайта на WordPress с помощью Polylang
19.02.2026
Как использовать PHPMailer в WordPress для отправки писем с кастомными настройками
05.03.2026