Что такое WP-Cron и зачем он нужен в WordPress?
WP-Cron — это встроенная система планировщика задач в WordPress, которая имитирует поведение cron на сервере. Она позволяет запускать определённые функции по расписанию, например, проверять обновления, отправлять письма, очищать кэш, публиковать отложенные записи. Однако WP-Cron не является настоящим системным cron и зависит от посещений сайта, что может приводить к задержкам в выполнении задач.
Диагностика проблем с WP-Cron: почему задачи не выполняются вовремя
Если задачи WP-Cron не срабатывают, это часто связано с тем, что:
- На сайте низкая посещаемость — WP-Cron запускается только при загрузке страницы.
- В настройках сервера отключены HTTP-запросы к самому себе, блокируются loopback-запросы.
- Плагины или правила безопасности блокируют запросы wp-cron.php.
- В конфигурации WordPress или сервера отключён WP-Cron (define('DISABLE_WP_CRON', true);).
Для проверки работы WP-Cron можно использовать плагин WP Crontrol. Он показывает запланированные задачи, время их следующего запуска и позволяет запускать задачи вручную.
Пошаговое решение: как правильно настроить и использовать WP-Cron для автоматизации
1. Проверка и включение WP-Cron
Убедитесь, что в wp-config.php нет строки, отключающей WP-Cron:
define('DISABLE_WP_CRON', true);Если есть — удалите или закомментируйте её.
2. Настройка системного cron для запуска wp-cron.php
Из-за недостатков стандартного WP-Cron рекомендуем настроить системный cron на сервере, чтобы вызывать wp-cron.php регулярно, например, каждую минуту:
* * * * * 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После этого в wp-config.php нужно отключить стандартный WP-Cron, чтобы избежать двойного запуска:
define('DISABLE_WP_CRON', true);3. Создание своей задачи WP-Cron
Добавим пример задачи, которая будет запускаться каждую минуту и писать в лог время выполнения:
function my_custom_cron_job() {
error_log('WP-Cron сработал в ' . current_time('mysql'));
}
// Регистрируем интервал в 1 минуту
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['every_minute'])) {
$schedules['every_minute'] = [
'interval' => 60,
'display' => 'Каждую минуту'
];
}
return $schedules;
});
// Регистрируем событие, если не зарегистрировано
if (!wp_next_scheduled('my_custom_cron_job_hook')) {
wp_schedule_event(time(), 'every_minute', 'my_custom_cron_job_hook');
}
// Привязываем функцию к хуку
add_action('my_custom_cron_job_hook', 'my_custom_cron_job');Проверка результата после внедрения
- Установите плагин
WP Crontrolи проверьте, что ваша задача отображается в списке Scheduled Events с корректным интервалом и временем следующего запуска. - Проверьте логи PHP (error_log) — должна появляться запись с текущим временем при выполнении задачи.
- Если настроен системный cron, убедитесь, что он запускается (проверьте логи сервера или сделайте тестовый запрос вручную).
Частые ошибки и их исправление
Ошибка 1: Задачи WP-Cron не запускаются в нужное время
- Причина: отсутствие посетителей, отключён loopback-запрос или блокировка wp-cron.php
- Решение: настроить системный cron и отключить стандартный WP-Cron (define('DISABLE_WP_CRON', true);).
Ошибка 2: Дублирование задач при повторном подключении плагина
- Причина: функция wp_schedule_event вызывается без проверки существующих задач
- Решение: всегда проверяйте через
wp_next_scheduled()перед добавлением новой задачи.
Ошибка 3: Задача не выполняется из-за неправильного хука
- Причина: не совпадает название хука в
add_actionиwp_schedule_event - Решение: использовать одинаковые имена и внимательно проверять код.
Практические советы по безопасности и производительности
- Не создавайте слишком частые задачи без крайней необходимости — это может нагрузить сервер.
- Избегайте тяжелых операций в WP-Cron, лучше разбивайте их на части или используйте очереди.
- Ограничьте доступ к
wp-cron.phpчерез .htaccess или серверные настройки, если используете внешний cron, чтобы избежать внешних вызовов. - Добавляйте логирование и уведомления на ошибки внутри ваших cron-задач.
Сравнение вариантов запуска WP-Cron
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Стандартный WP-Cron (запуск при посещении) | Прост в использовании, не требует настройки сервера | Зависит от посещаемости, задержки в выполнении задач | Подходит для сайтов с высокой посещаемостью |
| Системный cron (через crontab) | Точный запуск, не зависит от посещаемости | Требует доступа к серверу и базовых навыков настройки | Рекомендуется для бизнеса и критичных задач |
| Комбинированный подход | Гибкость и резервное выполнение задач | Сложнее в поддержке | Для крупных проектов с разными типами задач |