Что такое WP-Cron и зачем он нужен в WordPress
WP-Cron — это встроенный в WordPress механизм для выполнения запланированных задач (cron jobs). Он отвечает за автоматический запуск обновлений, публикацию отложенных постов, очистку кэша, отправку email-рассылок и прочие регулярные процессы. В отличие от системного cron, WP-Cron запускается только при посещении сайта, что нередко приводит к проблемам с надежностью и точностью выполнения задач.
Диагностика проблем с WP-Cron
Частые симптомы проблем с WP-Cron:
- Запланированные задачи не выполняются вовремя или вовсе не запускаются.
- Отложенный контент (посты, публикации) не публикуется в назначенное время.
- Автоматические процессы (например, очистка кэша или отправка уведомлений) задерживаются.
Для проверки работы WP-Cron используйте плагин WP Crontrol. Он позволяет увидеть список запланированных событий, их статус и время следующего запуска.
if ( ! wp_next_scheduled( 'my_custom_cron_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_custom_cron_hook' );
}
add_action( 'my_custom_cron_hook', 'my_custom_cron_function' );
function my_custom_cron_function() {
// Ваш код для выполнения по расписанию
}Пошаговое решение: настройка надежного запуска WP-Cron через системный cron
Чтобы WP-Cron работал стабильно, нужно отключить запуск по посещению сайта и настроить системный cron на сервере, который будет вызывать wp-cron.php по расписанию.
1. Отключаем дефолтный WP-Cron в wp-config.php
define( 'DISABLE_WP_CRON', true );Добавьте эту строку в wp-config.php перед строкой /* That's all, stop editing! Happy blogging. */.
2. Настраиваем системный cron на сервере
Подключитесь к серверу по SSH и откройте редактор crontab:
crontab -eДобавьте следующую строку для запуска WP-Cron каждые 15 минут:
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Или, если доступна команда curl:
*/15 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Не забудьте заменить https://example.com на URL вашего сайта.
3. Проверяем работу запланированных задач
Вернитесь в админку WordPress и установите плагин WP Crontrol. В разделе "Инструменты > Cron Events" вы увидите список задач и время их следующего запуска. Убедитесь, что время обновляется и задачи выполняются.
Как проверить, что решение сработало
- В плагине WP Crontrol проверьте, что задачи запускаются в соответствии с системным cron.
- Создайте тестовую задачу с логированием в файл и убедитесь, что файл обновляется по расписанию:
add_action( 'test_cron_hook', 'test_cron_function' );
if ( ! wp_next_scheduled( 'test_cron_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'test_cron_hook' );
}
function test_cron_function() {
file_put_contents( WP_CONTENT_DIR . '/cron_test.log', date('Y-m-d H:i:s') . " - cron executed\n", FILE_APPEND );
}Частые ошибки при настройке WP-Cron и как их исправить
- Ошибка: WP-Cron не запускается из-за кеширования страниц (например, при использовании плагина кеша).
Решение: исключите URL/wp-cron.phpиз кеширования в настройках плагина. - Ошибка: Неверный URL или отсутствие протокола в crontab.
Решение: всегда используйте полный URL с протоколомhttps://илиhttp://. - Ошибка: Системный cron не работает из-за отсутствия прав или настроек сервера.
Решение: проверьте права пользователя, под которым запускается cron, и логи сервера.
Практические советы по безопасности и производительности
- Не запускайте WP-Cron слишком часто — достаточно 15 минут для большинства сайтов.
- Отключайте WP-Cron на уровне WordPress, чтобы избежать одновременного запуска нескольких процессов при высокой нагрузке.
- Для больших сайтов с интенсивными задачами рассмотрите использование сторонних сервисов cron, например, cron-job.org.
- Обязательно исключайте
/wp-cron.phpиз кеширования и защиты от DDoS в настройках сервера или плагина безопасности.
Сравнение вариантов запуска WP-Cron
| Способ | Плюсы | Минусы | Использование |
|---|---|---|---|
| Дефолтный WP-Cron (по посещению) | Прост в настройке, не требует сервера | Не надежен при низкой посещаемости, задержки | Малые сайты с небольшим трафиком |
| Системный cron (через wget/curl) | Надежный и точный запуск задач | Требует SSH-доступ и настройки сервера | Любые сайты, особенно с интенсивными задачами |
| Внешние сервисы cron | Не зависит от сервера, простой мониторинг | Зависимость от сторонних сервисов | Большие проекты и высоконагруженные сайты |