Использование хука WooCommerce 'woocommerce_order_status_changed' для расширения функционала

Что такое хук 'woocommerce_order_status_changed' и когда он срабатывает

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

  • $order_id — ID заказа;
  • $old_status — предыдущий статус;
  • $new_status — новый статус;
  • $order — объект WC_Order.

На практике этот хук используют для интеграций, уведомлений, изменения метаданных заказа и других сценариев.

Диагностика проблемы: почему мой код на 'woocommerce_order_status_changed' не срабатывает

Если код, основанный на этом хуке, не работает, проверьте:

  • Правильно ли подключен ваш код (например, в functions.php темы или в плагине);
  • Используете ли правильные параметры функции обратного вызова (callback);
  • Активен ли WooCommerce и есть ли заказы с изменяющимся статусом;
  • Нет ли конфликтов с другими плагинами, которые могут перехватывать этот хук;
  • Версия WooCommerce — иногда устаревшие версии могут вести себя иначе.

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

Пример: отправим письмо администратору, когда заказ переходит в статус 'completed' (завершён).

add_action('woocommerce_order_status_changed', 'wpstandart_notify_admin_on_completed', 10, 4);
function wpstandart_notify_admin_on_completed($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'completed') {
        $admin_email = get_option('admin_email');
        $subject = 'Заказ #' . $order_id . ' завершён';
        $message = 'Заказ номер ' . $order_id . ' сменил статус с ' . $old_status . ' на ' . $new_status . ".\n\nСсылка на заказ: " . admin_url('post.php?post=' . $order_id . '&action=edit');
        wp_mail($admin_email, $subject, $message);
    }
}

Обратите внимание на правильный приоритет и количество аргументов — 10 и 4 соответственно.

Добавление записи в лог при смене статуса

Для отладки и аудита полезно логировать изменения:

add_action('woocommerce_order_status_changed', 'wpstandart_log_order_status_change', 10, 4);
function wpstandart_log_order_status_change($order_id, $old_status, $new_status, $order) {
    if (!function_exists('wc_get_logger')) {
        return;
    }
    $logger = wc_get_logger();
    $context = array('source' => 'wpstandart_order_status');
    $message = sprintf('Order #%d status changed from %s to %s', $order_id, $old_status, $new_status);
    $logger->info($message, $context);
}

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

1. Создайте или измените заказ в WooCommerce, изменив его статус (например, вручную в админке).

2. Проверьте почту администратора — должно прийти уведомление (если реализован отправитель).

3. Для логирования — зайдите в папку wp-content/uploads/wc-logs/ и найдите файлы с логами, убедитесь, что ваше сообщение там есть.
Можно также использовать плагин WP Log Viewer для удобного просмотра.

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

  • Неверное количество аргументов в callback-функции: хук передаёт 4 параметра, если указать меньше, данные не попадут в функцию. Исправьте сигнатуру функции и параметры add_action.
  • Код не подключён или подключён в неправильном месте: убедитесь, что код добавлен в functions.php дочерней темы или в кастомный плагин, а не в файл, который не загружается.
  • Конфликты с другими плагинами: отключите все кроме WooCommerce и проверьте работу, затем включайте по одному.
  • Проблемы с отправкой почты: проверьте настройки почтового сервера, используйте SMTP-плагин для теста.

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

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

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

МетодПреимуществаНедостатки
Код на хуке woocommerce_order_status_changedПолный контроль, нет зависимости от плагинов, гибкостьТребует навыков программирования, возможны ошибки при реализации
Готовые плагины уведомлений (например, WooCommerce Follow-Ups)Простота настройки, готовый функционалПлатные, могут влиять на производительность
Использование сторонних сервисов (Zapier, Integromat)Интеграции с разными системами, автоматизацияЗависимость от внешних сервисов, платность
Как использовать хук WooCommerce checkout_update_order_meta для добавления данных к заказу
29.04.2026
Как правильно удалить или изменить URL продуктов в WooCommerce без потери SEO
17.04.2026
Автоматическое удаление незаконченных заказов WooCommerce по срокам и статусу
03.07.2026
Оптимизация памяти WordPress: эффективные методы и примеры с wpstandart
10.12.2025
Как автоматически отключить отклик AJAX в WooCommerce без потери функциональности
23.06.2026