Как создать автоматические задачи в WordPress с помощью WPClass Cron

Что такое автоматические задачи (cron) в WordPress и зачем они нужны

Автоматические задачи в WordPress — это запланированные события, которые выполняются через определенные промежутки времени без участия пользователя. Они позволяют выполнять рутинные операции: отправку писем, очистку базы данных, обновление кэша, публикацию запланированного контента и многое другое.

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

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

Основы работы с WP-Cron: как WordPress запускает задачи

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

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

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

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

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

add_action( 'wpclass_daily_event', 'wpclass_execute_daily_task' );

function wpclass_execute_daily_task() {
    // Код задачи
}

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

Создание собственного планировщика с WPClass Cron

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

  • Управлять регистрацией и удалением cron задач;
  • Позволять создавать задачи с кастомным интервалом;
  • Обрабатывать ошибки и логировать выполнение;
  • Поддерживать ручной запуск задач из админки.

Пример такого класса:

class WPClass_Cron {
    public static function register_event( $hook, $interval = 'hourly' ) {
        if ( ! wp_next_scheduled( $hook ) ) {
            wp_schedule_event( time(), $interval, $hook );
        }
    }

    public static function clear_event( $hook ) {
        $timestamp = wp_next_scheduled( $hook );
        if ( $timestamp ) {
            wp_unschedule_event( $timestamp, $hook );
        }
    }

    public static function run_task( $hook, callable $callback ) {
        add_action( $hook, $callback );
    }

    public static function log( $message ) {
        if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
            error_log( '[WPClass Cron] ' . $message );
        }
    }
}

Использование:

// Регистрируем задачу
WPClass_Cron::register_event( 'wpclass_hourly_event', 'hourly' );

// Обработчик задачи
WPClass_Cron::run_task( 'wpclass_hourly_event', function() {
    // Ваш код задачи
    WPClass_Cron::log( 'Hourly task executed' );
});

Добавление кастомных интервалов в WP-Cron

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

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

Теперь при регистрации задачи можно использовать 'every_ten_minutes' в качестве интервала.

Ручной запуск и отладка cron задач

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

function wpclass_run_cron_task_now() {
    do_action( 'wpclass_hourly_event' );
}

// Вызов
wpclass_run_cron_task_now();

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

Также полезно вести логирование задач через error_log или использовать плагины для мониторинга WP-Cron, например, WP Crontrol.

Примеры практических задач с использованием WPClass Cron

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

Ревизии занимают место в базе данных и со временем могут замедлять сайт. Создадим задачу, которая удаляет ревизии старше 30 дней.

WPClass_Cron::register_event( 'wpclass_cleanup_revisions', 'daily' );

WPClass_Cron::run_task( 'wpclass_cleanup_revisions', function() {
    global $wpdb;
    $days = 30;
    $deleted = $wpdb->query( $wpdb->prepare(
        "DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < NOW() - INTERVAL %d DAY",
        $days
    ) );
    WPClass_Cron::log( "Deleted $deleted old revisions" );
});

Отправка рассылки подписчикам по расписанию

Для отправки новостей раз в неделю:

add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['weekly'] = array(
        'interval' => 604800, // 7 дней в секундах
        'display'  => 'Еженедельно'
    );
    return $schedules;
});

WPClass_Cron::register_event( 'wpclass_weekly_newsletter', 'weekly' );

WPClass_Cron::run_task( 'wpclass_weekly_newsletter', function() {
    // Логика отправки рассылки
    WPClass_Cron::log( 'Weekly newsletter sent' );
});

Устранение проблем с WP-Cron и альтернативные решения

Если задачи не запускаются, проверьте:

  • Включена ли константа DISABLE_WP_CRON в wp-config.php. Если true, встроенный WP-Cron отключен;
  • Настроен ли системный cron на вызов wp-cron.php через wget или curl;
  • Нет ли ошибок в коде обработчиков;
  • Используются ли правильные интервалы и хуки.

Для критичных задач рекомендуют отключать встроенный WP-Cron и настраивать системный cron на сервере:

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

Это гарантирует запуск задач каждые 5 минут вне зависимости от посещаемости сайта.

Выводы и рекомендации

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

Как использовать Redis для кэширования в WordPress: настройка и примеры
09.02.2026
Как отфильтровывать и удалять спам-комментарии в WordPress по IP и User-Agent
05.02.2026
Оптимальный порядок загрузки скриптов и стилей в WordPress для улучшения производительности
21.12.2025
Как сделать отслеживание изменений в постах WordPress с помощью хуков
24.12.2025
Как установить разные верстки блоков Gutenberg в WordPress
01.01.2026