Что такое WP-Cron и зачем он нужен в WordPress
WP-Cron — это встроенный планировщик задач WordPress, который позволяет запускать запланированные функции и события без необходимости настраивать системный cron на сервере. Он полезен для автоматизации рутинных задач: например, публикации отложенных записей, очистки базы данных, отправки регулярных писем и обновления данных.
Диагностика проблем с WP-Cron
Основные признаки проблем с WP-Cron:
- Запланированные задачи не выполняются вовремя;
- Отложенные публикации не выходят в назначенное время;
- Плагины, завязанные на cron-задачи, перестали работать корректно.
Для диагностики можно проверить журнал задач с помощью плагина WP Crontrol. Он позволяет просматривать и редактировать события, а также запускать их вручную.
Проверка работоспособности WP-Cron
Добавьте в файл functions.php вашей темы следующий код, чтобы проверить, вызывается ли cron:
add_action('wp', function() {
if (!wp_next_scheduled('my_test_cron_hook')) {
wp_schedule_event(time(), 'hourly', 'my_test_cron_hook');
}
});
add_action('my_test_cron_hook', function() {
error_log('WP-Cron сработал: ' . current_time('mysql'));
});После захода на сайт проверьте файл debug.log (если включено логирование) или серверные логи — должна появиться запись с текущим временем. Если записи нет, WP-Cron не срабатывает.
Пошаговое решение настройки WP-Cron
1. Отключение встроенного WP-Cron (если нужно)
По умолчанию WP-Cron запускается при каждом посещении сайта, что может замедлять работу при высокой нагрузке. Для корректной настройки системного cron рекомендуем отключить его в wp-config.php:
define('DISABLE_WP_CRON', true);2. Настройка системного cron на сервере
Добавьте в планировщик задач на сервере (crontab) команду для вызова cron.php каждые 5 минут:
*/5 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Или с помощью curl:
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Замените https://example.com на ваш домен.
3. Создание и регистрация пользовательских cron-задач
Добавьте в functions.php следующий пример для запуска задачи раз в час:
function register_custom_cron_schedule($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300, // 300 секунд = 5 минут
'display' => __('Каждые 5 минут')
];
return $schedules;
}
add_filter('cron_schedules', 'register_custom_cron_schedule');
function schedule_custom_task() {
if (!wp_next_scheduled('custom_task_hook')) {
wp_schedule_event(time(), 'every_five_minutes', 'custom_task_hook');
}
}
add_action('wp', 'schedule_custom_task');
function custom_task_function() {
// Ваш код задачи, например, очистка транзиентов
global $wpdb;
$wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP() - 3600");
}
add_action('custom_task_hook', 'custom_task_function');Как проверить, что WP-Cron работает правильно
- Убедитесь, что в плагине WP Crontrol запланированные задачи отображаются и имеют статус «активно»;
- Включите логирование и проверьте появление записей из обработчиков cron;
- Проверьте, что задачи выполняются по расписанию, например, очистка кэша или обновление данных происходит без задержек;
- Для системного cron убедитесь, что планировщик на сервере работает и команты вызывают
wp-cron.phpбез ошибок.
Частые ошибки и их исправление
- DISABLE_WP_CRON не установлен, но системный cron настроен: приводит к двойному выполнению задач или конфликтам. Проверьте
wp-config.php. - Неправильный URL в системном cron: убедитесь, что домен и протокол указаны верно без лишних слэшей.
- Вызывается wp-cron.php в браузере, но задачи не выполняются: проверьте права на файл, доступность сайта из командной строки, нет ли ошибок PHP.
- Плагины конфликтуют с WP-Cron: временно отключите сторонние плагины и протестируйте cron, затем включайте по одному.
Практические советы по безопасности и производительности
- Отключайте WP-Cron при большом трафике и переносите запуск на системный cron — это снизит нагрузку на сайт.
- Проверяйте длительность выполнения задач — тяжелые задачи лучше разбивать или запускать реже.
- Используйте nonce и проверки прав для кода, вызываемого в cron, если он взаимодействует с данными пользователей.
- Регулярно очищайте устаревшие задачи cron с помощью плагинов или SQL-запросов для предотвращения засорения базы данных.
Сравнение способов запуска WP-Cron
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Встроенный WP-Cron | Прост в использовании, не требует доступа к серверу | Зависит от посещаемости сайта, может работать с задержками | Маленькие сайты с низкой и средней посещаемостью |
| Системный cron | Надежный, запускается точно по расписанию, снижает нагрузку | Требует доступа к серверу, настройка сложнее | Сайты с высоким трафиком и критическими задачами |