Что такое WP-Cron и зачем он нужен
WP-Cron — встроенный механизм WordPress для запуска запланированных задач, таких как публикация отложенных постов, проверка обновлений, очистка кэша и другие автоматизации. В отличие от системного cron на сервере, WP-Cron запускается при посещении сайта и может работать нестабильно при низком трафике.
Диагностика проблем с WP-Cron
Если автоматические задачи не выполняются вовремя, возможные причины:
- Низкий трафик сайта — WP-Cron запускается только при обычном посещении;
- Отключена функция WP-Cron (константа
DISABLE_WP_CRONвwp-config.phpустановлена вtrue); - Конфликты плагинов или хостинга, блокирующие запросы к
wp-cron.php; - Ошибки в самих заданиях, приводящие к их сбоям;
- Нагрузка сервера, не позволяющая выполнять задачи своевременно.
Как проверить работу WP-Cron
Создайте тестовое задание и посмотрите, выполняется ли оно:
function test_wp_cron_event() {
error_log('WP-Cron работает: ' . current_time('mysql'));
}
if (! wp_next_scheduled('test_wp_cron_hook')) {
wp_schedule_event(time() + 60, 'minute', 'test_wp_cron_hook');
}
add_action('test_wp_cron_hook', 'test_wp_cron_event');Затем проверьте файл debug.log в wp-content (если включен WP_DEBUG_LOG) на наличие записей с отметкой времени. Отсутствие записей — сигнал, что WP-Cron не срабатывает.
Пошаговое решение проблем с WP-Cron
1. Проверка и настройка wp-config.php
Убедитесь, что в wp-config.php нет строки, отключающей WP-Cron:
define('DISABLE_WP_CRON', true);Если эта строка есть и установлена в true, WP-Cron не работает автоматически. Для надежной работы лучше отключить WP-Cron и настроить системный cron (см. пункт 3).
2. Проверка доступа к wp-cron.php
Убедитесь, что файл wp-cron.php доступен по адресу https://your-site.ru/wp-cron.php?doing_wp_cron. Иногда плагины безопасности или настройки сервера блокируют этот файл. Для проверки можно временно отключить плагины безопасности и проверить результат.
3. Настройка системного cron вместо WP-Cron
Для сайтов с низким трафиком системный cron надежнее. Для этого:
- В
wp-config.phpдобавьте или измените строку:
define('DISABLE_WP_CRON', true);- Настройте cron-задачу на сервере, которая будет запускать
wp-cron.phpрегулярно (например, каждую минуту). Команда для Linux-сервера:
* * * * * wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1Или с помощью curl:
* * * * * curl -s https://your-site.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1<После этого WP-Cron будет срабатывать по расписанию системного cron, независимо от посещаемости сайта.
4. Мониторинг и логирование задач WP-Cron
Добавьте логирование выполнения задач, чтобы быстро определить сбои. Например:
add_action('test_wp_cron_hook', function() {
error_log('WP-Cron тестовая задача выполнена: ' . current_time('mysql'));
});Для продвинутого контроля можно использовать плагины вроде WP Crontrol — они показывают все запланированные задачи и позволяют запускать их вручную.
Проверка результата после внедрения
Чтобы убедиться, что WP-Cron теперь работает:
- Проверьте логи ошибок или
debug.logна наличие записей о выполнении задач; - Используйте плагин WP Crontrol для просмотра запланированных событий и истории выполнения;
- Настройте тестовую задачу, которая изменит что-то видимое на сайте (например, обновит опцию), и проверьте её обновление;
- При использовании системного cron проверьте журнал cron на сервере (обычно
/var/log/cronили схожий).
Частые ошибки и как их исправить
- DISABLE_WP_CRON установлен в true без настройки системного cron — задачи не выполняются. Решение: либо убрать эту константу, либо настроить системный cron.
- Блокировка
wp-cron.phpсервером или firewall — WP-Cron не запускается. Решение: проверить и разрешить доступ кwp-cron.php. - Ошибки в функциях задач — задача запускается, но падает с ошибкой. Решение: включить WP_DEBUG, проверить логи, исправить ошибки в коде.
- Низкий трафик сайта — WP-Cron не срабатывает вовремя. Решение: использовать системный cron.
Практические советы по безопасности и производительности
- Не запускайте тяжелые задачи в WP-Cron, если сайт на общем хостинге — это может привести к таймаутам.
- Используйте куки и nonce для защиты вызовов
wp-cron.php, если вызываете его через внешние скрипты. - Минимизируйте количество запланированных задач, чтобы не перегружать систему.
- Для долгих процессов используйте WP-CLI cron commands или отдельные очереди задач (например, с помощью плагина Action Scheduler).
Сравнение вариантов запуска WP-Cron
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Встроенный WP-Cron (по визитам) | Не требует настройки сервера, просто работает | Зависит от трафика, может не запускаться вовремя | Сайты с регулярным трафиком |
| Отключенный WP-Cron + системный cron | Надежный запуск по расписанию, не зависит от трафика | Требует доступа к crontab сервера и базовых навыков администрирования | Сайты с низким трафиком, критичные по времени задачи |
| Плагины для управления WP-Cron | Управление, мониторинг, ручной запуск задач | Дополнительная нагрузка и зависимость от плагина | Для удобства администрирования |