Как использовать хук WooCommerce 'order status changed' для кастомной логики

Диагностика задачи: зачем нужен хук изменения статуса заказа

В WooCommerce нередко возникает необходимость выполнять действия при смене статуса заказа — например, отправить уведомление, обновить внешнюю систему, изменить метаданные заказа или добавить кастомную логику бизнес-процесса. WooCommerce предоставляет специализированный хук woocommerce_order_status_changed, который срабатывает при любом изменении статуса заказа. Правильное использование этого хука позволяет надежно интегрировать дополнительный функционал без модификации ядра.

Пошаговое решение: как подключить и использовать хук

1. Подключение к хуку в functions.php или плагине

Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин:

add_action('woocommerce_order_status_changed', 'custom_order_status_changed', 10, 4);
function custom_order_status_changed($order_id, $old_status, $new_status, $order) {
    // Проверяем, например, переход со статуса 'pending' на 'processing'
    if ($old_status === 'pending' && $new_status === 'processing') {
        // Ваша логика
        error_log("Заказ #{$order_id} изменил статус с {$old_status} на {$new_status}");
        // Например, отправка кастомного уведомления
        $to = 'manager@example.com';
        $subject = "Заказ #{$order_id} перешел в обработку";
        $message = "Проверьте заказ #{$order_id} в панели WooCommerce.";
        wp_mail($to, $subject, $message);
    }
}

2. Пояснения к параметрам функции

  • $order_id — ID заказа;
  • $old_status — предыдущий статус (например, 'pending');
  • $new_status — новый статус (например, 'processing');
  • $order — объект WC_Order с полным набором данных заказа.

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

Чтобы проверить, что хук работает корректно:

  1. Перейдите в админку WooCommerce и измените статус одного из заказов с pending на processing.
  2. Проверьте логи PHP (например, error_log), там должна появиться запись о смене статуса.
  3. Проверьте почту, если отправляете уведомления — письмо должно прийти.

Для отладки можно добавить временный вызов error_log(print_r($order, true)); чтобы убедиться, что объект заказа передается корректно.

Частые ошибки и как исправить

  • Хук не срабатывает: убедитесь, что код действительно подключен (например, в активной теме или плагине), и что при изменении статуса заказ сохраняется через админку WooCommerce, а не напрямую в базе.
  • Почта не отправляется: проверьте настройки SMTP, используйте плагины типа WP Mail SMTP для отладки отправки писем.
  • Неверные статусы в условии: используйте точные строковые значения статусов, например, pending, processing, completed. Для проверки вызовите wc_get_order_statuses().

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

  • Если логика сложная — не выполняйте тяжелые операции в хуке напрямую, а делегируйте их в очередь задач WP Cron или внешние сервисы.
  • Используйте проверки прав доступа, если данные заказа отправляются во внешние системы.
  • Для отправки почты лучше использовать асинхронные методы или специализированные SMTP-сервисы, чтобы не замедлять обработку запроса.

Сравнение подходов: плагин vs код

МетодПреимуществаНедостатки
Код в functions.php или плагинеПолный контроль, гибкость, нет лишних зависимостейТребует навыков программирования, риск ошибок при обновлениях
Плагины для кастомной логики (например, AutomateWoo)Простая настройка, визуальные интерфейсы, поддержкаНагрузка на сайт, стоимость, ограниченная гибкость
Как создать собственный виджет в WordPress с поддержкой настроек
13.11.2025
Как удалить или изменить атрибуты продуктов WooCommerce через код
25.04.2026
Как удалить дубликаты продуктов WooCommerce с помощью кода
17.05.2026
Как создать настройки для своего плагина в WordPress
17.11.2025
Как удалить или изменить метаданные пользователя в WordPress
24.01.2026