WP-Cron — встроенный механизм WordPress для запуска запланированных задач. Однако по умолчанию он запускается при обращении к сайту, что не всегда удобно, особенно для задач с отложенным стартом или длительным интервалом. В этой статье я подробно расскажу, как эффективно использовать WP-Cron для запуска отложенных задач, приведу примеры кода и дам советы по оптимизации.
Что такое WP-Cron и как он работает
WP-Cron — это имитация системного cron для WordPress. Когда пользователь посещает сайт, WordPress проверяет, есть ли запланированные задачи, и если время пришло — запускает их. Такой подход удобен, так как не требует настройки серверного cron, но имеет ограничения:
- Если на сайт долго не заходят, задачи могут не запуститься вовремя.
- При высоком трафике WP-Cron может запускаться слишком часто, создавая нагрузку.
- Сложно организовать точный момент запуска, например, через 10 минут после какого-то события.
Поэтому для задач с отложенным стартом нужно использовать дополнительные техники.
Как запланировать задачу с отложенным стартом
Чтобы запланировать задачу, используем функцию wp_schedule_single_event(). Она позволяет выполнить действие один раз в заданное время.
Пример: нужно отправить уведомление через 15 минут после регистрации пользователя.
function wptips_schedule_delay_task($user_id) {
$timestamp = time() + 15 * 60; // 15 минут от текущего времени
wp_schedule_single_event($timestamp, 'wptips_send_delayed_notification', array($user_id));
}
add_action('user_register', 'wptips_schedule_delay_task');
function wptips_send_delayed_notification($user_id) {
$user_info = get_userdata($user_id);
wp_mail($user_info->user_email, 'Приветственное письмо', 'Спасибо за регистрацию!');
}В этом примере после регистрации пользователя запланируется однократное событие через 15 минут, которое отправит ему письмо.
Пояснения к коду
wp_schedule_single_event()принимает три параметра: метку времени запуска, имя хука и массив аргументов.- Хук
wptips_send_delayed_notificationдолжен быть связан с функцией, которая выполнит задачу. - Для привязки используем
add_action().
Как проверить и удалить запланированные задачи
Иногда полезно узнать, какие задачи запланированы, и при необходимости их отменить.
Для проверки используйте функцию wp_next_scheduled(). Если она возвращает false — задача не запланирована.
$timestamp = wp_next_scheduled('wptips_send_delayed_notification', array($user_id));
if ($timestamp) {
echo 'Задача запланирована на: ' . date('Y-m-d H:i:s', $timestamp);
} else {
echo 'Задача не запланирована';
}Чтобы отменить запланированное событие, используйте wp_unschedule_event() или wp_clear_scheduled_hook().
$timestamp = wp_next_scheduled('wptips_send_delayed_notification', array($user_id));
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptips_send_delayed_notification', array($user_id));
}Решение проблемы с ненадежностью WP-Cron
По умолчанию WP-Cron запускается только при посещении сайта, что делает его ненадежным при низком трафике. Чтобы это исправить, чаще всего рекомендуют отключить WP-Cron и настроить системный cron на сервере.
Для отключения WP-Cron добавьте в wp-config.php:
define('DISABLE_WP_CRON', true);Затем настройте cron на сервере, чтобы он запускал скрипт каждые 5 минут (пример для Linux):
*/5 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1Такой подход обеспечит стабильный запуск задач без зависимости от трафика.
Пример комплексного использования WP-Cron с плагином Clearfy Pro
Плагин Clearfy Pro позволяет управлять и оптимизировать задачи WP-Cron, включая очистку и мониторинг запланированных событий. Это удобно для поддержки стабильной работы сайта без лишних нагрузок.
В Clearfy Pro реализован модуль, который позволяет отключить ненужные WP-Cron задачи плагинов, часто создающих избыточный cron, что улучшает производительность.
Рекомендации по оптимизации задач с отложенным стартом
- Используйте
wp_schedule_single_event()для однократных задач с точным временем запуска. - Для повторяющихся задач применяйте
wp_schedule_event()с интервалами, зарегистрированными черезcron_schedules. - Обязательно проверяйте существование запланированных задач, чтобы не создавать дубли.
- При большом количестве задач рассмотрите переход на системный cron.
- Используйте инструменты мониторинга WP-Cron, например в Clearfy Pro или сторонних плагинах.
Регистрация пользовательского интервала
Если нужно задать собственный интервал, добавьте фильтр:
function wptips_custom_cron_intervals($schedules) {
$schedules['every_10_minutes'] = array(
'interval' => 600,
'display' => 'Каждые 10 минут'
);
return $schedules;
}
add_filter('cron_schedules', 'wptips_custom_cron_intervals');Теперь можно использовать интервал every_10_minutes в wp_schedule_event().
Выводы
WP-Cron — мощный инструмент для планирования задач в WordPress, но при работе с отложенным стартом важно понимать ограничения стандартного механизма. Используйте wp_schedule_single_event() для точного запуска, контролируйте запланированные задачи, и при необходимости переключайте WP-Cron на системный cron для надежности. Плагины наподобие Clearfy Pro помогут упростить управление и оптимизацию задач.