Как использовать WP-Cron для отложенных задач в WordPress: диагностика, настройка и проверка

Диагностика проблемы: почему WP-Cron не запускает задачи вовремя

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

Основные признаки проблем с WP-Cron:

  • Задачи выполняются с задержкой или не выполняются вовсе.
  • В логах или в базе данных постоянно накапливаются просроченные задачи.
  • Проблемы с плагинами, которые зависят от регулярных заданий (обновления, очистка кэша, отправка писем).

Как проверить, работает ли WP-Cron

Для диагностики можно использовать несколько подходов:

  • Плагин WP Crontrol — позволяет просмотреть и запустить запланированные задачи. Если задачи есть, но не выполняются, проблема в запуске WP-Cron.
  • Проверить, отключен ли WP-Cron вручную в wp-config.php через константу DISABLE_WP_CRON:
  • define('DISABLE_WP_CRON', true);
  • Запустить вручную вызов WP-Cron через браузер или командную строку:
  • wget -q -O - https://example.com/wp-cron.php?doing_wp_cron

Пошаговое решение: как настроить системный cron для запуска WP-Cron

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

  1. Отключите встроенный WP-Cron: в wp-config.php добавьте строку
    define('DISABLE_WP_CRON', true);
  2. Настройте системный cron: подключитесь к серверу по SSH и запустите редактор crontab:
    crontab -e
    Добавьте строку для запуска WP-Cron каждую минуту (можно реже, но 1 минута — оптимально):
    * * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
    Замените https://example.com на ваш домен.
  3. Проверьте права доступа: убедитесь, что ваш сервер позволяет выполнять wget или curl из cron.
  4. Альтернатива curl:
    * * * * * curl --silent https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

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

  • Войдите в админку WordPress и проверьте список запланированных задач через плагин WP Crontrol. Задачи должны выполняться вовремя, без задержек.
  • Отслеживайте логи сервера, чтобы убедиться в регулярном запуске wget или curl.
  • Проверьте функциональность плагинов и функций, зависящих от WP-Cron (например, автоматическое очищение кэша, отправка email-рассылок).

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

  • Ошибка: Забыл отключить встроенный WP-Cron — задачи запускаются дважды или конфликтуют.
    Исправление: Добавьте define('DISABLE_WP_CRON', true); в wp-config.php.
  • Ошибка: URL wp-cron.php неправильный или сайт недоступен из-под cron.
    Исправление: Проверьте URL, замените на актуальный, убедитесь, что нет блокировок по IP или firewall.
  • Ошибка: Сервер не имеет wget или curl, или права на запуск cron ограничены.
    Исправление: Используйте альтернативные способы запуска (php-cli), уточните у хостера права.
  • Ошибка: Кэширование страниц препятствует вызову wp-cron.php.
    Исправление: Настройте исключения для wp-cron.php в плагине кэширования.

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

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

Код для добавления собственной задачи в WP-Cron

Пример регистрации пользовательского события и его запуска каждые 10 минут:

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

function custom_cron_job() {
    // Ваш код, который должен выполняться по расписанию
    error_log('Custom cron job executed');
}

if (!wp_next_scheduled('custom_cron_hook')) {
    wp_schedule_event(time(), 'every_ten_minutes', 'custom_cron_hook');
}
add_action('custom_cron_hook', 'custom_cron_job');

Как проверить, что ваша задача работает

  • Посмотрите в логи сервера, если используете error_log() или аналог.
  • Используйте плагин WP Crontrol для просмотра запланированных и выполненных задач.
  • Добавьте отладочный вывод в код задачи (например, запись в файл или базу данных).
WooCommerce: решение проблем с неотображением вариаций товаров
23.05.2026
WooCommerce: автоматическое удаление товаров по срокам с помощью кода
04.05.2026
Как использовать хуки для динамического изменения заголовков страниц в WordPress
25.03.2026
Как использовать WooCommerce REST API для управления заказами
18.04.2026
Как создать автоматические обновления контента в WordPress с помощью Webhooks
15.03.2026