Как отключить WP-Cron и заменить его системным cron в WordPress

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

Если у вас уже есть симптомы вроде «запланированная запись вышла с опозданием», «очистка кэша срабатывает рывками» или «в wp-cron.php видно много обращений», имеет смысл отключить встроенный псевдокрон и перевести задачи на системный cron на сервере.

Когда WP-Cron мешает, а не помогает

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

  • запланированные публикации выходят с задержкой;
  • фоновые задачи запускаются несколько раз подряд при одновременных запросах;
  • на слабом хостинге wp-cron.php создаёт лишние пики нагрузки;
  • кэш или CDN маскируют реальные обращения, и расписание «просыпается» нерегулярно.

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

Проверять нужно не по ощущениям, а по фактам. Откройте список запланированных событий через WP-CLI, если он доступен:

wp cron event list

Если WP-CLI нет, посмотрите в админке поведение конкретных задач: публикации, очистка кэша, отправка очередей, резервные копии. Если они срабатывают только после посещения сайта или с заметной задержкой, это типичный признак зависимости от WP-Cron.

Дополнительно полезно посмотреть логи веб-сервера и убедиться, что wp-cron.php вызывается слишком часто или, наоборот, почти не вызывается. На некоторых сайтах это видно по множеству коротких запросов без полезной нагрузки.

Что меняем: схема с системным cron

Идея простая: WordPress перестаёт сам запускать WP-Cron при каждом визите, а сервер по расписанию обращается к wp-cron.php отдельно. Так вы контролируете частоту запусков и убираете зависимость от трафика.

Есть два рабочих подхода:

СпособЧто делаемПлюсыМинусы
Через кодОтключаем внутренний запуск WP-Cron в wp-config.phpПрозрачно, без лишних плагиновНужно иметь доступ к файлам и cron на сервере
Через плагинИспользуем плагин для управления cron-задачамиУдобно смотреть расписаниеСамо отключение WP-Cron всё равно делается на уровне конфигурации

Если задача только в замене механизма запуска, кодовый вариант обычно чище. Если нужно ещё и разбирать список событий, смотреть ошибки и вручную запускать задачи, можно временно подключить инструмент для диагностики, но не путать его с самой настройкой.

Пошаговая настройка

1. Отключите внутренний запуск WP-Cron

Откройте wp-config.php и добавьте строку выше комментария /* That's all, stop editing! */:

define( 'DISABLE_WP_CRON', true );

Это отключит автоматический запуск при обычных посещениях сайта. Сам файл wp-cron.php при этом остаётся доступным, и именно его будет вызывать системный cron.

2. Создайте задачу cron на сервере

На большинстве хостингов cron настраивается в панели управления. Если у вас есть доступ к shell, можно использовать обычный crontab. Пример запуска каждые 5 минут:

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

Замените example.com на ваш домен. Если сайт закрыт базовой авторизацией или ограничен по IP, этот способ может не подойти без дополнительной настройки доступа.

На некоторых серверах надёжнее использовать wget:

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

Интервал в 5 минут — распространённый рабочий вариант, но он не универсален. Если у вас много фоновых задач, интервал подбирают по фактической нагрузке и допустимой задержке публикаций. Ставить cron каждую минуту без причины обычно не нужно.

3. Проверьте, что сервер действительно вызывает cron

После настройки откройте список событий и убедитесь, что задачи исполняются по расписанию. Если есть WP-CLI:

wp cron event list

Смотрите на столбцы с ближайшим запуском и именем hook. Если задачи зависают в прошлом или не меняют статус после ожидаемого времени, значит вызов не проходит или блокируется.

Если WP-CLI нет, проверьте вручную:

  • создайте тестовую запланированную запись на 5–10 минут вперёд;
  • дождитесь времени публикации без захода в админку;
  • посмотрите, вышла ли запись вовремя;
  • проверьте логи сервера на наличие запросов к wp-cron.php.

Диагностика после внедрения

Самая частая ошибка — отключить WP-Cron и забыть настроить системный cron. В этом случае сайт выглядит нормально, но все фоновые задачи перестают выполняться. Поэтому после внедрения проверяйте не только публикации, но и всё, что завязано на расписание:

  • отложенные записи;
  • очистку транзиентов и кэша;
  • задачи плагинов резервного копирования;
  • рассылки и очереди уведомлений;
  • автообновления, если они используются.

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

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

Ставят cron слишком редко

Если запускать wp-cron.php раз в час, запланированные публикации и фоновые задачи будут опаздывать. Для большинства сайтов разумнее начинать с 5 минут и уже потом смотреть на нагрузку и точность.

Оставляют одновременно два механизма

Иногда системный cron настраивают, но DISABLE_WP_CRON не добавляют. Тогда WordPress продолжает запускать задачи при визитах, а сервер — ещё и по расписанию. Результат: дублирующиеся вызовы и лишняя нагрузка.

Используют неправильный URL

Если сайт работает на HTTPS, а cron стучится в HTTP-версию, возможны редиректы и лишние задержки. Если сайт в подкаталоге или за прокси, проверьте, что cron вызывает именно тот адрес, по которому WordPress доступен снаружи.

Блокируют доступ к wp-cron.php на уровне сервера

Иногда из соображений безопасности файл закрывают в .htaccess или правилах nginx, а потом удивляются, что задачи не работают. Полностью запрещать доступ нельзя, если вы всё ещё хотите запускать cron через HTTP. Лучше ограничивать частоту и следить за логами, а не ломать механизм.

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

Если сайт живёт на нагрузке, cron лучше запускать не через браузерный запрос с длинной цепочкой редиректов, а через прямой вызов конечного URL. Это уменьшает лишние переходы и делает поведение предсказуемее.

Ещё один полезный момент: не ставьте слишком много тяжёлых задач на одну и ту же минуту. Если несколько плагинов одновременно чистят кэш, пересчитывают индексы и отправляют письма, cron может упереться в лимиты PHP или базы. В таких случаях помогает разнести расписание по времени.

Если вы используете плагины, которые активно работают с отложенными задачами, имеет смысл периодически смотреть список cron-событий и удалять лишние записи от удалённых плагинов. Это уменьшает шум в расписании и снижает риск повторных ошибок.

Как проверить, что всё работает стабильно

После настройки не ограничивайтесь одной тестовой публикацией. Проверьте несколько сценариев подряд:

  1. создайте отложенную запись;
  2. дождитесь её публикации без ручного захода в админку;
  3. запустите задачу, которую использует ваш кэширующий или SEO-плагин;
  4. посмотрите, нет ли ошибок в логах PHP и веб-сервера;
  5. сравните время запуска до и после перехода на системный cron.

Если всё исполняется без задержек и без повторных запусков, схема настроена правильно. Если задачи всё ещё «засыпают», проблема может быть не в WP-Cron, а в блокировке исходящих запросов, ограничениях хостинга или ошибках в самих плагинах.

Для сайтов, где нужно ещё и чистить дубли, управлять SEO-настройками и убирать лишние системные запросы, иногда удобнее использовать набор инструментов вроде Clearfy Pro, но сам принцип замены WP-Cron на системный cron от этого не меняется: сначала отключаем внутренний запуск, потом даём серверу стабильное расписание.

Как удалить пустые вариации товара WooCommerce без ошибок
27.09.2026
Как решить проблему не удаления товаров из WooCommerce после их удаления
03.10.2026
Как отключить emoji в WordPress и убрать лишние скрипты из head
19.08.2026
Как использовать функцию wp_enqueue_script для добавления собственных скриптов в WordPress
02.10.2026
Как отключить XML-RPC в WordPress без срыва Jetpack и внешних сервисов
19.08.2026