Что такое хук 'woocommerce_order_status_changed' и для чего он нужен
В WooCommerce хук woocommerce_order_status_changed срабатывает при изменении статуса заказа. Его можно использовать для запуска любых автоматизированных действий, например, отправки уведомлений, изменения метаданных заказа, интеграции с внешними сервисами.
Сигнатура хука
Хук принимает следующие параметры:
$order_id— ID заказа$old_status— предыдущий статус заказа$new_status— новый статус заказа$order— объект WC_Order
Диагностика: как проверить, что хук срабатывает
Для тестирования можно добавить простой код, который логирует изменение статуса заказа в файл debug.log. Включите WP_DEBUG и WP_DEBUG_LOG в wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_order_status_changed', 'wphost_log_order_status_change', 10, 4);
function wphost_log_order_status_change($order_id, $old_status, $new_status, $order) {
error_log("Заказ #{$order_id}: статус изменился с '{$old_status}' на '{$new_status}'");
}После изменения статуса заказа проверьте файл wp-content/debug.log. Если запись появилась — хук работает.
Пошаговое решение: автоматическая смена статуса заказа при оплате
Задача: автоматически переводить заказ в статус processing после получения оплаты, если статус был on-hold.
Код для functions.php:
add_action('woocommerce_order_status_changed', 'wphost_auto_processing_on_payment', 10, 4);
function wphost_auto_processing_on_payment($order_id, $old_status, $new_status, $order) {
if ($old_status === 'on-hold' && $new_status === 'completed') {
$order->update_status('processing', 'Автоматический переход в processing после оплаты');
}
}Обратите внимание, что изменение статуса внутри хука не вызовет бесконечный цикл, потому что новый статус processing отличается от completed.
Как проверить, что автоматизация работает
- Создайте тестовый заказ с статусом
on-hold. - Оплатите заказ или измените статус вручную на
completed. - Проверьте, что заказ автоматически сменил статус на
processing. - Если добавлен лог, смотрите
debug.logдля подтверждения вызова.
Частые ошибки и их исправление
- Ошибка: Хук не срабатывает.
Причина: Код добавлен в неподходящее место, например, в файл темы, который не активен, или без правильного хука.
Решение: Используйте кастомный плагин или активную тему, убедитесь, что WooCommerce активен. - Ошибка: Бесконечный цикл изменения статуса.
Причина: Вызовupdate_statusвнутри хука без проверки текущего и нового статуса.
Решение: Добавляйте условия, чтобы не обновлять статус на тот же. - Ошибка: Нет реакции на изменение статуса в админке.
Причина: Иногда статус меняется через ajax или сторонние плагины, которые могут обходить стандартные хуки.
Решение: Проверяйте совместимость плагинов, используйте альтернативные хуки, например,woocommerce_order_status_{status}.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые операции или запросы к внешним API внутри хука напрямую. Используйте очередь задач или WP-Cron.
- Минимизируйте количество вызовов
update_status, чтобы не перегружать базу данных. - Используйте проверку nonce и прав пользователя, если автоматизация затрагивает пользовательский ввод.
Сравнение вариантов реализации автоматизации смены статуса
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Хук woocommerce_order_status_changed | Простота, доступ ко всем статусам | Возможны циклы, требует проверки | Автоматический переход on-hold → processing |
Хук woocommerce_order_status_completed | Точная обработка конкретного статуса | Менее универсально | Действия только при переходе в completed |
| Плагины автоматизации | Графический интерфейс, простота настройки | Дополнительные зависимости, нагрузка | AutomateWoo, WooCommerce Follow-ups |
Вывод
Хук woocommerce_order_status_changed — мощный инструмент для автоматизации процессов в WooCommerce. Правильное использование с учетом условий и проверок позволяет избежать ошибок и повысить эффективность магазина без сторонних плагинов.