Что такое WP-Cron и зачем он нужен
WP-Cron — встроенный в WordPress механизм для планирования и выполнения задач по расписанию. Он позволяет запускать скрипты в фоновом режиме, например, для очистки кеша, отправки email-уведомлений, обновления данных без необходимости настройки системных cron-заданий на сервере.
Но WP-Cron имеет особенности, о которых важно знать, чтобы правильно использовать его в реальных проектах.
Как диагностировать проблемы с WP-Cron
Частые симптомы неправильной работы WP-Cron:
- Запланированные задачи не выполняются или выполняются с большой задержкой.
- Производительность сайта падает при большом количестве cron-задач.
- Ошибки в логах, связанные с wp-cron.php.
Для диагностики используйте плагин WP Crontrol. Он позволяет просматривать, редактировать и запускать cron-задачи вручную.
Также проверьте, что на сервере не отключен вызов wp-cron.php при каждом запросе. По умолчанию WP-Cron срабатывает при посещении сайта, что может быть ненадежно.
Пошаговое решение: настройка и оптимизация WP-Cron
1. Отключение стандартного WP-Cron и настройка системного cron
Для надежной работы WP-Cron рекомендуется отключить его запуск при каждом запросе и настроить системный cron на сервере.
Добавьте в wp-config.php перед строкой /* That's all, stop editing! Happy blogging. */ следующую строку:
define('DISABLE_WP_CRON', true);Далее в планировщик задач сервера (crontab) добавьте задачу для вызова wp-cron.php. Например, для запуска каждые 5 минут:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или используйте curl вместо wget:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&12. Регистрация собственной задачи WP-Cron
Пример: добавим задачу для ежедневного удаления устаревших transient-данных.
В файл темы или плагина добавьте:
function wphost_cleanup_transients() {
global $wpdb;
$time = time();
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_%' AND option_value < %d",
$time
)
);
}
function wphost_schedule_cleanup() {
if (!wp_next_scheduled('wphost_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wphost_daily_cleanup');
}
}
add_action('wp', 'wphost_schedule_cleanup');
add_action('wphost_daily_cleanup', 'wphost_cleanup_transients');Этот код проверяет, есть ли уже запланированная задача, и если нет — создает её с интервалом «daily».
3. Запуск задачи вручную для проверки
Для теста можно вызвать задачу напрямую:
do_action('wphost_daily_cleanup');Или через WP Crontrol запустить событие вручную.
Проверка результата после внедрения
1. Убедитесь, что в расписании cron-задач (через WP Crontrol или wp-cli) появилась ваша задача.
2. Проверьте логи сервера на отсутствие ошибок при вызове wp-cron.php.
3. При необходимости — добавьте логирование в функцию, например:
error_log('WP-Cron cleanup ran at ' . date('Y-m-d H:i:s'));и проверьте, что запись появляется в error_log.
Частые ошибки и как их исправить
- Задачи не выполняются регулярно. Причина: отключен WP-Cron и не настроен системный cron. Решение: настройте системный cron и отключите WP-Cron в wp-config.php.
- Дублирование задач. При каждом заходе на сайт создается новая задача. Причина: отсутствие проверки
wp_next_scheduled(). Решение: обязательно проверяйте перед планированием. - Большая нагрузка на сервер. Слишком частый вызов wp-cron.php или чрезмерное количество задач. Решение: увеличьте интервал запуска системного cron и оптимизируйте задачи.
- Ошибка подключения к wp-cron.php через wget/curl. Причина: неправильный URL или блокировка на сервере. Решение: проверьте корректность URL и разрешения сервера.
Практические советы по безопасности и производительности
- Не запускайте wp-cron.php слишком часто, чтобы не перегружать сервер.
- Используйте системный cron вместо запуска при каждом запросе — это надежнее и производительнее.
- Проверяйте наличие задач перед их созданием, чтобы избежать дублирования.
- Если используете https, убедитесь, что cron-запросы проходят без проблем (сертификаты, редиректы).
- Логируйте критичные задачи для мониторинга их выполнения.
Сравнение вариантов запуска WP-Cron
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Запуск при каждом запросе (по умолчанию) | Простота настройки, не требует доступа к серверу | Зависит от посещаемости, может не запускаться вовремя, нагрузка при большом трафике | Подходит для небольших сайтов с регулярным трафиком |
| Системный cron (crontab) | Точный запуск, стабильность, отсутствие зависимости от трафика | Требует доступа к серверу и базовых навыков администрирования | Рекомендуется для средних и больших проектов |
| Внешние сервисы (например, cron-job.org) | Не требует сервера, простой запуск по расписанию | Зависимость от стороннего сервиса, возможна задержка | Подходит, если нет доступа к crontab |