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

Как работает WP‑Cron

WP‑Cron – это «виртуальный» планировщик задач, который запускается при каждом запросе к сайту. Вместо системного демона он проверяет список запланированных событий и, если время пришло, исполняет их. Этот механизм удобен для небольших проектов, но имеет ряд ограничений.

Плюсы встроенного планировщика

  • Не требует доступа к серверу (работает на любой хостинг).
  • Автоматически учитывает часовой пояс WordPress.
  • Легко расширяется через add_action() и wp_schedule_event().

Ключевые ограничения

  • Задания выполняются только при посещении сайта – при низком трафике они могут сильно задерживаться.
  • Каждый запрос проверяет всю очередь, что добавляет нагрузку и увеличивает TTFB.
  • Отсутствие точного контроля над временем выполнения.

Типичные проблемы WP‑Cron

Самые частые жалобы:

  1. Периодические задачи (очистка кэша, отправка писем) не срабатывают.
  2. Увеличение времени отклика сайта из‑за постоянных проверок.
  3. Конфликты с плагинами, которые пытаются переопределять расписание.

Для решения этих вопросов часто прибегают к отключению встроенного планировщика и настройке системного cron.

Как заменить WP‑Cron на системный cron

Самый надёжный способ – полностью отключить WP‑Cron и добавить задачу в crontab сервера. Это гарантирует точный запуск и минимизирует нагрузку.

Шаг 1. Отключаем встроенный планировщик

// В файле wp-config.php добавьте строку
define('DISABLE_WP_CRON', true);

После этого WordPress перестанет проверять очередь при каждом запросе.

Шаг 2. Добавляем системный cron

Выполните команду crontab -e и добавьте строку, которая будет вызывать wp-cron.php каждые 15 минут:

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

Замените example.com на ваш домен. Если у вас есть доступ к php-cli, предпочтительнее вызвать скрипт напрямую:

*/15 * * * * /usr/bin/php /path/to/wordpress/wp-cron.php >/dev/null 2>&1

Шаг 3. Проверяем работу

Создайте простое событие с помощью wp_schedule_event() и убедитесь, что оно отрабатывает в указанные интервалы. Для отладки используйте WP-CLI:

wp cron event list

Отключение и настройка WP‑Cron без системного доступа

Если у вас нет прав на сервер, можно ограничить нагрузку, не полностью отключая планировщик.

Уменьшаем частоту проверок

add_filter('cron_request', function($cron_request){
    // Запускаем только раз в 30 минут
    $cron_request['args']['timeout'] = 30;
    return $cron_request;
});

Удаляем «мусорные» задачи

С течением времени в базе накапливаются устаревшие события. Очистить их можно так:

// Удаляем все события, которые не имеют привязанных функций
wp_clear_scheduled_hook('my_unused_hook');

Перенос тяжёлых задач в очередь

Для отправки массовых email‑рассылок используйте плагины-бэкап или специализированные сервисы, а в WP‑Cron оставьте лишь «пуш‑уведомление» в очередь.

Альтернативные решения и лучшие практики

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

Плагин WP Crontrol

Позволяет управлять расписанием из админки, создавать пользовательские интервалы и удалять «залипающие» задачи.

Внешние сервисы (Action Scheduler, Easy Cron)

Action Scheduler – это библиотека, используемая WooCommerce, которая хранит задачи в базе и исполняет их последовательно, минимизируя нагрузку.

REST API + внешние таймеры

Можно создать собственный эндпоинт, который будет запускать нужные скрипты, а запускать его будет внешний сервис (например, REST API WordPress).

Best‑practice checklist

  • Отключите WP‑Cron, если ваш хостинг поддерживает системный crontab.
  • Регулярно проверяйте и чистите очередь через wp cron event list и wp cron event delete.
  • Используйте кастомные интервалы только при реальной необходимости.
  • Для тяжёлых задач применяйте фоновые очереди (Action Scheduler) или внешние сервисы.
  • Следите за производительностью: профилируйте влияние cron‑задач на мобильную версию сайта.

Соблюдая эти рекомендации, вы избавитесь от «залипания» задач, сократите время отклика и получите предсказуемую работу фоновых процессов.

Заключение

WP‑Cron – удобный инструмент, но в продакшене его часто заменяют системным cron или специализированными очередями. Отключив встроенный планировщик, настроив crontab и внедрив лучшие практики, вы получите надёжную и быструю работу сайта, независимо от уровня нагрузки.

❓ Часто задаваемые вопросы

Почему WP‑Cron не подходит для сайтов с высоким трафиком?

WP‑Cron запускается только при запросах к сайту. При большом числе задач и низком трафике они могут сильно задерживаться, а проверка очереди добавляет нагрузку на каждый запрос.

Как полностью отключить WP‑Cron без потери запланированных задач?

Добавьте в wp-config.php строку define('DISABLE_WP_CRON', true);. Затем создайте системный cron, который будет вызывать wp-cron.php в нужные интервалы.

Можно ли изменить интервал выполнения задач без плагинов?

Да, через код: используйте фильтр cron_schedules для добавления собственного интервала, а затем указывайте его в wp_schedule_event().

Что делать с «залипающими» задачами, которые уже не нужны?

С помощью WP‑CLI выполните wp cron event delete <hook_name> или используйте плагин WP Crontrol для удаления из админки.