Почему стандартный WP-Cron не всегда подходит для отложенных задач
WordPress использует собственный механизм WP-Cron для запуска запланированных задач (cron jobs), но он активируется только при посещении сайта. Это приводит к задержкам или пропуску задач, если трафик низкий или нестабилен, что критично для автоматизации важных процессов, например, импорта данных, отправки уведомлений или очистки базы.
Диагностика проблемы с WP-Cron
Чтобы проверить, как работает WP-Cron, выполните в консоли WP-CLI команду:
wp cron event list --fields=hook,next_runЕсли вы видите задачи с датами в прошлом или задачи не выполняются регулярно, значит WP-Cron не срабатывает автоматически.
Также можно проверить логи веб-сервера и PHP на наличие ошибок, связанных с wp-cron.php.
Пошаговое решение: настройка системного cron и отключение WP-Cron
1. Отключаем WP-Cron в WordPress
Добавьте в wp-config.php строку, которая отключит стандартный WP-Cron:
define('DISABLE_WP_CRON', true);2. Создаём системное задание cron на сервере
Подключитесь к серверу по SSH и откройте редактор crontab:
crontab -eДобавьте задачу, которая будет вызывать wp-cron.php каждую минуту (или с нужным интервалом):
* * * * * wget -q -O - https://ваш-домен.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или, что безопаснее и эффективнее, можно использовать команду PHP напрямую, указав путь к wp-cron.php и PHP:
* * * * * /usr/bin/php /путь/к/вашему/сайту/wp-cron.php >/dev/null 2>&13. Проверяем, что cron работает
Через некоторое время проверьте список заданий снова:
wp cron event list --fields=hook,next_runДата next_run должна обновляться регулярно, а задачи выполняться в соответствии с расписанием.
Как вручную запускать и тестировать задачи WP-Cron
Для проверки конкретных задач можно использовать WP-CLI:
wp cron event run --due-nowЭто запустит все просроченные задачи.
Частые ошибки и как их исправить
- Ошибка 403/401 при вызове wp-cron.php через wget/curl: Проверьте настройки .htaccess и файрвола, убедитесь, что вызов с локального сервера разрешён.
- Неверный путь к PHP в crontab: Уточните путь командой
which phpи используйте абсолютный путь. - WP-Cron отключён, но задачи не выполняются: Проверьте, что системный cron действительно запущен и работает.
- Задания не создаются в базе: Проверьте права пользователя и наличие ошибок в логах PHP.
Таблица сравнения: WP-Cron vs Системный Cron
| Параметр | WP-Cron | Системный Cron |
|---|---|---|
| Запуск задач | При посещении сайта | По расписанию в ОС |
| Надёжность | Зависит от трафика | Высокая, стабильная |
| Настройка | Простая, встроена | Требует доступа к серверу |
| Задержки | Возможны | Минимальные |
| Производительность | Может замедлять сайт | Не влияет на сайт |
Практические советы по безопасности и производительности
- Используйте вызов PHP из командной строки вместо wget/curl — это быстрее и безопаснее.
- Ограничьте доступ к wp-cron.php через .htaccess, чтобы избежать внешних вызовов.
- Для сайтов с высоким трафиком настройте интервал запуска cron в 5 минут или больше, чтобы снизить нагрузку.
- Регулярно проверяйте логи cron и ошибок PHP для своевременного обнаружения проблем.
- Если используете WooCommerce или другие плагины, чувствительные к cron, тестируйте штатное поведение при переходе на системный cron.
Пример кода: создание кастомного задания cron в WordPress
add_action('custom_hourly_event', 'custom_hourly_function');
function custom_hourly_function() {
// Ваш код, выполняющийся ежечасно
error_log('Custom hourly event fired: ' . current_time('mysql'));
}
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('custom_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'custom_hourly_event');
}Этот код создаёт событие, которое будет запускаться ежечасно. При использовании системного cron сработает без задержек.
Как проверить, что задача выполняется
- Проверяйте логи ошибок PHP или добавляйте запись в
error_log, как в примере выше. - Используйте WP-CLI для просмотра и запуска задач.
- Для более сложных задач добавляйте пользовательские логи или уведомления.