Что такое WP-Cron и зачем он нужен в WordPress
WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет запускать определённые функции в заданное время или с заданным интервалом. Он используется для автоматического выполнения фоновых задач: публикации запланированных постов, очистки базы данных, отправки рассылок, обновления кэша и прочего.
В отличие от системного cron на сервере, WP-Cron работает только при обращении к сайту, что может вызывать задержки или непредсказуемость выполнения задач.
Диагностика проблем с WP-Cron
Если у вас возникают проблемы с автозапуском задач в WordPress (например, не публикуются запланированные посты или не выполняются очистки), первым делом стоит проверить, работает ли WP-Cron:
- Проверка включения WP-Cron: в файле
wp-config.phpне должно быть строкиdefine('DISABLE_WP_CRON', true);. Если она есть — WP-Cron отключён. - Проверка вызова cron-заданий: вручную вызовите URL
https://ваш-сайт.ru/wp-cron.php?doing_wp_cronв браузере. Если при этом возникают ошибки или страница долго отвечает — возможны проблемы с сервером или блокировкой запроса. - Логирование задач: можно использовать плагин WP Crontrol для просмотра запланированных задач и их статуса.
Пошаговое создание и настройка собственного cron-задачи в WordPress
1. Регистрация собственного интервала повторения
Для нестандартных интервалов нужно добавить фильтр cron_schedules. Например, добавим интервал в 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 my_custom_cron_task() {
// Пример очистки кэша
if (function_exists('wp_cache_flush')) {
wp_cache_flush();
}
error_log('WP-Cron: Кэш очищен в ' . current_time('mysql'));
}3. Регистрация задачи в планировщике
Добавим задачу, если она ещё не зарегистрирована:
add_action('my_custom_cron_hook', 'my_custom_cron_task');
if (!wp_next_scheduled('my_custom_cron_hook')) {
wp_schedule_event(time(), 'every_ten_minutes', 'my_custom_cron_hook');
}4. Очистка задачи при деактивации плагина или темы
Чтобы избежать накопления задач, удаляем их при деактивации:
function my_custom_cron_deactivate() {
$timestamp = wp_next_scheduled('my_custom_cron_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'my_custom_cron_hook');
}
}
register_deactivation_hook(__FILE__, 'my_custom_cron_deactivate');Проверка результата после внедрения
- Установите плагин
WP Crontrolи убедитесь, что в списке событий появилась ваша задачаmy_custom_cron_hookс нужным интервалом. - Проверьте логи PHP (error_log), там должна появиться запись о выполнении задачи с текущим временем.
- Для принудительного запуска задачи используйте кнопку "Run Now" в плагине WP Crontrol или вызовите вручную
do_action('my_custom_cron_hook');. - Убедитесь, что задача выполняется регулярно при обращении к сайту (например, каждые 10 минут).
Частые ошибки и как их исправить
- DISABLE_WP_CRON установлен в true: отключает WP-Cron. Уберите эту строку из
wp-config.phpили установите в false. - Отсутствие посещений сайта: WP-Cron запускается только при обращении к сайту. Для сайтов с малым трафиком настройте системный cron для вызова
wp-cron.phpчерез wget или curl. - Неправильные имена хуков: регистрируйте и вызывайте задачи через одинаковые имена, учитывайте префиксы и регистр.
- Повторное создание задач: всегда проверяйте через
wp_next_scheduled(), чтобы не создавать дубликаты. - Ошибки в коде функции задачи: используйте логи и отладку, чтобы убедиться, что задача не вызывает фатальных ошибок.
Практические советы по безопасности и производительности
- Не запускайте ресурсоёмкие задачи слишком часто: подберите оптимальный интервал, чтобы не перегружать сервер.
- Используйте системный cron при низком трафике: добавьте в crontab команду
wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1с нужной периодичностью. - Проверяйте авторизацию и безопасность функций: если задача взаимодействует с внешними сервисами, добавьте проверку прав и защиту от злоупотреблений.
- Логируйте выполнение задач: используйте
error_log()или специальные плагины для мониторинга статуса cron-задач.
Сравнение вариантов запуска cron-задач
| Метод | Плюсы | Минусы |
|---|---|---|
| Встроенный WP-Cron | Простота настройки, работает без сервера cron | Зависимость от посещаемости, возможны задержки |
| Системный cron (серверный) | Точная периодичность, надежность выполнения | Требуется доступ к серверу, настройка через SSH |
| Плагины для управления cron | Удобный интерфейс, мониторинг и отладка | Дополнительная нагрузка, может конфликтовать с другими плагинами |