Если ваш сайт на WordPress перестал запускать запланированные задачи, например, публикацию отложенных постов, рассылку email или очистку кеша, скорее всего, проблема связана с WP-Cron. В этой статье разберём, почему WP-Cron может не работать, как это проверить и как исправить ситуацию с помощью кода и плагинов.
Что такое WP-Cron и почему он важен
WP-Cron — это встроенная система планировщика задач в WordPress. В отличие от системных cron-задач на сервере, WP-Cron запускается при заходе посетителя на сайт: при каждом запросе проверяет, нет ли запланированных задач, и запускает их.
Проблема в том, что если на сайт долго никто не заходит, или заходы нерегулярны, задачи просто не выполняются. Кроме того, некоторые хостинги блокируют внутренние запросы, необходимые для работы WP-Cron, или настроены так, что WP-Cron не запускается корректно.
Признаки того, что WP-Cron не работает
- Отложенные публикации не выходят в назначенное время.
- Плагины, зависящие от расписания, не выполняют свои задачи (например, очистка кеша, отправка писем).
- В логах сервера или плагина вы видите ошибки, связанные с wp-cron.php.
Если вы наблюдаете такие симптомы, нужно проверить и исправить работу WP-Cron.
Как проверить, работает ли WP-Cron
Самый простой способ проверить — отключить WP-Cron и настроить системный cron, либо временно добавить вывод в лог при запуске cron-задач. Для начала можно добавить следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('wp_loaded', function() {
if (defined('DOING_CRON') && DOING_CRON) {
error_log('WP-Cron запущен: ' . current_time('mysql'));
}
});После этого посмотрите логи сервера. Если сообщений нет, значит WP-Cron не запускается вообще.
Также можно проверить, вызывается ли wp-cron.php напрямую. Для этого в браузере откройте https://ваш_сайт.ru/wp-cron.php?doing_wp_cron. Если вы видите белую страницу без ошибок — скорее всего, он работает, но не всегда запускается автоматически.
Отключение WP-Cron и настройка системного cron
Если вы обнаружили, что WP-Cron ненадежен, лучший способ — отключить его и настроить системный cron на сервере. Для этого:
- Откройте
wp-config.phpи добавьте строку:
define('DISABLE_WP_CRON', true);- Настройте системный cron, чтобы запускать wp-cron.php регулярно, например, каждые 15 минут:
*/15 * * * * wget -q -O - https://ваш_сайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1<Или, если нет wget, можно использовать curl:
*/15 * * * * curl -s https://ваш_сайт.ru/wp-cron.php?doing_wp_cron > /dev/null 2>&1<Это гарантирует запуск запланированных задач даже при отсутствии посетителей.
Пример функции для wpdemo, проверяющей статус WP-Cron
Можно добавить на сайт кастомную функцию, которая проверит, когда последний раз запускался WP-Cron и уведомит администратора:
function wpdemo_check_wp_cron_last_run() {
$cron = _get_cron_array();
$last_run = 0;
foreach ($cron as $timestamp => $events) {
if ($timestamp > $last_run) {
$last_run = $timestamp;
}
}
$last_run_date = $last_run ? date('Y-m-d H:i:s', $last_run) : 'никогда';
error_log('WP-Cron последний раз запускался: ' . $last_run_date);
}
add_action('init', 'wpdemo_check_wp_cron_last_run');Это полезно для мониторинга работы планировщика.
Плагины для управления WP-Cron и диагностики
Существует несколько плагинов, которые помогут вам управлять WP-Cron и диагностировать проблемы:
- WP Crontrol — позволяет просматривать, редактировать и запускать задачи cron прямо из админки WordPress. Очень удобно для отладки и управления расписаниями.
- Advanced Cron Manager — более продвинутый инструмент с возможностью экспорта/импорта задач и детального анализа.
- Cron Status — плагин для мониторинга статуса cron-задач и уведомлений.
Использование плагинов позволит избежать многих ошибок и упростить работу с WP-Cron.
Как использовать WP Crontrol для отладки
После установки WP Crontrol в меню «Инструменты» появится раздел «Cron Events». Там вы увидите все зарегистрированные задачи с их расписанием и временем следующего запуска. Можно вручную запустить любую задачу, чтобы проверить её работу.
Если задача не запускается, проверьте, не вызывает ли она ошибок. Для этого можно включить режим отладки в WordPress (define('WP_DEBUG', true);) и посмотреть логи.
Типичные ошибки и их решения
1. WP-Cron не запускается из-за блокировки внутренних запросов
Некоторые хостинги или плагины безопасности блокируют wp-cron.php или внутренние HTTP-запросы к самому сайту. Это приводит к тому, что WP-Cron просто не срабатывает.
Решение — либо отключить WP-Cron и настроить системный cron, либо настроить исключения в защитных плагинах и фаерволах.
2. Отложенные посты не публикуются
Часто проблема в том, что wp-cron.php не запускается из-за отсутствия трафика. Настройка системного cron решит проблему.
3. Ошибки в пользовательских cron-задачах
Если вы добавляете свои задачи, убедитесь, что в коде нет ошибок, и что задачи не вызывают фатальных ошибок. Пример правильной регистрации:
function wpdemo_register_cron_event() {
if (!wp_next_scheduled('wpdemo_custom_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'wpdemo_custom_cron_hook');
}
}
add_action('wp', 'wpdemo_register_cron_event');
function wpdemo_custom_cron_function() {
// Ваш код задачи
error_log('Выполнена задача wpdemo_custom_cron_hook');
}
add_action('wpdemo_custom_cron_hook', 'wpdemo_custom_cron_function');Такой код добавит ежечасную задачу, которая будет логировать выполнение.
Выводы и рекомендации по работе с WP-Cron
WP-Cron — удобный инструмент, но он зависит от посещаемости сайта и настроек сервера. Если у вас важные задачи, требующие точного времени выполнения, лучше отключить WP-Cron и использовать системный cron.
Обязательно используйте плагины для контроля и отладки cron-задач, чтобы видеть, что происходит «под капотом».
При добавлении своих задач следите за правильным хуканием функций, чтобы не создавать конфликтов и не вызывать ошибок.