Диагностика проблемы с WP-Cron на сайте WordPress
WP-Cron — это имитация системного планировщика задач, встроенная в WordPress. Он отвечает за запуск отложенных задач: публикацию запланированных постов, очистку кеша, отправку уведомлений и пр. На высоконагруженных сайтах или при большом количестве задач WP-Cron может перестать срабатывать своевременно или вовсе остановиться. Основные признаки:
- Запланированные публикации не выходят в срок
- Автоматические задачи (очистка, обновления) задерживаются или не выполняются
- В логах сервера или плагинов видны ошибки, связанные с WP-Cron
- Проверка через
wp cron event listпоказывает множество отложенных задач, которые не запускаются
Как проверить текущее состояние WP-Cron
Подключитесь по SSH к серверу и выполните команду, если установлен WP-CLI:
wp cron event list --fields=hook,next_run,generationЕсли задачи долго не запускаются (next_run в прошлом), значит WP-Cron не работает корректно.
Пошаговое решение: настройка реального системного Cron вместо WP-Cron
WP-Cron запускается при каждом обращении к сайту, что не надежно на больших нагрузках или при низком трафике. Лучший способ — полностью отключить WP-Cron и настроить системный cron на сервере.
1. Отключение WP-Cron
Добавьте в wp-config.php сразу после открытия PHP-тега строку:
define('DISABLE_WP_CRON', true);Это отключит запуск WP-Cron при обращении к сайту.
2. Настройка системного cron
Добавьте в кронтаб вашего сервера задание, которое будет запускать WP-Cron регулярно, например, каждую минуту:
* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или с использованием curl:
* * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Если у вас доступ к PHP CLI, можно сделать вызов напрямую:
* * * * * php /path/to/wordpress/wp-cron.php >/dev/null 2>&1Замените https://example.com и путь на ваш домен и путь к WordPress.
3. Проверка cron на сервере
Убедитесь, что задание добавлено в кронтаб:
crontab -lДолжно отображаться ваше задание.
Проверка результата после внедрения
- Следите за выполнением команд в логах сервера (например,
/var/log/cron.log) - Проверьте через WP-CLI, что задачи запускаются своевременно:
wp cron event list --fields=hook,next_run --format=tableЕсли даты next_run обновляются и находятся в будущем, значит cron работает.
Также можно добавить тестовый крон-хук в функции темы или плагина:
add_action('my_test_cron_hook', function() { error_log('WP-Cron работает: ' . current_time('mysql')); });
if (!wp_next_scheduled('my_test_cron_hook')) {
wp_schedule_event(time(), 'minute', 'my_test_cron_hook');
}Проверьте логи ошибок PHP — должны появляться сообщения с отметкой времени.
Частые ошибки и как их исправить
- Ошибка 403/401 при вызове wp-cron.php: Проверьте настройки .htaccess, файрволла и плагинов безопасности. Нужно разрешить доступ к wp-cron.php.
- Команда cron не выполняется: Убедитесь, что cron служба запущена, а команда в кронтаб прописана корректно.
- Некорректный URL в задании cron: Проверьте, что URL wp-cron.php доступен по HTTPS и без редиректов.
- Отсутствие прав на запуск php из командной строки: Проверьте права пользователя, под которым запускается cron, и путь к PHP.
Практические советы для производительности и безопасности
- Не ставьте интервал cron чаще 1 минуты — лишняя нагрузка на сервер.
- Используйте HTTPS для вызова wp-cron.php, чтобы избежать MITM-атак.
- Ограничьте доступ к wp-cron.php по IP, если это возможно.
- Для больших сайтов с множеством задач используйте плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wp-bloger.ru&utm_medium=article&utm_campaign=kak-reshit-problemu-ostanovki-raboty-wp-cron-na-vysokonagruzhennyh-sajtah — он помогает оптимизировать работу cron и очищать ненужные события.
Сравнение способов запуска WP-Cron
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron по запросу (по умолчанию) | Не требует настройки сервера, прост в использовании | Зависит от посещаемости сайта, может не срабатывать на низком трафике, увеличивает время отклика |
| Системный cron через wget/curl | Надежно и регулярно запускается, не зависит от трафика | Требует доступа к серверу, может создать лишнюю нагрузку при частом вызове |
| Системный cron через PHP CLI | Быстрый и эффективный запуск, не гонит HTTP-запросы | Необходим доступ к CLI и правильный путь к PHP |