Как заменить WordPress Cron заданием Linux Cron

analog clock

Встроенный 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 – нормальная практика.

Краткий чеклист

  1. Добавить define('DISABLE_WP_CRON', true); в wp-config.php.
  2. Создать задание в crontab -e (curl/wget или php-cli) раз в 5 минут.
  3. Проверить crontab -l и логи, убедиться что due-задачи в WP выполняются.

Комментарии загружаются…