Что такое хук 'woocommerce_order_status_changed' и зачем он нужен
Хук woocommerce_order_status_changed — это action, который срабатывает каждый раз при изменении статуса заказа в WooCommerce. Он позволяет выполнять дополнительную логику после смены статуса, например, отправлять уведомления, обновлять метаданные, запускать интеграции с внешними сервисами.
Подписка на этот хук — стандартный способ расширения функционала магазина без модификации ядра WooCommerce.
Диагностика проблемы: почему не срабатывает кастомная логика при смене статуса заказа
- Код с хуком не подключён или подключён в неправильном месте (нужно в functions.php темы или в плагине).
- Используется неправильный приоритет или параметры функции.
- Несовпадение имён статусов заказа (статусы пишутся в нижнем регистре, например,
completed,processing). - Неверное количество аргументов в функции-обработчике.
- Код выполняется слишком рано, до инициализации WooCommerce.
Пошаговое решение: как правильно использовать 'woocommerce_order_status_changed'
1. Подключение обработчика в functions.php
Добавьте следующий код в файл functions.php вашей активной темы или в отдельный плагин:
add_action('woocommerce_order_status_changed', 'my_custom_order_status_change', 10, 4);
function my_custom_order_status_change($order_id, $old_status, $new_status, $order) {
// Проверяем, что $order - объект WC_Order
if (!is_a($order, 'WC_Order')) {
$order = wc_get_order($order_id);
}
// Пример: отправка письма при смене статуса на completed
if ($new_status === 'completed' && $old_status !== 'completed') {
// Ваша логика
error_log('Заказ ' . $order_id . ' изменён на completed');
// Например, отправка письма
$to = $order->get_billing_email();
$subject = 'Ваш заказ выполнен';
$message = 'Спасибо за покупку! Ваш заказ #' . $order_id . ' выполнен.';
wp_mail($to, $subject, $message);
}
}2. Проверка имени статусов
Убедитесь, что статусы указываются правильно. Например, стандартные статусы WooCommerce:
pending— ожидает оплатыprocessing— в обработкеcompleted— выполненcancelled— отменёнrefunded— возвращён
3. Использование объекта заказа
В обработчике можно использовать объект WC_Order для получения любой информации о заказе, например, товаров, клиента, суммы, метаданных.
$items = $order->get_items();
foreach ($items as $item_id => $item) {
$product_name = $item->get_name();
$quantity = $item->get_quantity();
// ваша логика
}Проверка результата после внедрения
1. Сделайте тестовый заказ в WooCommerce.
2. Измените статус заказа в админке (например, на 'completed').
3. Проверьте логи (файл wp-content/debug.log) или почту, если настроена отправка.
4. Убедитесь, что дополнительная логика сработала (например, письмо отправилось, запись в лог появилась).
Частые ошибки и как их исправить
- Ошибка:
Call to undefined function wc_get_order().
Причина: вызов до инициализации WooCommerce.
Решение: подключайте обработчик черезplugins_loadedили позже, например, вinitс приоритетом 20. - Ошибка: не приходит почта.
Причина: неправильно настроен SMTP или wp_mail.
Решение: используйте плагин SMTP и проверьте настройки серверной почты. - Ошибка: функция обработчика не вызывается.
Причина: неправильное количество параметров в add_action.
Решение: укажите 4 параметра, как в примере (add_action('woocommerce_order_status_changed', 'func', 10, 4)). - Ошибка: сравнение статусов с ошибками из-за регистра.
Решение: используйте строгое сравнение с правильным регистром.
Практические советы по безопасности и производительности
- Не выполняйте тяжёлые операции (например, внешние API-запросы) напрямую в обработчике, используйте очереди или wp_cron.
- Проверяйте, что объект заказа валиден, чтобы избежать ошибок PHP.
- Логируйте ошибки и ключевые действия для последующей отладки.
- Используйте nonce и проверяйте права пользователя для действий, если добавляете формы или AJAX-запросы, связанные с изменением статусов.
Сравнение способов реализации дополнительной логики
| Метод | Преимущества | Недостатки |
|---|---|---|
| Хук 'woocommerce_order_status_changed' в functions.php | Простота, быстрое внедрение, полный доступ к объекту заказа | Зависимость от темы, сложность поддержки на больших проектах |
| Создание отдельного плагина с обработчиком | Легко переносить, изолированность кода, удобство обновления | Нужно дополнительное тестирование, чуть дольше настройка |
| Использование сторонних плагинов с триггерами | Не требует программирования, можно быстро настроить | Ограниченная гибкость, возможны конфликты, нагрузка на сайт |