WordPress cron: невидимый грузовик, который может затормозить весь ваш сайт. Как им управлять?

Вы замечали, что ваш сайт иногда «задумчиво» зависает на несколько секунд в определённое время, хотя посетителей почти нет? Или хостинг-провайдер жалуется на превышение лимитов CPU? Частая и неочевидная причина — фоновые задачи WordPress Cron. В отличие от системного cron, WP-Cron работает по особому, не всегда эффективному механизму. Он отвечает за проверку обновлений, публикацию запланированных постов, отправку уведомлений и работу плагинов. Если его неправильно настроить, этот «невидимый грузовик» будет регулярно застревать на узкой дороге, блокируя весь трафик. Разберём, как устроен WP-Cron, как его оптимизировать и когда лучше от него вовсе отказаться.


Часть 1: Что такое WP-Cron и почему он «ломаный» по дизайну?

Системный Cron (правильный): Демон на сервере выполняет задачи строго по расписанию (раз в минуту, час, день) независимо от посещаемости сайта.

WP-Cron (особенный): У WordPress нет демона. Его «крон» запускается при каждом визите на сайт. Когда заходит пользователь, WordPress проверяет список запланированных задач: не пора ли что-то выполнить? Если пора — выполняет задачу в рамках этого же запроса пользователя, задерживая отдачу страницы.

Проблемы такого подхода:

  1. Неточное время: Задачи выполняются не по расписанию, а когда кто-то зашёл на сайт.

  2. Задержки для пользователей: Тяжёлая задача (например, создание бекапа) выполняется во время чьего-то визита, заставляя его ждать.

  3. Пропуск задач: Если на сайт никто не заходит — задачи не выполняются.

  4. Конфликт задач: Несколько задач, назначенных на одно время, могут «наложиться» на один визит и вызвать таймаут.

Часть 2: Диагностика: Что у вас «висит» в Cron?

Установите плагин WP Crontrol или Advanced Cron Manager. Они покажут вам ВСЁ:

  • Все запланированные хуки (задачи): wp_update_plugins, publish_future_post, woocommerce_cleanup_sessions.

  • Расписание: Как часто запускается (ежечасно, дважды в день и т.д.).

  • Следующий запуск: Когда задача должна выполниться в следующий раз.

  • Аргументы: Какие параметры передаются задаче.

Тревожные сигналы в списке:

  • Задачи, выполняющиеся каждую минуту от плагинов.

  • Огромное количество однотипных задач (например, по 20 экземпляров wp_scheduled_auto_draft_delete).

  • Задачи с названиями непонятных плагинов, которые вы уже удалили («осиротевшие» задачи).

Часть 3: Оптимизация №1: Чистка и управление задачами

  1. Удалите «осиротевшие» задачи. Плагин WP Crontrol позволяет найти и удалить хуки, не привязанные ни к одному активному плагину/теме.

  2. Отключите ненужные системные задачи. Некоторые стандартные задачи можно безопасно отключить, если они не нужны:

    php
    // Отключаем проверку обновлений ядра, тем и плагинов (если вы делаете это вручную) 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; } ); // Раз в день

    Внимание: Отключайте только то, в чём уверены.

  3. Оптимизируйте задачи плагинов. Зайдите в настройки плагинов (особенно SEO, резервного копирования, аналитики) и увеличьте интервалы для не критичных задач (например, не «каждый день», а «раз в три дня»).

Часть 4: Оптимизация №2 (Главная!): Замена WP-Cron на настоящий системный Cron

Это самое важное действие для сайтов со средней и высокой посещаемостью. Мы отключаем запуск задач через визиты пользователей и поручаем это серверу.

Шаг 1: Отключите WP-Cron в wp-config.php
Добавьте эту строку ДО /* That's all, stop editing! */:

php
define('DISABLE_WP_CRON', true);

Шаг 2: Настройте системный Cron через панель хостинга (cPanel/Plesk) или по SSH
Нужно, чтобы сервер раз в 5-15 минут «пинговал» специальный URL WordPress, запуская очередь задач.

Пример для cPanel:

  1. Найдите раздел «Cron Jobs».

  2. Добавьте задачу с интервалом каждые 15 минут (*/15 * * * *).

  3. В команду вставьте:

    bash
    /usr/bin/curl -s -o /dev/null https://ВАШ-САЙТ.ru/wp-cron.php?doing_wp_cron

    Или используйте wget:

    bash
    /usr/bin/wget -q -O /dev/null https://ВАШ-САЙТ.ru/wp-cron.php?doing_wp_cron

Что это даёт:

  • Задачи выполняются точно по расписанию.

  • Нет задержек для пользователей — задачи идут своим, независимым процессом.

  • Можно контролировать нагрузку (например, ставить запуск раз в 15 минут ночью).

Часть 5: Оптимизация №3: Для высоконагруженных проектов

  1. Вынос Cron на отдельный процесс. Используйте системный Cron для вызова не wp-cron.php, а собственного скрипта, который запускает задачи через WP CLI:

    bash
    */15 * * * * cd /path/to/wordpress && /usr/bin/php wp-cli.phar cron event run --due-now

    Это ещё более стабильно, чем обращение через HTTP.

  2. Использование очередей задач (Queue). Для самых ресурсоёмких задач (отправка массовых писем, обработка изображений) лучше использовать специализированные системы очередей: Redis, RabbitMQ или плагины вроде Action Scheduler (который уже используется WooCommerce). Они гарантируют выполнение и не блокируют основной поток.

  3. Контроль времени выполнения. В wp-config.php можно увеличить лимит времени для Cron-задач, если они не успевают:

    php
    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 на системный — обязательный пункт оптимизации.

Ваш план на сегодня:

  1. Установите WP Crontrol и посмотрите, что у вас висит в задачах.

  2. Отключите DISABLE_WP_CRON и настройте задание в панели хостинга.

  3. Настройте интервалы для самых частых задач от плагинов.

Эти действия снимут необъяснимые периодические тормоза и сделают работу сайта предсказуемой. Ваши пользователи больше не будут невольными «пусковыми крючками» для фоновых процессов.