← Назад в блог

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

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

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

Требования

  • 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):

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

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

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

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

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

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

  1. Проверяем вручную:
curl https://example.com/wp-cron.php?doing_wp_cron

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

  1. Проверяем опцию:
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. Это неправильная эксплуатация.


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


Итог

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

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

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

После этого:

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

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

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

0 просмотров

Комментарии

Загрузка комментариев...
Пока нет комментариев. Будьте первым!