Встроенный WP-Cron в WordPress запускается не по таймеру ОС, а при заходах на сайт: кто-то открыл страницу – PHP догрел очередь заданий. На сайте с редким трафиком задачи «отложатся», на нагруженном – лишние запросы к wp-cron.php могут мешать. Ниже – как отключить псевдо-cron WordPress и повесить запуск на системный cron Linux.
Чем плох WP-Cron «из коробки»
- нет посещений – нет запуска (отложенные публикации, рассылки, бэкапы плагинами);
- при всплеске трафика cron-хуки могут стартовать параллельно с отдачей страницы;
- сложнее гарантировать интервал «каждые N минут» независимо от аудитории.
Системный cron дергает wp-cron.php (или CLI) по расписанию сам, без зависимости от визитов.
Шаг 1. Отключить встроенный WP-Cron
В wp-config.php (до строки с подключением wp-settings.php) добавьте:
define('DISABLE_WP_CRON', true);
После этого WordPress перестанет сам инициировать cron на фронтовых запросах. Очередь задач остаётся – её нужно вызывать снаружи.
Шаг 2. Задание в crontab
Откройте таблицу cron пользователя, от которого крутится сайт (или root, если так принято на сервере):
crontab -e
Вариант через HTTP (подставьте свой домен):
*/5 * * * * curl -fsS -o /dev/null "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
Или через wget:
*/5 * * * * wget -q -O - "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
Вариант через PHP CLI (часто стабильнее, нет зависимости от веб-сервера и кэша):
*/5 * * * * /usr/bin/php /var/www/html/wp-cron.php >/dev/null 2>&1
Путь к PHP и к корню WordPress замените на свои (which php, реальный document root).
Интервалы в crontab
Формат: минута час день_месяца месяц день_недели команда.
*/5 * * * *– каждые 5 минут (типичный выбор для WP);0 * * * *– каждый час в :00;0 3 * * *– каждый день в 03:00;0 3 * * 1– каждый понедельник в 03:00.
Для большинства сайтов достаточно вызова раз в 5-15 минут. Чаще – только если есть реально критичные по времени задачи и сервер это тянет.
Проверка
Список заданий текущего пользователя:
crontab -l
Логи cron (путь зависит от дистрибутива):
grep CRON /var/log/syslog # или journalctl -u cron -n 50
Для отладки временно пишите вывод в файл:
*/5 * * * * /usr/bin/php /var/www/html/wp-cron.php >> /tmp/wp-cron.log 2>&1
В WordPress можно смотреть запланированные хуки плагинами вроде WP Crontrol: после системного вызова due-задачи должны уходить из очереди.
Изменить или удалить задание
Снова crontab -e: отредактируйте строку или удалите её, сохраните файл. Пустой crontab – crontab -r (осторожно: снимет все задания пользователя).
Плюсы и риски
Плюсы: стабильный интервал без трафика, меньше сюрпризов на «тихих» сайтах, контроль с стороны ОС.
Риски: нужен доступ к серверу; опечатка в пути/URL – и cron «молчит»; слишком частый запуск тяжёлых задач грузит CPU и БД; на shared-хостинге crontab может быть ограничен панелью.
Если сайт на обычном shared без shell-cron, иногда оставляют WP-Cron или используют HTTP-cron от хостера/внешнего ping-сервиса. На VPS/выделенном сервере связка DISABLE_WP_CRON + системный cron – нормальная практика.
Краткий чеклист
- Добавить
define('DISABLE_WP_CRON', true);вwp-config.php. - Создать задание в
crontab -e(curl/wget или php-cli) раз в 5 минут. - Проверить
crontab -lи логи, убедиться что due-задачи в WP выполняются.