Что такое WP-Cron и зачем он нужен в WordPress
WP-Cron — это встроенная в WordPress система планировщика задач, которая позволяет автоматически запускать определённые действия по расписанию. В отличие от системного cron на сервере, WP-Cron запускается при загрузке любой страницы сайта.
Типичные задачи для WP-Cron: отправка рассылок, очистка базы данных, публикация отложенных записей, обновление кэша и многое другое.
Диагностика проблем с WP-Cron
Часто WP-Cron перестаёт работать или срабатывает с задержками. Основные признаки:
- Задачи не выполняются вовремя (или вовсе не выполняются)
- Отложенные публикации не выходят в назначенное время
- Плагины, завязанные на cron, не обновляются
Как проверить состояние WP-Cron:
define('DISABLE_WP_CRON', false); // В wp-config.php, проверьте, что cron не отключён
// Просмотр всех запланированных задач с помощью WP-CLI
wp cron event listЕсли команда wp cron event list не показывает задачи, значит планировщик не работает или задачи не добавлены.
Пошаговое решение: корректная настройка и отладка WP-Cron
1. Проверка и отключение системного планировщика
Если на сервере настроен системный cron для запуска WP-Cron, рекомендуется отключить встроенный запуск и настроить системный для стабильности.
// В wp-config.php
// Отключаем встроенный запуск WP-Cron
define('DISABLE_WP_CRON', true);Затем в crontab добавить задачу (пример для запуска каждые 15 минут):
*/15 * * * * wget -q -O - 'https://example.com/wp-cron.php?doing_wp_cron' >/dev/null 2>&12. Проверка добавления задач в WP-Cron
Для добавления пользовательской задачи используется функция wp_schedule_event(). Пример добавления задачи для ежедневного запуска:
function wporg_custom_cron_job() {
// Ваш код задачи
error_log('Custom cron job executed');
}
add_action('wporg_daily_event', 'wporg_custom_cron_job');
function wporg_schedule_cron() {
if (!wp_next_scheduled('wporg_daily_event')) {
wp_schedule_event(time(), 'daily', 'wporg_daily_event');
}
}
add_action('wp', 'wporg_schedule_cron');Обратите внимание, что задача добавляется при каждом заходе на сайт, но с проверкой, чтобы не дублировать.
3. Отладка через логирование и WP-CLI
Для проверки срабатывания задачи можно использовать логирование через error_log() или создавать записи в базе данных.
WP-CLI позволяет запускать cron вручную:
wp cron event run --due-nowПроверка результата после внедрения
Чтобы убедиться, что WP-Cron работает корректно:
- Запустите задачу вручную через WP-CLI и проверьте логи
- Проверьте, что запланированные события появляются в списке
wp cron event list - Проверьте фактический результат задачи (например, обновление данных или запись в лог)
Частые ошибки и их устранение
Ошибка 1: Задачи не запускаются из-за кеширования
Некоторые кеширующие плагины или CDN блокируют запуск cron при загрузке страниц. Решение — отключить кеширование для wp-cron.php или настроить системный cron.
Ошибка 2: Множественное дублирование задач
Если не проверять наличие задачи перед планированием, может создаваться множество одинаковых задач. Всегда используйте wp_next_scheduled().
Ошибка 3: Отключён WP-Cron в wp-config.php
Проверьте наличие константы DISABLE_WP_CRON и её значение.
Практические советы по безопасности и производительности
- Для стабильности лучше выключить встроенный WP-Cron и настроить системный cron на сервере.
- Ограничьте частоту запуска задач, чтобы не создавать нагрузку.
- Не выполняйте в cron задачи, требующие интерактивного ввода или длительной загрузки.
- Защитите
wp-cron.phpот внешнего доступа, например, через проверку user-agent или IP, если используете wget/cURL в системном cron.
Сравнение вариантов запуска WP-Cron
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Встроенный WP-Cron | Не требует настройки сервера, прост в использовании | Зависит от посещаемости сайта, возможна задержка | Подходит для небольших сайтов с достаточным трафиком |
| Системный cron | Точный запуск по расписанию, не зависит от трафика | Требует доступа к серверу и базовых знаний Linux | Рекомендуется для производственных и крупных сайтов |