Что такое хук action WooCommerce order status changed и зачем он нужен
В WooCommerce для обработки изменений статусов заказов используется хук action woocommerce_order_status_changed. Он срабатывает каждый раз, когда статус заказа меняется, предоставляя разработчику возможность запускать кастомный код — например, отправлять уведомления, изменять метаданные заказа, интегрироваться с внешними сервисами и многое другое.
Диагностика: почему мои действия при смене статуса заказа не срабатывают
Если вы добавили обработчик на woocommerce_order_status_changed, но он не выполняется, проверьте следующие моменты:
- Правильно ли подключен код — находится ли он в functions.php темы или в плагине?
- Используете ли правильный синтаксис функции add_action?
- Совпадает ли количество аргументов в callback с тем, что передает хук (4 аргумента)?
- Не блокируется ли выполнение кода другими плагинами или ошибками PHP?
Пошаговое решение: как правильно использовать хук woocommerce_order_status_changed
1. Добавляем обработчик в functions.php
add_action('woocommerce_order_status_changed', 'custom_order_status_changed_action', 10, 4);
function custom_order_status_changed_action($order_id, $old_status, $new_status, $order) {
// Проверяем, что заказ получен корректно
if (!$order instanceof WC_Order) {
$order = wc_get_order($order_id);
}
// Пример: логируем изменение статуса в файл
$log_entry = sprintf("Order #%d status changed from %s to %s\n", $order_id, $old_status, $new_status);
error_log($log_entry, 3, WP_CONTENT_DIR . '/order-status.log');
// Допустим, отправляем письмо при переходе в статус completed
if ($new_status === 'completed') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ завершен';
$message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' успешно завершен.';
wp_mail($to, $subject, $message);
}
}2. Проверяем работу кода
Измените статус любого заказа в админке WooCommerce. После этого:
- Проверьте файл
wp-content/order-status.log— должна появиться запись с изменением статуса. - Если статус изменился на
completed, на электронную почту покупателя должно прийти письмо.
Проверка результата после внедрения
Чтобы убедиться, что ваш обработчик работает корректно, используйте следующий чек-лист:
- Измените статус заказа вручную через админку WooCommerce.
- Проверьте наличие записи в лог-файле, указанном в коде.
- Проверьте почтовый ящик покупателя (или укажите свой адрес в коде для теста).
- Посмотрите в консоль ошибок сервера, нет ли ошибок PHP.
Частые ошибки при работе с хуком woocommerce_order_status_changed
- Неправильное количество аргументов в функции: хук передает 4 параметра, если в add_action указано меньше, часть данных не попадет в функцию.
- Ошибка в условии проверки объекта заказа: если не получить объект заказа через
wc_get_order, код упадет. - Использование wp_mail без настройки SMTP: письма не отправятся без корректной почтовой конфигурации.
- Кэширование или плагины безопасности: они могут блокировать выполнение кода или отправку писем.
Практические советы по безопасности и производительности
- Не запускайте тяжелые операции (например, запросы к API) напрямую в обработчике. Используйте WP-Cron или отложенные задачи.
- При работе с электронной почтой рекомендуется использовать SMTP-плагин для надежной доставки.
- Для логирования используйте отдельный файл, чтобы не засорять системный лог ошибок.
- Проверяйте, что объект заказа корректно получен, чтобы избежать фатальных ошибок.
Сравнение способов обработки смены статуса заказа
| Метод | Преимущества | Недостатки |
|---|---|---|
Хук woocommerce_order_status_changed | Прямой доступ к информации о заказе, гибкость | Нужно писать код, возможны ошибки при неправильном использовании |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, множество готовых триггеров и действий | Может быть избыточным и создавать нагрузку, платные функции |
| Использование REST API для отслеживания заказов | Возможность интеграции с внешними сервисами | Сложнее в реализации, требует периодического опроса или вебхуков |