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

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

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

Диагностика проблем с WP-Cron

Частая проблема — задачи WP-Cron не выполняются вовремя или не запускаются вовсе. Основные причины:

  • Отсутствие посещений сайта — WP-Cron запускается только при загрузке страниц. Если трафика мало, задачи не выполняются.
  • Отключен WP-Cron в конфигурации (define('DISABLE_WP_CRON', true);)
  • Конфликты с плагинами или темами, мешающие корректной работе расписания.
  • Ошибки в самих хуках и callback-функциях.

Проверить наличие запланированных задач можно через плагин WP Crontrol или программно:

if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
    echo 'Задача не запланирована';
} else {
    echo 'Задача запланирована';
}

Как правильно создать и зарегистрировать задачу в WP-Cron

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

1. Добавляем интервал в расписание (если нужно нестандартный)

add_filter( 'cron_schedules', function( $schedules ) {
    if ( ! isset( $schedules['daily'] ) ) {
        $schedules['daily'] = [
            'interval' => 86400, // 24 часа
            'display'  => __( 'Ежедневно' ),
        ];
    }
    return $schedules;
});

2. Регистрируем событие при активации плагина или темы

register_activation_hook( __FILE__, function() {
    if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'my_custom_cron_hook' );
    }
});

3. Удаляем событие при деактивации

register_deactivation_hook( __FILE__, function() {
    $timestamp = wp_next_scheduled( 'my_custom_cron_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'my_custom_cron_hook' );
    }
});

4. Добавляем callback-функцию для выполнения задачи

add_action( 'my_custom_cron_hook', function() {
    global $wpdb;
    $table = $wpdb->prefix . 'custom_logs';
    $deleted = $wpdb->query( "DELETE FROM $table WHERE log_date < DATE_SUB(NOW(), INTERVAL 30 DAY)" );

    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log( "Очистка логов: удалено записей - $deleted" );
    }
});

Переход на системный cron для надежности

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

  • В wp-config.php добавьте: define('DISABLE_WP_CRON', true);
  • Добавьте в крон-сервере (crontab) задачу, которая будет запускать WP-Cron каждые 5-10 минут:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
<

Замените https://example.com на адрес вашего сайта.

Проверка результата работы cron-задачи

Чтобы убедиться, что задача работает:

  • Проверьте наличие задачи в wp-cron.php через WP Crontrol или код.
  • Добавьте в callback функцию error_log() для логирования выполнения.
  • Проверьте логи сервера, если настроен системный cron.
  • Тестируйте вручную запуск задачи с помощью:
do_action( 'my_custom_cron_hook' );

Частые ошибки при работе с WP-Cron и их исправления

  • Ошибка: Задача не запускается из-за отключенного WP-Cron.
    Решение: Убедитесь, что в wp-config.php нет или отключена константа DISABLE_WP_CRON.
  • Ошибка: Низкий трафик и задачи не выполняются.
    Решение: Настройте системный cron на сервере.
  • Ошибка: Callback-функция вызывает ошибки и прерывает выполнение.
    Решение: Оберните код в try-catch или добавьте проверку данных, используйте error_log для отладки.
  • Ошибка: Несоответствие интервалов повторного запуска.
    Решение: Проверьте регистрацию интервалов через фильтр cron_schedules.

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

  • Ограничьте доступ к wp-cron.php по IP, если используете системный cron, чтобы исключить сторонние запросы.
  • Избегайте тяжелых и долгих операций в cron-задачах — лучше разбивать задачи на части.
  • Используйте transient API для кеширования результатов, если задачи повторяются с небольшими изменениями.
  • Регулярно проверяйте и очищайте устаревшие задачи через WP Crontrol.

Сравнение способов запуска cron-задач в WordPress

МетодПлюсыМинусы
Встроенный WP-Cron (по загрузке страниц)Простота, не требует настройки сервераЗависимость от трафика, задержки в запуске
Системный cron + WP-Cron отключенТочный и надежный запуск, меньше нагрузки на сайтТребует доступа к серверу и настройки crontab
Плагины для управления задачами (например, WP Crontrol)Удобный интерфейс, мониторинг и управлениеДополнительная нагрузка, зависит от WP-Cron
Как отключить XML sitemap в WordPress и не сломать индексацию
22.08.2026
Как закрыть дубли архивов от меток noindex в WordPress
19.08.2026