Что такое WP-Cron и зачем он нужен в WordPress?
WP-Cron — это встроенный механизм планирования задач в WordPress, который позволяет запускать функции по расписанию без необходимости настраивать системный cron на сервере. Это удобно для автоматизации рутинных задач: очистка кеша, отправка email-уведомлений, обновление данных и т.п.
Диагностика проблем с WP-Cron
Часто WP-Cron не срабатывает вовремя по следующим причинам:
- На сайте низкий трафик — задачи запускаются только при заходе пользователя.
- Системный cron отключен или wp-cron.php не вызывается автоматически.
- Конфликты плагинов, блокирующих запросы к wp-cron.php.
Как проверить работу WP-Cron:
- Добавьте код для отладки:
add_action('wp', function() {
if (!wp_next_scheduled('my_test_cron')) {
wp_schedule_event(time(), 'minute', 'my_test_cron');
}
});
add_action('my_test_cron', function() {
error_log('WP-Cron сработал: ' . date('Y-m-d H:i:s'));
});Зайдите на сайт, после чего проверьте файл debug.log в папке wp-content. Если запись появилась — WP-Cron работает.
Как настроить системный cron для надежной работы WP-Cron
Рекомендуется отключить обычный WP-Cron и настроить вызов wp-cron.php через системный cron, чтобы задачи выполнялись регулярно независимо от трафика.
1. В wp-config.php добавьте:
define('DISABLE_WP_CRON', true);2. Настройте системный cron на сервере (пример для Linux, запуск каждые 5 минут):
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или альтернативно:
*/5 * * * * php /path/to/your/site/wp-cron.php > /dev/null 2>&1Путь к PHP и сайту замените на реальные значения.
Создание собственной периодической задачи с кастомным интервалом
По умолчанию доступны интервалы «hourly», «twicedaily», «daily». Для кастомных интервалов добавьте фильтр:
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => 'Каждые 5 минут'
];
return $schedules;
});
// Запланировать задачу
if (!wp_next_scheduled('my_custom_cron')) {
wp_schedule_event(time(), 'every_five_minutes', 'my_custom_cron');
}
// Хук задачи
add_action('my_custom_cron', function() {
// Ваш код задачи
error_log('Моя задача запущена: ' . date('Y-m-d H:i:s'));
});Проверка результата после внедрения
- Убедитесь, что в
debug.logпоявляются записи с отметкой времени запуска задачи. - Проверьте в базе данных таблицу
wp_optionsзапись с ключомcron, чтобы увидеть расписание задач. - Используйте плагин WP Crontrol для удобного просмотра и управления задачами WP-Cron.
Частые ошибки и как их исправить
- Задачи не запускаются: Проверьте, не отключен ли WP-Cron через
DISABLE_WP_CRONбез настройки системного cron. - Проблемы с URL вызова wp-cron.php: Убедитесь, что адрес сайта и протокол корректны в системном cron (http vs https).
- Блокировка запросов к wp-cron.php: Некоторые плагины безопасности или серверные firewall могут блокировать вызовы по URL. Проверьте логи сервера и настройки плагинов.
- Повторное создание задач: Перед планированием задачи проверяйте, не запланирована ли она уже через
wp_next_scheduled(), чтобы не создавать дубли.
Практические советы по безопасности и производительности
- Вызывайте
wp-cron.phpчерез системный cron, а не по каждому заходу пользователя — это снизит нагрузку. - Ограничьте права пользователя, под которым запускается системный cron, чтобы избежать рисков безопасности.
- Используйте уникальные имена хуков для своих задач, чтобы избежать конфликтов с плагинами.
- Используйте
wp_clear_scheduled_hook()для удаления устаревших задач.
Сравнение вариантов выполнения cron задач в WordPress
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Встроенный WP-Cron (по заходу пользователя) | Простая настройка, не требует доступа к серверу | Зависит от трафика, задержки запуска задач | По умолчанию в WordPress |
| Системный Cron (через crontab) | Надежный запуск по расписанию, независим от трафика | Требует доступа к серверу и базовых знаний Linux | crontab -e + wget или php вызов |
| Плагины для управления WP-Cron | Удобный интерфейс, отладка и управление задачами | Дополнительная нагрузка, возможные конфликты | WP Crontrol, Advanced Cron Manager |