WordPress cron: невидимый грузовик, который может затормозить весь ваш сайт. Как им управлять?
Вы замечали, что ваш сайт иногда «задумчиво» зависает на несколько секунд в определённое время, хотя посетителей почти нет? Или хостинг-провайдер жалуется на превышение лимитов CPU? Частая и неочевидная причина — фоновые задачи WordPress Cron. В отличие от системного cron, WP-Cron работает по особому, не всегда эффективному механизму. Он отвечает за проверку обновлений, публикацию запланированных постов, отправку уведомлений и работу плагинов. Если его неправильно настроить, этот «невидимый грузовик» будет регулярно застревать на узкой дороге, блокируя весь трафик. Разберём, как устроен WP-Cron, как его оптимизировать и когда лучше от него вовсе отказаться.
Часть 1: Что такое WP-Cron и почему он «ломаный» по дизайну?
Системный Cron (правильный): Демон на сервере выполняет задачи строго по расписанию (раз в минуту, час, день) независимо от посещаемости сайта.
WP-Cron (особенный): У WordPress нет демона. Его «крон» запускается при каждом визите на сайт. Когда заходит пользователь, WordPress проверяет список запланированных задач: не пора ли что-то выполнить? Если пора — выполняет задачу в рамках этого же запроса пользователя, задерживая отдачу страницы.
Проблемы такого подхода:
- Неточное время: Задачи выполняются не по расписанию, а когда кто-то зашёл на сайт.
- Задержки для пользователей: Тяжёлая задача (например, создание бекапа) выполняется во время чьего-то визита, заставляя его ждать.
- Пропуск задач: Если на сайт никто не заходит — задачи не выполняются.
- Конфликт задач: Несколько задач, назначенных на одно время, могут «наложиться» на один визит и вызвать таймаут.
Часть 2: Диагностика: Что у вас «висит» в Cron?
Установите плагин WP Crontrol или Advanced Cron Manager. Они покажут вам ВСЁ:
- Все запланированные хуки (задачи):
wp_update_plugins,publish_future_post,woocommerce_cleanup_sessions. - Расписание: Как часто запускается (ежечасно, дважды в день и т.д.).
- Следующий запуск: Когда задача должна выполниться в следующий раз.
- Аргументы: Какие параметры передаются задаче.
Тревожные сигналы в списке:
- Задачи, выполняющиеся каждую минуту от плагинов.
-
Огромное количество однотипных задач (например, по 20 экземпляров
wp_scheduled_auto_draft_delete). - Задачи с названиями непонятных плагинов, которые вы уже удалили («осиротевшие» задачи).
Часть 3: Оптимизация №1: Чистка и управление задачами
- Удалите «осиротевшие» задачи. Плагин WP Crontrol позволяет найти и удалить хуки, не привязанные ни к одному активному плагину/теме.
- Отключите ненужные системные задачи. Некоторые стандартные задачи можно безопасно отключить, если они не нужны:
// Отключаем проверку обновлений ядра, тем и плагинов (если вы делаете это вручную) remove_action( 'wp_version_check', 'wp_version_check' ); remove_action( 'wp_update_plugins', 'wp_update_plugins' ); remove_action( 'wp_update_themes', 'wp_update_themes' ); // Отключаем проверку на наличие постов-автосохранений (можно делать реже) add_filter( 'wp_frequent_auto_draft_interval', function() { return 86400; } ); // Раз в день
Внимание: Отключайте только то, в чём уверены.
- Оптимизируйте задачи плагинов. Зайдите в настройки плагинов (особенно SEO, резервного копирования, аналитики) и увеличьте интервалы для не критичных задач (например, не «каждый день», а «раз в три дня»).
Часть 4: Оптимизация №2 (Главная!): Замена WP-Cron на настоящий системный Cron
Это самое важное действие для сайтов со средней и высокой посещаемостью. Мы отключаем запуск задач через визиты пользователей и поручаем это серверу.
Шаг 1: Отключите WP-Cron в wp-config.php
Добавьте эту строку ДО /* That's all, stop editing! */:
define('DISABLE_WP_CRON', true);
Шаг 2: Настройте системный Cron через панель хостинга (cPanel/Plesk) или по SSH
Нужно, чтобы сервер раз в 5-15 минут «пинговал» специальный URL WordPress, запуская очередь задач.
Пример для cPanel:
- Найдите раздел «Cron Jobs».
-
Добавьте задачу с интервалом каждые 15 минут (
*/15 * * * *). -
В команду вставьте:
/usr/bin/curl -s -o /dev/null https://ВАШ-САЙТ.ru/wp-cron.php?doing_wp_cron
Или используйте
wget:/usr/bin/wget -q -O /dev/null https://ВАШ-САЙТ.ru/wp-cron.php?doing_wp_cron
Что это даёт:
- Задачи выполняются точно по расписанию.
- Нет задержек для пользователей — задачи идут своим, независимым процессом.
- Можно контролировать нагрузку (например, ставить запуск раз в 15 минут ночью).
Часть 5: Оптимизация №3: Для высоконагруженных проектов
- Вынос Cron на отдельный процесс. Используйте системный Cron для вызова не
wp-cron.php, а собственного скрипта, который запускает задачи через WP CLI:*/15 * * * * cd /path/to/wordpress && /usr/bin/php wp-cli.phar cron event run --due-now
Это ещё более стабильно, чем обращение через HTTP.
- Использование очередей задач (Queue). Для самых ресурсоёмких задач (отправка массовых писем, обработка изображений) лучше использовать специализированные системы очередей: Redis, RabbitMQ или плагины вроде Action Scheduler (который уже используется WooCommerce). Они гарантируют выполнение и не блокируют основной поток.
- Контроль времени выполнения. В
wp-config.phpможно увеличить лимит времени для Cron-задач, если они не успевают:define('WP_CRON_LOCK_TIMEOUT', 120); // 120 секунд вместо стандартных 60
Часть 6: Специфика для WooCommerce и популярных плагинов
- WooCommerce: Активно использует свой планировщик (Action Scheduler). После перехода на системный Cron убедитесь, что задачи WooCommerce (очистка сессий, обновление курсов валют) выполняются. Плагин Action Scheduler можно поставить отдельно для мониторинга.
- Плагины резервного копирования (UpdraftPlus, BackWPup): Категорически настраивайте их на работу по своему расписанию (например, ночью), а не через стандартный WP-Cron.
- SEO-плагины (Yoast, Rank Math): Проверьте, как часто у них настроена переиндексация sitemap. Не нужно делать это каждый час.
Заключение
WP-Cron — пример того, как удобство для разработчика (не требовать настройки Cron на сервере) оборачивается проблемой для производительности в реальном мире. Для любого сайта, кроме самых маленьких, замена виртуального Cron на системный — обязательный пункт оптимизации.
Ваш план на сегодня:
- Установите WP Crontrol и посмотрите, что у вас висит в задачах.
-
Отключите
DISABLE_WP_CRONи настройте задание в панели хостинга. - Настройте интервалы для самых частых задач от плагинов.
Эти действия снимут необъяснимые периодические тормоза и сделают работу сайта предсказуемой. Ваши пользователи больше не будут невольными «пусковыми крючками» для фоновых процессов.