В WordPress хуки (actions и filters) позволяют вмешиваться в процесс загрузки и выполнения кода. Иногда возникает задача выполнить определённые действия не сразу, а с задержкой — например, через минуту, час или в определённое время. В этой статье разберём, как организовать отложенное выполнение кода с помощью хуков и планировщика задач WP-Cron, а также рассмотрим практические примеры с кодом.
Что такое отложенное выполнение кода в WordPress и зачем оно нужно?
Отложенное выполнение — это запуск функции или набора функций не сразу, а через определённый промежуток времени. Такое решение полезно, когда нужно:
- выполнить тяжёлую операцию после завершения пользовательского запроса, чтобы не замедлять загрузку страницы;
- запланировать регулярные задачи (например, очистку базы, отправку рассылок, обновление данных);
- автоматизировать процессы, которые не требуют мгновенного результата;
- избежать блокировок или таймаутов сервера при длительных операциях.
WordPress имеет встроенный механизм планировщика задач — WP-Cron, который позволяет запускать функции в заданное время.
Использование WP-Cron для отложенного запуска функций
WP-Cron — это имитация системного cron, который работает через запросы к сайту. Вы можете запланировать событие с помощью функции wp_schedule_single_event() или wp_schedule_event().
Пример: отложенный вызов функции через 5 минут
function wpfix_deferred_task() {
// Ваш код, который нужно выполнить отложенно
error_log('Отложенная задача выполнена: ' . current_time('mysql'));
}
// Регистрируем хук
add_action('wpfix_deferred_event', 'wpfix_deferred_task');
// Запланировать событие через 5 минут
function wpfix_schedule_deferred_task() {
if (!wp_next_scheduled('wpfix_deferred_event')) {
wp_schedule_single_event(time() + 300, 'wpfix_deferred_event');
}
}
// Вызываем планировщик, например, при инициализации админки
add_action('admin_init', 'wpfix_schedule_deferred_task');
В этом коде при загрузке админки запускается планировщик, который проверяет, не запланировано ли уже событие wpfix_deferred_event. Если нет, то создаёт одноразовое событие через 5 минут. Когда время наступит, WordPress вызовет функцию wpfix_deferred_task.
Отложенное выполнение при сохранении записи
Представим, что при сохранении записи нужно через 10 минут обновить кэш или выполнить другую тяжёлую операцию.
function wpfix_schedule_post_update_cache($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
$hook = 'wpfix_update_post_cache_' . $post_id;
if (!wp_next_scheduled($hook)) {
wp_schedule_single_event(time() + 600, $hook, array($post_id));
}
}
add_action('save_post', 'wpfix_schedule_post_update_cache');
function wpfix_update_post_cache($post_id) {
// Логика обновления кэша
error_log('Обновление кэша для поста ID: ' . $post_id);
}
// Регистрируем динамический хук
add_action('wpfix_update_post_cache_' . get_the_ID(), 'wpfix_update_post_cache');
Однако динамические хуки с параметрами лучше регистрировать с помощью add_action с именем хука и приоритетом, чтобы избежать ошибок. Более правильный способ — использовать базовый хук и передавать аргументы:
function wpfix_schedule_post_update_cache($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
if (!wp_next_scheduled('wpfix_update_post_cache', array($post_id))) {
wp_schedule_single_event(time() + 600, 'wpfix_update_post_cache', array($post_id));
}
}
add_action('save_post', 'wpfix_schedule_post_update_cache');
function wpfix_update_post_cache_handler($post_id) {
// Обновляем кэш
error_log('Обновление кэша для поста ID: ' . $post_id);
}
add_action('wpfix_update_post_cache', 'wpfix_update_post_cache_handler');
Обработка повторяющихся задач с WP-Cron
Если нужно выполнять задачу регулярно, например, каждые 6 часов, используйте wp_schedule_event() с интервалом.
Добавление собственного интервала
function wpfix_custom_cron_schedules($schedules) {
$schedules['every_six_hours'] = array(
'interval' => 21600, // 6 часов в секундах
'display' => 'Каждые 6 часов'
);
return $schedules;
}
add_filter('cron_schedules', 'wpfix_custom_cron_schedules');
Запланировать повторяющуюся задачу
function wpfix_schedule_repeating_task() {
if (!wp_next_scheduled('wpfix_repeating_event')) {
wp_schedule_event(time(), 'every_six_hours', 'wpfix_repeating_event');
}
}
add_action('wp', 'wpfix_schedule_repeating_task');
function wpfix_repeating_task_handler() {
// Код повторяющейся задачи
error_log('Повторяющаяся задача выполнена: ' . current_time('mysql'));
}
add_action('wpfix_repeating_event', 'wpfix_repeating_task_handler');
Полезные плагины для управления WP-Cron
Для удобства управления задачами WP-Cron можно использовать плагины. Вот несколько рекомендаций:
- WP Crontrol — позволяет просматривать и редактировать задачи WP-Cron из админки.
- Clearfy Pro — оптимизирует работу WordPress, в том числе управляет задачами cron и их производительностью.
Использование подобных инструментов поможет контролировать и отлаживать отложенное выполнение кода.
Советы и подводные камни при работе с WP-Cron
WP-Cron запускается при посещении сайта, поэтому если у вас низкий трафик, задачи могут выполняться с задержкой. Для критичных задач рекомендуют настроить системный cron и отключить WP-Cron, чтобы запускать wp-cron.php по расписанию.
Пример настройки системного cron (Linux):
* * * * * wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Также стоит проверять, чтобы задачи не дублировались — для этого используйте wp_next_scheduled() перед планированием.
Вывод
Отложенное выполнение кода в WordPress через хуки и WP-Cron — мощный механизм для автоматизации и оптимизации работы сайта. Используя планировщик, вы можете выполнить задачи с задержкой, не нагружая пользователя и сервер в момент запроса. Важно грамотно регистрировать задачи, контролировать их повторения и использовать инструменты для мониторинга cron.
Для улучшения работы с WP-Cron можно рассмотреть использование плагина Clearfy Pro, который поможет оптимизировать и контролировать выполнение задач.