WordPress: как настроить системный cron вместо WP-Cron
Пошаговое решение проблемы неработающих задач WP-Cron: отключение, настройка системного cron на VPS и проверка выполнения.
Требования
- WordPress 6.x
- Доступ по SSH к VPS
- Понимание работы cron в Linux
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):
- При загрузке страницы WordPress проверяет опцию
cron. - Если есть просроченные задачи — выполняет
wp-cron.php. - Если трафика нет — задачи не выполняются.
На проде это приводит к:
- задержкам
- гонкам процессов
- зависанию задач при высокой нагрузке
- полному отсутствию выполнения на малопосещаемых сайтах
Как проверить, что WP-Cron не работает
- Проверяем запланированные события:
wp cron event list
Если видите старые timestamps — задачи не выполняются.
- Проверяем вручную:
curl https://example.com/wp-cron.php?doing_wp_cron
Если ничего не происходит — cron завис.
- Проверяем опцию:
wp option get cron
Если там старые даты — всё очевидно.
Рабочее решение
Шаг 1. Отключаем WP-Cron
Готовый фрагмент и пояснения: сниппет «Отключение WP-Cron в wp-config». Ниже — кратко.
Файл:
/var/www/site/public_html/wp-config.php
Добавляем строку:
define('DISABLE_WP_CRON', true);
Это официально рекомендуемый способ (WordPress documentation).
Важно: Добавлять до строки
/* That's all, stop editing! */
Шаг 2. Проверяем путь к PHP
На VPS:
which php
Обычно:
/usr/bin/php
Если используется PHP-FPM 8.x, путь может быть:
/usr/bin/php8.2
Шаг 3. Настраиваем системный cron
Полная строка и варианты расписания: сниппет «Crontab для wp-cron.php». Ниже — базовая настройка.
Открываем cron текущего пользователя:
crontab -e
Добавляем строку:
*/5 * * * * /usr/bin/php /var/www/site/public_html/wp-cron.php > /dev/null 2>&1
Разбор:
- */5 — каждые 5 минут
- полный путь к php
- полный путь к wp-cron.php
- вывод в null (без мусора в почту)
Если сайт крупный — можно поставить раз в минуту:
* * * * * /usr/bin/php /var/www/site/public_html/wp-cron.php > /dev/null 2>&1
Альтернатива через HTTP (если нет CLI PHP)
Сниппет «Вызов wp-cron по HTTP (curl)»:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Но CLI-вариант надёжнее.
Шаг 4. Проверяем, что cron добавился
crontab -l
Должна быть ваша строка.
Проверка результата
Проверка выполнения задач
Через 5–10 минут (сниппет «Проверка событий wp cron event list»):
wp cron event list
Временные метки должны обновляться.
Проверка логов nginx
Файл:
/var/log/nginx/access.log
Если используете HTTP-вариант — должны появляться обращения к wp-cron.php.
Принудительный запуск
wp cron event run --due-now
Если выполняется без ошибок — система рабочая.
Диагностика, если не работает
1. Проверяем пользователя cron
ps aux | grep cron
Если cron работает от root, а сайт принадлежит www-data — могут быть проблемы с правами.
Лучше добавить cron от того же пользователя, под которым работает сайт.
2. Проверяем права доступа
ls -la wp-cron.php
Файл должен быть читаемым для пользователя cron.
3. Проверяем SELinux (если включён)
На CentOS:
getenforce
Если Enforcing — временно проверить:
setenforce 0
Если после этого заработало — проблема в политике.
Типичные ошибки
❌ Оставили WP-Cron включённым
Причина: забыли добавить DISABLE_WP_CRON.
Результат: двойной запуск задач.
Исправление: проверить wp-config.php.
❌ Указан неверный путь к PHP
Причина: в системе несколько версий.
Проверка:
php -v
which php
Исправление: указать полный корректный путь.
❌ Неверный путь к wp-cron.php
Причина: указали относительный путь.
Нужно:
/var/www/site/public_html/wp-cron.php
❌ Cron добавлен, но не выполняется
Проверить:
systemctl status cron
или
systemctl status crond
Если не запущен:
systemctl start cron
Где применять
- ✔ Production VPS
- ✔ Nginx
- ✔ WooCommerce
- ✔ Импортёры
- ✔ Интеграции
- ✔ CI/CD деплой после миграции
Не применять:
- Локальная разработка
- Docker-контейнер без supervisor
- Shared hosting без доступа к cron
Когда это критично
- Малый трафик
- Email-воронки
- Платежи
- REST-интеграции
- Webhook-обработчики
Если wp cron не выполняется — это не баг WordPress. Это неправильная эксплуатация.
Дополнительные материалы
- https://developer.wordpress.org/plugins/cron/
- https://developer.wordpress.org/reference/functions/wp_schedule_event/
- https://wordpress.org/support/article/cron/
Итог
Если wordpress wp cron не выполняется, не надо искать плагины-костыли.
Правильный прод-подход:
- Отключить WP-Cron
- Настроить системный cron
- Проверить выполнение
После этого:
- письма отправляются
- импорт работает
- отложенные записи публикуются
- задачи выполняются стабильно
И главное — поведение становится предсказуемым.
В продакшене псевдо-cron не место.



Комментарии