Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed срабатывает при изменении статуса заказа в WooCommerce. Он передает информацию о предыдущем статусе, новом статусе и объекте заказа. Это позволяет запускать кастомный код для автоматизации бизнес-процессов, например, уведомлений, синхронизации с CRM, изменения данных заказа и т.д.
Диагностика: почему не срабатывает автоматизация при смене статуса заказа
- Проверьте, что ваш код подключен в правильном месте (например, в functions.php темы или собственном плагине).
- Убедитесь, что хук используется с правильной сигнатурой и параметры передаются корректно.
- Проверьте, не блокирует ли другой код выполнение, например, ошибки PHP или конфликты плагинов.
- Отладите с помощью
error_logилиvar_dumpвнутри функции обработчика.
Пошаговое решение: добавляем уведомление администратору при смене статуса заказа на "выполнен"
Пример кода для добавления в файл functions.php вашей темы или в плагин:
add_action('woocommerce_order_status_changed', 'notify_admin_order_completed', 10, 4);
function notify_admin_order_completed($order_id, $old_status, $new_status, $order) {
if ($new_status === 'completed') {
$to = get_option('admin_email');
$subject = "Заказ #{$order_id} выполнен";
$message = "Статус заказа #{$order_id} изменился с '{$old_status}' на '{$new_status}'.\n";
$message .= "Сумма заказа: " . wc_price($order->get_total()) . "\n";
$message .= "Клиент: " . $order->get_billing_email() . "\n";
wp_mail($to, $subject, $message);
}
}В этом примере при переходе заказа в статус completed на почту администратора отправляется письмо с краткой информацией о заказе.
Проверка результата после внедрения
- Сделайте тестовый заказ в магазине WooCommerce.
- В админке измените статус заказа на "выполнен".
- Проверьте, что письмо пришло на почту администратора (указанную в настройках WordPress).
- Для отладки можно добавить
error_log('Статус заказа изменен');внутри функции и проверить логи сервера.
Расширенный пример: обновление метаполя при смене статуса заказа
Иногда необходимо сохранять дополнительную информацию о заказе при смене статуса. Например, ставить метку времени изменения:
add_action('woocommerce_order_status_changed', 'update_order_status_change_time', 20, 4);
function update_order_status_change_time($order_id, $old_status, $new_status, $order) {
$order->update_meta_data('_status_changed_at', current_time('mysql'));
$order->save();
}Этот код добавляет или обновляет метаполе _status_changed_at с датой и временем последнего изменения статуса.
Чек-лист для работы с хуком 'woocommerce_order_status_changed'
- Подключайте обработчик через
add_actionс 4 параметрами. - Используйте объект заказа
$orderдля доступа к данным. - Проверяйте старый и новый статус для нужных условий.
- Всегда вызывайте
$order->save(), если меняете метаданные. - Для отправки почты используйте
wp_mailс проверкой ошибок. - Логируйте действия для отладки.
Частые ошибки и их исправление
- Неправильное количество аргументов в функции — убедитесь, что в
add_actionуказано 4 аргумента, и функция принимает 4 параметра. - Отсутствие вызова
$order->save()— метаданные не сохранятся без явного вызова. - Использование хуков вне контекста WooCommerce — хук должен быть подключен после загрузки WooCommerce, например, в
initили позднее. - Письма не отправляются — проверьте настройки почты на сервере, используйте SMTP или плагины для отладки email.
Практические советы по безопасности и производительности
- Избегайте тяжелых операций в обработчике, чтобы не замедлять смену статуса заказа.
- Для сложных задач используйте отложенную обработку через WP-Cron или внешние очереди.
- Проверяйте права пользователя, если функция зависит от контекста.
- Используйте фильтры WooCommerce для дополнительной гибкости.
Сравнение вариантов реализации автоматизации при смене статуса заказа
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Прямое добавление обработчика в тему | Быстро, не требует плагинов | Зависит от темы, сложно переносить |
| Собственный плагин | Создание собственного плагина с обработчиком | Модульность, легко обновлять и переносить | Требует базовых знаний плагинов |
| Плагин автоматизации | Использование сторонних плагинов для триггеров | Простота настройки, готовый функционал | Может быть избыточным, нагрузка, ограничения |