Как использовать хук woocommerce_order_status_changed для автоматизации обработки заказов в WooCommerce

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

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

Диагностика задачи: автоматизация после изменения статуса заказа

Частая задача — выполнять определённые действия при смене статуса заказа. Если вы заметили, что эти действия не выполняются, проверьте, правильно ли подключён хук и корректно ли обрабатываются параметры. Например, если не срабатывают почтовые уведомления или интеграция с CRM, причина может быть в неправильной логике в функции-обработчике.

Пошаговое решение: как добавить обработчик на изменение статуса заказа

  1. Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:
add_action('woocommerce_order_status_changed', 'custom_order_status_changed_action', 10, 5);
function custom_order_status_changed_action($order_id, $old_status, $new_status, $order) {
    // Пример: при смене статуса на completed отправляем кастомное уведомление
    if ($new_status === 'completed') {
        $to = $order->get_billing_email();
        $subject = 'Ваш заказ завершён';
        $message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' выполнен.';
        wp_mail($to, $subject, $message);
    }
    // Добавьте здесь другие действия, например интеграцию с API
}
  1. Если нужно, логируйте изменения для отладки:
function log_order_status_change($order_id, $old_status, $new_status, $order) {
    $log_entry = sprintf('Order #%d changed from %s to %s', $order_id, $old_status, $new_status);
    error_log($log_entry);
}
add_action('woocommerce_order_status_changed', 'log_order_status_change', 20, 4);

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

  • Обновите статус любого заказа в админке WooCommerce.
  • Проверьте, отправилось ли письмо на email покупателя (проверьте папку «Отправленные» на сервере или логи WP).
  • Если вы добавили логирование, проверьте файл debug.log или системный лог сервера на наличие записей о смене статуса.

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

  • Неверный приоритет или количество аргументов в add_action: Функция должна принимать 5 параметров, а приоритет обычно 10. Проверьте, что в add_action указано 10, 5.
  • Использование устаревших статусов: Статусы заказов должны быть корректными, например, pending, processing, completed. Проверьте, что вы правильно сравниваете статусы.
  • Отсутствие проверки объекта $order: Иногда объект заказа может быть не передан, добавьте проверку if (!$order) return;.
  • Проблемы с отправкой почты: Убедитесь, что функция wp_mail настроена и работает, проверьте SMTP настройки сервера.

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

  • Не выполняйте тяжелые операции напрямую в хуке, если это возможно — используйте wp_cron или очередь задач для асинхронной обработки.
  • Проверяйте права пользователя и валидность данных, особенно если хук запускает внешние запросы.
  • Для логирования используйте отдельные файлы или системы мониторинга, а не error_log в продакшене.
  • Минимизируйте количество операций в хук, чтобы не замедлять изменения статуса и не создавать узкие места в обработке заказов.

Сравнение способов автоматизации при смене статуса заказа

МетодПлюсыМинусы
Хук woocommerce_order_status_changedГибкость, доступ к объекту заказа, простота интеграцииВыполнение в синхронном режиме, возможность замедления процесса
Использование сторонних плагинов (например, автоматизация)Удобство настройки, визуальный интерфейсОграниченная гибкость, нагрузка на систему
WP-Cron с проверкой статусовАсинхронность, разгрузка основного процессаЗадержки в выполнении, зависимость от посещаемости сайта
Автоматическое удаление отменённых заказов в WooCommerce: пошаговое решение
29.05.2026
Как удалить пустые варианты атрибутов в WooCommerce с помощью кода
30.04.2026
Как использовать handy код для удаления старых метаданных в WordPress
09.01.2026
Как добавить фильтрацию по подкатегориям в WooCommerce
25.05.2026
Использование хука woocommerce_before_calculate_totals для динамического изменения цен в корзине WooCommerce
04.06.2026