DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

WordPress: как настроить системный cron вместо WP-Cron

WordPress: как настроить системный cron вместо WP-Cron

WordPress: как настроить системный cron вместо WP-Cron

Если у вас wordpress wp cron не выполняется , не отправляются письма, не работает импорт, не публикуются отложенные записи — вы упёрлись в архитектурное ограничение WP-Cron.

В продакшене на VPS с nginx это лечится правильно: отключаем псевдо-cron WordPress и переводим задачи на системный cron Linux.

В конце получите:

✔ WP-Cron отключён

✔ системный cron настроен

✔ задачи выполняются стабильно и предсказуемо

Сниппеты по статье: Отключение WP-Cron (wp-config) · Crontab для wp-cron.php · Проверка событий (wp cron event list) · Вызов wp-cron по HTTP (curl)


В чём проблема

Реальный симптом

  • Заказы WooCommerce не обрабатываются
  • wp_mail() не отправляет письма
  • Отложенные посты зависают
  • Импорт через wp_schedule_event не запускается

Почему это происходит

WP-Cron — это не настоящий cron.

Он запускается только при HTTP-запросе к сайту.

Механика (по документации WordPress):

  1. При загрузке страницы WordPress проверяет опцию cron.
  2. Если есть просроченные задачи — выполняет wp-cron.php.
  3. Если трафика нет — задачи не выполняются.

На проде это приводит к:

  • задержкам
  • гонкам процессов
  • зависанию задач при высокой нагрузке
  • полному отсутствию выполнения на малопосещаемых сайтах

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

  1. Проверяем запланированные события:

wp cron event list

Enter fullscreen mode Exit fullscreen mode

Если видите старые timestamps — задачи не выполняются.

  1. Проверяем вручную:

curl https://example.com/wp-cron.php?doing\_wp\_cron

Enter fullscreen mode Exit fullscreen mode

Если ничего не происходит — cron завис.

  1. Проверяем опцию:

wp option get cron

Enter fullscreen mode Exit fullscreen mode

Если там старые даты — всё очевидно.


Рабочее решение

Шаг 1. Отключаем WP-Cron

Готовый фрагмент и пояснения: сниппет «Отключение WP-Cron в wp-config». Ниже — кратко.

Файл:


/var/www/site/public\_html/wp-config.php

Enter fullscreen mode Exit fullscreen mode

Добавляем строку:


define('DISABLE\_WP\_CRON', true);

Enter fullscreen mode Exit fullscreen mode

Это официально рекомендуемый способ (WordPress documentation).

Важно:

Добавлять до строки


/ _That's all, stop editing!_ /

Enter fullscreen mode Exit fullscreen mode

Шаг 2. Проверяем путь к PHP

На VPS:


which php

Enter fullscreen mode Exit fullscreen mode

Обычно:


/usr/bin/php

Enter fullscreen mode Exit fullscreen mode

Если используется PHP-FPM 8.x, путь может быть:


/usr/bin/php8.2

Enter fullscreen mode Exit fullscreen mode

Шаг 3. Настраиваем системный cron

Полная строка и варианты расписания: сниппет «Crontab для wp-cron.php». Ниже — базовая настройка.

Открываем cron текущего пользователя:


crontab -e

Enter fullscreen mode Exit fullscreen mode

Добавляем строку:


_/5_ \* /usr/bin/php /var/www/site/public\_html/wp-cron.php > /dev/null 2>&1

Enter fullscreen mode Exit fullscreen mode

Разбор:

  • */5 — каждые 5 минут
  • полный путь к php
  • полный путь к wp-cron.php
  • вывод в null (без мусора в почту)

Если сайт крупный — можно поставить раз в минуту:


- /usr/bin/php /var/www/site/public\_html/wp-cron.php > /dev/null 2>&1

Enter fullscreen mode Exit fullscreen mode

Альтернатива через HTTP (если нет CLI PHP)

Сниппет «Вызов wp-cron по HTTP (curl)»:


_/5_ \* curl -s https://example.com/wp-cron.php?doing\_wp\_cron > /dev/null 2>&1

Enter fullscreen mode Exit fullscreen mode

Но CLI-вариант надёжнее.


Шаг 4. Проверяем, что cron добавился


crontab -l

Enter fullscreen mode Exit fullscreen mode

Должна быть ваша строка.


Проверка результата

Проверка выполнения задач

Через 5–10 минут (сниппет «Проверка событий wp cron event list»):


wp cron event list

Enter fullscreen mode Exit fullscreen mode

Временные метки должны обновляться.


Проверка логов nginx

Файл:


/var/log/nginx/access.log

Enter fullscreen mode Exit fullscreen mode

Если используете HTTP-вариант — должны появляться обращения к wp-cron.php.


Принудительный запуск


wp cron event run --due-now

Enter fullscreen mode Exit fullscreen mode

Если выполняется без ошибок — система рабочая.


Диагностика, если не работает

  1. Проверяем пользователя cron

ps aux | grep cron

Enter fullscreen mode Exit fullscreen mode

Если cron работает от root, а сайт принадлежит www-data — могут быть проблемы с правами.

Лучше добавить cron от того же пользователя, под которым работает сайт.


  1. Проверяем права доступа

ls -la wp-cron.php

Enter fullscreen mode Exit fullscreen mode

Файл должен быть читаемым для пользователя cron.


  1. Проверяем SELinux (если включён)

На CentOS:


getenforce

Enter fullscreen mode Exit fullscreen mode

Если Enforcing — временно проверить:


setenforce 0

Enter fullscreen mode Exit fullscreen mode

Если после этого заработало — проблема в политике.


Типичные ошибки

❌ Оставили WP-Cron включённым

Причина: забыли добавить DISABLE_WP_CRON.

Результат: двойной запуск задач.

Исправление: проверить wp-config.php.


❌ Указан неверный путь к PHP

Причина: в системе несколько версий.

Проверка:


php -v

which php

Enter fullscreen mode Exit fullscreen mode

Исправление: указать полный корректный путь.


❌ Неверный путь к wp-cron.php

Причина: указали относительный путь.

Нужно:


/var/www/site/public\_html/wp-cron.php

Enter fullscreen mode Exit fullscreen mode

❌ Cron добавлен, но не выполняется

Проверить:


systemctl status cron

Enter fullscreen mode Exit fullscreen mode

или


systemctl status crond

Enter fullscreen mode Exit fullscreen mode

Если не запущен:


systemctl start cron

Enter fullscreen mode Exit fullscreen mode

Где применять

  • ✔ Production VPS
  • ✔ Nginx
  • ✔ WooCommerce
  • ✔ Импортёры
  • ✔ Интеграции
  • ✔ CI/CD деплой после миграции

Не применять:

  • Локальная разработка
  • Docker-контейнер без supervisor
  • Shared hosting без доступа к cron

Когда это критично

  • Малый трафик
  • Email-воронки
  • Платежи
  • REST-интеграции
  • Webhook-обработчики

Если wp cron не выполняется — это не баг WordPress.

Это неправильная эксплуатация.


Дополнительные материалы


Итог

Если wordpress wp cron не выполняется , не надо искать плагины-костыли.

Правильный прод-подход:

  1. Отключить WP-Cron
  2. Настроить системный cron
  3. Проверить выполнение

После этого:

  • письма отправляются
  • импорт работает
  • отложенные записи публикуются
  • задачи выполняются стабильно

И главное — поведение становится предсказуемым.

В продакшене псевдо-cron не место.

Read more on viku-lov.ru

Top comments (0)