Как создать автоматические задания в WordPress через WP-Cron и wp_schedule_event

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

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

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

WP-Cron позволяет регистрировать задачи, которые будут запускаться через определённый интервал или в определённое время. Функция wp_schedule_event служит для регистрации таких событий.

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

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

Регистрация и создание задачи через wp_schedule_event

Чтобы создать автоматическую задачу, нужно зарегистрировать событие с помощью wp_schedule_event. Синтаксис следующий:

wp_schedule_event( int $timestamp, string $recurrence, string $hook, array $args = array() )

Где:

  • $timestamp — время первого запуска в формате UNIX timestamp;
  • $recurrence — периодичность, например, 'hourly', 'daily', 'twicedaily' или пользовательский интервал;
  • $hook — имя хука, который будет вызван при выполнении задачи;
  • $args — аргументы для хука (необязательно).

Пример простой регистрации задачи, которая будет запускаться раз в час:

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

Здесь мы проверяем, не запланировано ли уже событие с таким хуком, и если нет — создаём его. Обратите внимание, что вызываем функцию при событии wp, чтобы WordPress загрузился полностью.

Обработка события — добавляем хук

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

function wpin_hourly_event_function() {
    // Ваш код, например, очистка кеша, отправка отчетов и т.д.
    error_log('WPIN: Ежечасное задание выполнено');
}
add_action( 'wpin_hourly_event_hook', 'wpin_hourly_event_function' );

В этом примере при запуске задачи в лог будет записываться строка. На практике сюда можно поместить любую логику.

Добавление собственного интервала повторения

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

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

Теперь можно использовать 'every_ten_minutes' в wp_schedule_event:

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

Отмена и удаление запланированных задач

Иногда нужно отменить запланированное событие, например, при деактивации плагина. Для этого используется функция wp_clear_scheduled_hook:

function wpin_clear_scheduled_events() {
    wp_clear_scheduled_hook( 'wpin_hourly_event_hook' );
    wp_clear_scheduled_hook( 'wpin_ten_minute_event_hook' );
}
register_deactivation_hook( __FILE__, 'wpin_clear_scheduled_events' );

Это удалит все запланированные вызовы хука, что предотвратит дальнейшее выполнение задачи.

Практические советы по работе с WP-Cron

1. Используйте wp_next_scheduled для проверки

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

2. Помните о запуске WP-Cron

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

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

3. Логируйте действие для отладки

При разработке полезно писать сообщения в лог с помощью error_log или использовать плагины для мониторинга cron-задач.

4. Не перегружайте WP-Cron тяжёлыми задачами

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

Пример: Автоматическая очистка старых ревизий постов

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

function wpin_cleanup_post_revisions() {
    global $wpdb;
    $days = 30; // удалять ревизии старше 30 дней
    $timestamp = current_time( 'mysql', 1 );
    $sql = $wpdb->prepare(
        "DELETE FROM $wpdb->posts WHERE post_type = 'revision' AND post_modified < DATE_SUB(%s, INTERVAL %d DAY)",
        $timestamp, $days
    );
    $deleted = $wpdb->query( $sql );
    if ( $deleted !== false ) {
        error_log("WPIN: Удалено $deleted старых ревизий");
    }
}

function wpin_schedule_weekly_cleanup() {
    if ( ! wp_next_scheduled( 'wpin_weekly_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'weekly', 'wpin_weekly_cleanup_hook' );
    }
}
add_action( 'wp', 'wpin_schedule_weekly_cleanup' );
add_action( 'wpin_weekly_cleanup_hook', 'wpin_cleanup_post_revisions' );

Этот код добавит еженедельное задание по удалению ревизий старше 30 дней и логирует результат.

Рекомендованные плагины для работы с WP-Cron

Если не хотите писать код вручную, можно использовать плагины, которые помогают управлять cron-задачами:

  • WP Crontrol — мощный инструмент для просмотра, редактирования, удаления и добавления cron-задач через админку.
  • Clearfy Pro — оптимизационный плагин, который умеет управлять и отключать ненужные cron-задания, улучшая производительность.

Выводы и лучшие практики

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

Для комплексного контроля рекомендуем использовать плагин WP Crontrol, а для оптимизации — Clearfy Pro. Если сервер позволяет, настройте системный cron для более точного запуска задач.

Следуя этим рекомендациям, вы сможете эффективно автоматизировать рутинные задачи и улучшить производительность вашего сайта на WordPress.

Регистрация пользователей по ролям в WordPress: практическое руководство
15.12.2025
Как удалить старые темы в WordPress без риска для сайта
13.04.2026
WooCommerce: как избежать проблем с отсутствием вариантов товаров
24.07.2026
Как удалить неиспользуемые таблицы в базе данных WordPress
01.12.2025
Как добавить автоматическое удаление спам комментариев в WordPress
21.12.2025