Что такое хук '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) | Интеграции с разными системами, автоматизация | Зависимость от внешних сервисов, платность |