Диагностика проблемы: почему WP-Cron не запускает задачи вовремя
WP-Cron — встроенный механизм планировщика задач в WordPress. Он не работает как системный cron на сервере, а вызывается при загрузке страниц сайта. Это ведёт к задержкам и срабатыванию задач не по расписанию, особенно на сайтах с низким трафиком или при использовании кэширования.
Основные признаки проблем с WP-Cron:
- Задачи выполняются с задержкой или не выполняются вовсе.
- В логах или в базе данных постоянно накапливаются просроченные задачи.
- Проблемы с плагинами, которые зависят от регулярных заданий (обновления, очистка кэша, отправка писем).
Как проверить, работает ли WP-Cron
Для диагностики можно использовать несколько подходов:
- Плагин WP Crontrol — позволяет просмотреть и запустить запланированные задачи. Если задачи есть, но не выполняются, проблема в запуске WP-Cron.
- Проверить, отключен ли WP-Cron вручную в
wp-config.phpчерез константуDISABLE_WP_CRON:
define('DISABLE_WP_CRON', true);
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron
Пошаговое решение: как настроить системный cron для запуска WP-Cron
Чтобы WP-Cron срабатывал вовремя и независимо от посещений сайта, рекомендуется отключить встроенный механизм и настроить системный cron на сервере.
- Отключите встроенный WP-Cron: в
wp-config.phpдобавьте строкуdefine('DISABLE_WP_CRON', true); - Настройте системный cron: подключитесь к серверу по SSH и запустите редактор crontab:
Добавьте строку для запуска WP-Cron каждую минуту (можно реже, но 1 минута — оптимально):crontab -e
Замените* * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1https://example.comна ваш домен. - Проверьте права доступа: убедитесь, что ваш сервер позволяет выполнять wget или curl из cron.
- Альтернатива curl:
* * * * * curl --silent https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Проверка результата после внедрения системного cron
- Войдите в админку WordPress и проверьте список запланированных задач через плагин WP Crontrol. Задачи должны выполняться вовремя, без задержек.
- Отслеживайте логи сервера, чтобы убедиться в регулярном запуске wget или curl.
- Проверьте функциональность плагинов и функций, зависящих от WP-Cron (например, автоматическое очищение кэша, отправка email-рассылок).
Частые ошибки при настройке WP-Cron и как их исправить
- Ошибка: Забыл отключить встроенный WP-Cron — задачи запускаются дважды или конфликтуют.
Исправление: Добавьтеdefine('DISABLE_WP_CRON', true);вwp-config.php. - Ошибка: URL wp-cron.php неправильный или сайт недоступен из-под cron.
Исправление: Проверьте URL, замените на актуальный, убедитесь, что нет блокировок по IP или firewall. - Ошибка: Сервер не имеет wget или curl, или права на запуск cron ограничены.
Исправление: Используйте альтернативные способы запуска (php-cli), уточните у хостера права. - Ошибка: Кэширование страниц препятствует вызову wp-cron.php.
Исправление: Настройте исключения для wp-cron.php в плагине кэширования.
Практические советы по безопасности и производительности при использовании WP-Cron
- Не запускайте задачи чаще, чем требуется — нагрузка на сервер может увеличиться.
- Ограничьте доступ к
wp-cron.phpчерез .htaccess или firewall, если используете системный cron для вызова с сервера. - Используйте плагин Clearfy Pro для оптимизации и управления WP-Cron задачами, если это доступно.
- Регулярно проверяйте и очищайте просроченные или зависшие задачи через WP Crontrol.
Код для добавления собственной задачи в WP-Cron
Пример регистрации пользовательского события и его запуска каждые 10 минут:
function custom_cron_schedule($schedules) {
if(!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 10 минут в секундах
'display' => __('Каждые 10 минут')
);
}
return $schedules;
}
add_filter('cron_schedules', 'custom_cron_schedule');
function custom_cron_job() {
// Ваш код, который должен выполняться по расписанию
error_log('Custom cron job executed');
}
if (!wp_next_scheduled('custom_cron_hook')) {
wp_schedule_event(time(), 'every_ten_minutes', 'custom_cron_hook');
}
add_action('custom_cron_hook', 'custom_cron_job');
Как проверить, что ваша задача работает
- Посмотрите в логи сервера, если используете
error_log()или аналог. - Используйте плагин WP Crontrol для просмотра запланированных и выполненных задач.
- Добавьте отладочный вывод в код задачи (например, запись в файл или базу данных).