Что такое хук woocommerce_order_status_changed и зачем он нужен
Хук woocommerce_order_status_changed в WooCommerce срабатывает при изменении статуса заказа. Он принимает четыре параметра: ID заказа, старый статус, новый статус и объект заказа. Это идеальное место для добавления автоматических действий — например, отправки кастомных уведомлений, интеграции с CRM, обновления метаданных заказа и прочего.
Диагностика: как проверить, что хук срабатывает
Для начала убедитесь, что хук активен и вызывается правильно. Добавьте простой лог или уведомление при смене статуса:
add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status, $order) {
error_log("Order #$order_id changed from $old_status to $new_status");
}, 10, 4);После смены статуса заказа проверьте файл debug.log в папке wp-content (если включен WP_DEBUG_LOG) — должна появиться соответствующая запись.
Пошаговое решение: автоматическое добавление заметки при смене статуса на "completed"
Допустим, нам нужно автоматически добавить в заказ заметку, когда он переходит в статус completed. Такое часто нужно для внутренней отчетности или интеграции с логистикой.
add_action('woocommerce_order_status_changed', 'wppr_add_note_on_completed', 10, 4);
function wppr_add_note_on_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
$order->add_order_note('Заказ автоматически помечен как выполненный и готов к отправке.');
}
}Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин.
Проверка результата после внедрения
- Измените статус одного из заказов в админке WooCommerce на
completed. - Перейдите в детали заказа и откройте вкладку с заметками — должна появиться новая заметка с текстом из кода.
- Если заметка не появилась, проверьте логи ошибок и правильность подключения функции.
Частые ошибки и их исправление
- Хук не срабатывает: проверьте, что функция подключена с правильным приоритетом и количеством аргументов (4).
- Ошибка доступа к объекту $order: убедитесь, что функция получает объект
WC_Orderв четвертом параметре, а не просто ID. - Добавление заметки не отображается: проверьте, что в WooCommerce нет ограничений на отображение кастомных заметок, и что заказ действительно меняет статус на нужный.
Практические советы по безопасности и производительности
- Не выполняйте тяжелых операций внутри хука — если нужна интеграция с внешними сервисами, лучше ставить задачи в очередь или использовать WP-Cron.
- Проверяйте тип и значение статусов строго, чтобы избежать лишних вызовов.
- Используйте проверенный код и избегайте вывода данных напрямую в админку без фильтрации.
Таблица сравнения способов автоматизации при смене статуса заказа
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Хук woocommerce_order_status_changed | Дает полный контроль, легко кастомизируется | Нужно писать код, требует знаний PHP | Добавление заметок, интеграция с API |
| Плагины автоматизации (например, AutomateWoo) | Интерфейс без кода, много готовых сценариев | Платные, могут замедлять сайт | Уведомления, скидки, триггеры по статусу |
| WP-Cron задачи | Отложенная обработка, минимальная нагрузка | Зависит от посещаемости сайта | Отправка отчетов, очистка старых заказов |
Дополнительный пример: отправка кастомного email при смене статуса на "processing"
add_action('woocommerce_order_status_changed', 'wppr_send_custom_email_on_processing', 10, 4);
function wppr_send_custom_email_on_processing($order_id, $old_status, $new_status, $order) {
if ($new_status === 'processing') {
$to = $order->get_billing_email();
$subject = 'Ваш заказ принят в обработку';
$message = 'Здравствуйте! Ваш заказ #' . $order_id . ' принят в обработку и скоро будет отправлен.';
wp_mail($to, $subject, $message);
}
}Проверьте работу, сменив статус заказа на processing и убедившись, что письмо пришло на почту клиента.