Использование хука WooCommerce 'woocommerce_order_status_changed' для автоматизации обновлений

Что такое хук 'woocommerce_order_status_changed' и зачем он нужен

Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Он принимает четыре аргумента: ID заказа, старый статус, новый статус и объект заказа. Это позволяет запускать автоматические процессы в зависимости от смены статуса — например, отправлять уведомления, обновлять внешние сервисы или изменять данные заказа.

Диагностика: как понять, что хук срабатывает

Чтобы убедиться, что хук работает, можно временно добавить простую запись в лог:

add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status, $order) {
    error_log("Order #$order_id changed from $old_status to $new_status");
}, 10, 4);

После смены статуса заказа проверьте файл debug.log в каталоге wp-content (при включённом WP_DEBUG_LOG). Если запись появилась, значит хук подключен и срабатывает корректно.

Пошаговое решение: автоматизация отправки письма при смене статуса на "completed"

Рассмотрим типичную задачу — отправка кастомного уведомления клиенту, когда заказ переходит в статус completed.

1. Подключаем хук с проверкой статуса

add_action('woocommerce_order_status_changed', 'send_custom_email_on_completed', 10, 4);
function send_custom_email_on_completed($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'completed' && $old_status !== 'completed') {
        $to = $order->get_billing_email();
        $subject = 'Спасибо за ваш заказ!';
        $message = 'Ваш заказ #' . $order_id . ' успешно выполнен. Благодарим за покупку!';
        wp_mail($to, $subject, $message);
    }
}

2. Проверяем отправку письма

Советую добавить логирование отправки, чтобы убедиться в работе:

if (wp_mail($to, $subject, $message)) {
    error_log("Custom email sent for order #$order_id");
} else {
    error_log("Failed to send custom email for order #$order_id");
}

После смены статуса на completed проверьте, что письмо пришло и в логе появилась запись об успешной отправке.

Как проверить результат после внедрения

  • Создайте тестовый заказ в WooCommerce.
  • Переведите статус заказа в админке в completed.
  • Проверьте почту, указанную в заказе — должно прийти письмо с вашим сообщением.
  • Просмотрите debug.log для подтверждения срабатывания хука и успешной отправки письма.

Частые ошибки при работе с хуком и их исправление

  • Хук не срабатывает: проверьте, что код добавлен в файл functions.php активной темы или в плагин. Убедитесь, что нет конфликтов с другими плагинами.
  • Письмо не отправляется: убедитесь, что функция wp_mail корректно настроена на вашем сервере, нет блокировок SMTP и почтового сервиса.
  • Проверка статусов сделана неверно: используйте точное сравнение статусов, учитывайте, что статусы — это строки, например 'completed', 'processing'.

Практические советы по безопасности и производительности

  • Не запускайте тяжёлые операции в хук напрямую — если нужно, используйте wp_schedule_single_event для отложенного выполнения.
  • Всегда фильтруйте и валидируйте данные, получаемые из объекта заказа.
  • Для отправки писем используйте специализированные SMTP-плагины, чтобы избежать попадания в спам.
  • Логирование включайте только для отладки, чтобы не засорять логи в продакшене.

Сравнение вариантов реализации автоматизации на хуке 'woocommerce_order_status_changed'

МетодПлюсыМинусыКогда использовать
Прямое выполнение в хукеПросто и быстро реализуетсяРиск замедления заказа, если операции тяжёлыеЛёгкие уведомления, небольшие действия
Отложенное выполнение через WP CronНе блокирует основной поток, можно запускать тяжелые задачиЗависит от настроек крон и нагрузки сервераОбработка больших данных, интеграция с внешними API
Использование сторонних плагинов для автоматизацииГотовые решения, удобный интерфейсМожет быть избыточно, нагрузка, зависимость от плагинаЕсли нужно без кода и быстро
Как удалить заблокированных пользователей в WordPress с помощью кода
07.01.2026
Удаление неиспользуемых метаданных WordPress для оптимизации базы данных
11.12.2025
Как автоматизировать удаление неиспользуемых transient в WordPress
16.04.2026
Как отключить AJAX подгрузку комментариев в WordPress
02.02.2026
Оптимизация базы данных WordPress для ускорения сайта
17.11.2025