Что такое WP-Cron и зачем он нужен
WP-Cron — это встроенный в WordPress механизм планировщика задач, позволяющий запускать функции по расписанию. Он полезен для автоматизации рутинных процессов: автоматическое обновление данных, отправка email, очистка базы, синхронизация с внешними сервисами и многое другое.
Особенности работы WP-Cron
- WP-Cron запускается при заходе пользователя на сайт, а не по системному времени сервера.
- Если на сайт нет трафика, задачи не выполняются вовремя.
- WP-Cron может приводить к задержкам или конфликтам при большом количестве задач.
Диагностика проблем с WP-Cron
Если задачи не выполняются своевременно, проверьте следующие моменты:
- Активирован ли WP-Cron? В файле
wp-config.phpне должно бытьdefine('DISABLE_WP_CRON', true);. - Проверить, запускается ли WP-Cron при посещениях сайта: можно использовать плагин WP Crontrol.
- Проверить логи сервера на ошибки, связанные с WP-Cron.
- Проверить, не блокируют ли серверные настройки (например, firewall, ModSecurity) запросы к
wp-cron.php.
Пошаговое создание и регистрация пользовательской задачи WP-Cron
Рассмотрим, как добавить задачу, которая будет автоматически запускаться каждые 10 минут и выполнять определённый код.
1. Добавляем интервал 10 минут
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['every_ten_minutes'])) {
$schedules['every_ten_minutes'] = [
'interval' => 600, // 600 секунд = 10 минут
'display' => __('Каждые 10 минут')
];
}
return $schedules;
});2. Регистрируем задачу при инициализации
function myplugin_activate_cron() {
if (!wp_next_scheduled('myplugin_every_ten_minutes')) {
wp_schedule_event(time(), 'every_ten_minutes', 'myplugin_every_ten_minutes');
}
}
add_action('wp', 'myplugin_activate_cron');3. Создаем функцию-обработчик задачи
add_action('myplugin_every_ten_minutes', function() {
// Здесь ваш код, например, очистка устаревших данных
global $wpdb;
$wpdb->query("DELETE FROM wp_sessions WHERE session_expiry < UNIX_TIMESTAMP()");
});4. Отмена задачи при деактивации плагина
function myplugin_deactivate_cron() {
$timestamp = wp_next_scheduled('myplugin_every_ten_minutes');
if ($timestamp) {
wp_unschedule_event($timestamp, 'myplugin_every_ten_minutes');
}
}
register_deactivation_hook(__FILE__, 'myplugin_deactivate_cron');Проверка работы WP-Cron задачи
Для проверки, что задача успешно выполняется:
- Установите плагин WP Crontrol. В разделе «Cron Events» найдите событие
myplugin_every_ten_minutes. Убедитесь, что оно запланировано и не имеет ошибок. - Добавьте в функцию-обработчик логирование в файл, например,
error_log('WP-Cron myplugin_every_ten_minutes выполнен');. Проверьте логи сервера (обычноerror_logили через панель хостинга). - Для принудительного запуска используйте кнопку "Run Now" в WP Crontrol.
Частые ошибки и как исправить
- Задачи не запускаются: вероятно, в
wp-config.phpотключён WP-Cron (DISABLE_WP_CRON), либо сервер блокирует запросы кwp-cron.php. Проверьте настройки firewall и .htaccess. - Несвоевременный запуск: WP-Cron зависит от посещений сайта. Если мало трафика, используйте системный cron (Linux cron job), настроив вызов
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1каждые 5 минут. - Дублирование задач: перед планированием новой задачи всегда проверяйте, нет ли уже запланированной с помощью
wp_next_scheduled().
Практические советы по безопасности и производительности WP-Cron
- Запускайте тяжелые задачи с помощью системного cron, чтобы не нагружать сайт при заходах пользователей.
- Ограничьте доступ к
wp-cron.phpпо IP, если используете внешний вызов системного cron. - Используйте WP Crontrol для мониторинга и удаления устаревших или ненужных задач.
- Для интеграций с внешними API добавляйте обработку ошибок и таймауты, чтобы задача не зависла.
Сравнение вариантов запуска WP-Cron задач
| Вариант | Плюсы | Минусы |
|---|---|---|
| Встроенный WP-Cron | Прост в настройке, не требует доступа к серверу | Зависит от трафика, возможны задержки |
| Системный cron (Linux) | Точный запуск по расписанию, стабильность | Нужен доступ к серверу, настройка через SSH |
| Внешние сервисы (например, cron-job.org) | Не требует сервера, легко настроить | Зависит от стороннего сервиса, возможны ограничения по частоте |