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

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

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

В отличие от системного cron на сервере, WP-Cron запускается при каждом посещении сайта, поэтому его работа зависит от трафика.

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

Частые симптомы проблем с WP-Cron:

  • Автоматические задачи не выполняются вовремя или не выполняются вовсе.
  • Отсутствие обновления или очистки данных, которые должны обновляться по расписанию.
  • Ошибки в логах, связанные с wp-cron.php.

Чтобы проверить, работает ли WP-Cron, можно добавить простой код в functions.php вашей темы:

add_action('init', function() {
    if (!wp_next_scheduled('my_test_event')) {
        wp_schedule_event(time(), 'hourly', 'my_test_event');
    }
});
add_action('my_test_event', function() {
    error_log('WP-Cron event fired at ' . current_time('mysql'));
});

Зайдите на сайт и проверьте файл debug.log (нужно включить логирование ошибок), появятся ли записи. Если нет — WP-Cron не срабатывает.

Пошаговое решение: как настроить и отладить WP-Cron

1. Проверка и включение WP-Cron

Убедитесь, что в wp-config.php нет строки define('DISABLE_WP_CRON', true);. Если есть — удалите или закомментируйте её.

2. Создание собственного события WP-Cron

Пример: задача для очистки устаревших записей кастомного типа каждые 12 часов.

function clear_old_custom_posts() {
    $args = [
        'post_type' => 'my_custom_post',
        'date_query' => [
            [
                'before' => '30 days ago',
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];
    $query = new WP_Query($args);
    foreach ($query->posts as $post_id) {
        wp_delete_post($post_id, true);
    }
}

add_action('clear_old_custom_posts_hook', 'clear_old_custom_posts');

if (!wp_next_scheduled('clear_old_custom_posts_hook')) {
    wp_schedule_event(time(), 'twicedaily', 'clear_old_custom_posts_hook');
}

3. Использование системного cron для надежности

WP-Cron зависит от посещений сайта, что нежелательно для проектов с низким трафиком. Можно отключить WP-Cron и настроить системный cron на сервере:

  • В wp-config.php добавить: define('DISABLE_WP_CRON', true);
  • Добавить в crontab сервера команду:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Эта команда запускает WP-Cron каждую минуту. Замените https://example.com на адрес вашего сайта.

Проверка результата после внедрения

  • Включите логирование ошибок в WordPress (define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); в wp-config.php).
  • Добавьте в функцию cron запись в лог (см. пример выше с error_log).
  • Проверьте файл wp-content/debug.log на предмет появления записей о выполнении задачи.
  • Проверьте изменение данных, которые должна обрабатывать задача (например, удаление старых записей).

Частые ошибки и как их исправить

  • DISABLE_WP_CRON установлен в true: WP-Cron не запускается. Решение — отключить эту константу.
  • Системный cron не настроен при отключенном WP-Cron: задачи не выполняются, если нет посещений сайта. Решение — настроить системный cron на сервере.
  • Неправильное использование хуков: функция должна быть подключена к add_action с правильным именем события.
  • Повторное создание задачи без проверки: вызывает дублирующиеся задачи. Всегда проверяйте wp_next_scheduled() перед созданием.
  • Ошибки в теле функции cron: могут приводить к прерыванию работы. Рекомендуется обрабатывать ошибки и использовать логи.

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

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

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

ВариантПлюсыМинусыРекомендуется для
Встроенный WP-CronНе требует настройки сервера, прост в использованииЗависит от посещаемости сайта, может не сработать вовремяСайты с хорошим трафиком и простыми задачами
Системный cron (через crontab)Надежный, запускается в точное времяТребует доступа к серверу и настроекСайты с низкой посещаемостью или критичными задачами
Как отключить XML Sitemap в WordPress без плагинов
07.04.2026
Автоматическое обновление стоимости товара в WooCommerce при изменении атрибутов
18.04.2026
Как сделать отложенный запуск WP-Cron без зависаний и проблем
28.05.2026
Создать Custom Post Type в WordPress: пошаговое руководство
25.11.2025
Автоматическое создание Sitemap XML в WordPress: практическое руководство
15.02.2026