Что такое хук woocommerce_order_status_changed и для чего он нужен
Хук woocommerce_order_status_changed вызывается при изменении статуса заказа в WooCommerce. Он принимает несколько параметров: ID заказа, старый статус, новый статус и объект заказа. Этот хук часто используется для автоматизации различных операций, например, отправки уведомлений, обновления метаданных, интеграции с CRM или ERP, а также для запуска бизнес-логики на смену статуса.
Подпись хука
do_action( 'woocommerce_order_status_changed', $order_id, $old_status, $new_status, $order );Диагностика: как понять, что ваш код на хук не работает
Если вы добавили обработчик на этот хук, но он не срабатывает, проверьте следующее:
- Правильность названия хука — должно быть именно
woocommerce_order_status_changed. - Подключение функции через
add_actionс нужными параметрами (4 параметра). - Проверка, что код выполняется в контексте WooCommerce (например, в functions.php или плагине, где доступен WC).
- Отсутствие конфликтов с другими плагинами, которые могут блокировать выполнение.
- Логи ошибок PHP и debug.log для выявления фатальных ошибок.
Пошаговое решение: как написать и подключить обработчик изменения статуса заказа
Для примера автоматизируем отправку кастомного уведомления при смене статуса заказа с processing на completed.
- Добавьте следующий код в файл
functions.phpвашей темы или в собственный плагин:
add_action('woocommerce_order_status_changed', 'wpmod_custom_order_status_action', 10, 4);
function wpmod_custom_order_status_action($order_id, $old_status, $new_status, $order) {
if ($old_status === 'processing' && $new_status === 'completed') {
// Получаем email покупателя
$email = $order->get_billing_email();
$subject = 'Ваш заказ выполнен';
$message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' выполнен и готов к отправке.';
wp_mail($email, $subject, $message);
}
}- Сохраните изменения и обновите страницу админки WooCommerce.
- Измените статус любого заказа вручную из
processingвcompletedчерез админ-панель WooCommerce.
Как проверить, что код сработал
- Проверьте почтовый ящик покупателя, указанный в заказе — должно прийти письмо с темой "Ваш заказ выполнен".
- Включите логирование почты для отладки, если письма не приходят: добавьте
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true);вwp-config.phpи проверьтеwp-content/debug.log.
Расширение: логирование изменений статусов для аудита
Для ведения аудита можно записывать изменения статуса в отдельный лог-файл:
add_action('woocommerce_order_status_changed', 'wpmod_log_order_status_change', 10, 4);
function wpmod_log_order_status_change($order_id, $old_status, $new_status, $order) {
$log_entry = sprintf(
"%s: Заказ #%d изменил статус с '%s' на '%s'\n",
date('Y-m-d H:i:s'),
$order_id,
$old_status,
$new_status
);
error_log($log_entry, 3, WP_CONTENT_DIR . '/order-status.log');
}Частые ошибки при использовании woocommerce_order_status_changed
- Неправильное число аргументов в add_action: хук требует 4 аргумента, если функция принимает меньше, она не получит все данные.
- Использование устаревших статусов: WooCommerce использует префикс
wc-в некоторых хук-событиях, но в этом хуке статусы передаются без префикса, например,completed, а неwc-completed. - Отсутствие проверки статусов: выполнение действий без фильтрации статусов может привести к избыточной нагрузке.
- Проблемы с правами доступа: код должен выполняться в правильном контексте, чтобы получить объект заказа и данные.
Практические советы по безопасности и производительности
- Минимизируйте тяжелые операции внутри обработчика — если нужно отправлять данные в сторонние сервисы, делайте это асинхронно через wp-cron или очереди.
- Проверяйте валидность данных заказа перед выполнением действий.
- Для больших магазинов с высокой нагрузкой используйте логи и мониторинг для отслеживания ошибок в обработчиках.
Сравнение вариантов реализации автоматизации изменения статуса заказа
| Подход | Плюсы | Минусы | Пример |
|---|---|---|---|
Обработка через hook woocommerce_order_status_changed |
Прямая интеграция, легкость настройки, доступ к объекту заказа | Нагрузка при большом количестве заказов, требует проверки статусов | Код из статьи выше |
| Использование плагинов автоматизации (например, AutomateWoo) | Удобный UI, много готовых сценариев, поддержка интеграций | Платно, менее гибко для кастомных задач | Плагин AutomateWoo |
| Использование WP-Cron для отложенных задач после смены статуса | Снимает нагрузку, позволяет планировать задачи | Зависит от cron, возможны задержки | Отложенная отправка уведомлений |