Что такое хук woocommerce_order_status_changed и для чего он нужен
В WooCommerce есть множество хуков, которые позволяют реагировать на события в процессе обработки заказа. Один из ключевых — woocommerce_order_status_changed. Этот хук срабатывает при изменении статуса заказа, например, когда заказ переходит из статуса "в обработке" в "завершён".
Используя этот хук, можно автоматизировать задачи: отправлять уведомления, обновлять сторонние сервисы, менять данные заказа и др.
Диагностика задачи: почему нужен именно этот хук
Часто возникает ситуация, когда нужно выполнить действие сразу после смены статуса заказа. Например:
- Отправить заказчику ссылку на цифровой товар при смене статуса на "завершён".
- Обновить складские остатки в CRM после смены на "выполнен".
- Запустить кастомный скрипт для аналитики.
Использование общего хука save_post для заказов не подходит, т.к. он срабатывает слишком часто и не всегда понятно, изменился ли статус.
Пошаговое решение: как правильно подключить и использовать хук
1. Добавляем обработчик в functions.php или в плагин
add_action('woocommerce_order_status_changed', 'custom_order_status_changed_handler', 10, 4);
function custom_order_status_changed_handler($order_id, $old_status, $new_status, $order) {
// Проверяем, что статус сменился на 'completed'
if ($new_status === 'completed') {
// Получаем email покупателя
$email = $order->get_billing_email();
// Отправляем кастомное письмо
wp_mail($email, 'Ваш заказ выполнен', 'Спасибо за покупку! Ваш заказ №' . $order_id . ' успешно завершён.');
// Можно добавить другие действия, например, обновление данных в CRM
}
}2. Объяснение параметров функции
$order_id— ID заказа$old_status— предыдущий статус$new_status— новый статус$order— объект WC_Order
3. Важные нюансы
- Функция должна быть максимально быстрой, чтобы не замедлять процесс изменения статуса.
- Если нужны внешние запросы, используйте очереди (wp_cron или сторонние сервисы).
Проверка результата после внедрения
Чтобы проверить, что обработчик сработал:
- Измените статус любого тестового заказа в админке WooCommerce на "завершён".
- Проверьте, что покупатель (в тестовом заказе — ваш email) получил письмо.
- Если добавляли логику обновления, проверьте соответствующий внешний сервис или базу.
Частые ошибки при работе с хуком woocommerce_order_status_changed
- Ошибка: Не передаёте все 4 параметра в обработчик.
Почему: По умолчанию в add_action передаётся только 1 параметр.
Как исправить: Указать 4 параметра явно, как в примере выше. - Ошибка: Отправка почты не работает.
Почему: Не настроена почтовая функция WordPress или почта попадает в спам.
Как исправить: Используйте SMTP-плагины или сервисы, проверяйте логи. - Ошибка: Медленная работа сайта после добавления кода.
Почему: В обработчике выполняется тяжелая синхронная операция.
Как исправить: Делать тяжелые задачи асинхронно через WP Cron или внешние очереди.
Практические советы по безопасности и производительности
- В обработчике не выводите контент прямо, используйте только серверные действия.
- Проверяйте права доступа, если добавляете логику, зависящую от пользователя.
- Минимизируйте количество запросов к базе и внешним сервисам.
- Логируйте ошибки в файл, чтобы не потерять важную информацию о сбоях.
Сравнение способов автоматизации при смене статуса заказа
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
Хук woocommerce_order_status_changed | Точный момент смены статуса, много параметров, гибкость | Нужно правильно обрабатывать параметры, нагрузка при тяжелых задачах | Использовать для легких и средних задач, тяжелые — в фон |
Хук save_post для заказов | Прост в использовании | Срабатывает слишком часто, нет информации о смене статуса | Не подходит для задач, связанных с изменением статуса |
| Плагины автоматизации (например, WPShop Expert Review) | Готовые решения, визуальные настройки | Могут быть избыточны, влияют на скорость сайта | Использовать при отсутствии навыков программирования |