Как использовать хуки WooCommerce для добавления дополнительной логики в заказы

Диагностика задачи: зачем добавлять логику в заказы WooCommerce

Часто требуется автоматически выполнять дополнительные действия при изменении статуса заказа, добавлении мета-данных или изменении состава заказа. Например, отправить кастомное уведомление, обновить внешнюю CRM, автоматически применить скидку или изменить статус заказа по условию.

WooCommerce предоставляет мощную систему хуков — actions и filters — для вмешательства в процесс обработки заказов без изменения ядра плагина.

Основные хуки для работы с заказами WooCommerce

  • woocommerce_order_status_changed — срабатывает при смене статуса заказа.
  • woocommerce_checkout_update_order_meta — позволяет добавить или изменить мета-данные заказа после оформления.
  • woocommerce_thankyou — вызывается после успешного оформления заказа.
  • woocommerce_order_item_meta_end — для вывода или обработки метаданных в элементах заказа.
  • woocommerce_before_order_object_save — срабатывает перед сохранением объекта заказа.

Пример 1: Добавление пользовательского мета-поля при смене статуса заказа

add_action('woocommerce_order_status_changed', 'wplab_add_custom_meta_on_status_change', 10, 4); 
function wplab_add_custom_meta_on_status_change($order_id, $old_status, $new_status, $order) {
    if ($new_status === 'completed') {
        $order->update_meta_data('_custom_completed_time', current_time('mysql'));
        $order->save();
    }
}

Этот код добавляет в заказ мета-данные с временем, когда заказ получил статус «завершён».

Пример 2: Автоматическое применение скидки при оформлении заказа

add_action('woocommerce_checkout_create_order', 'wplab_apply_custom_discount', 20, 2);
function wplab_apply_custom_discount($order, $data) {
    $discount = 10; // Скидка 10 единиц валюты
    $order->set_discount_total($discount);
    $order->set_total($order->get_total() - $discount);
}

Обратите внимание: такой способ напрямую меняет итоговую сумму заказа — будьте осторожны с логикой пересчёта налогов и купонов.

Пошаговое решение: интеграция дополнительной логики в заказы WooCommerce

  1. Определите задачу: какую дополнительную логику нужно реализовать (уведомления, изменения метаданных, интеграция с внешними сервисами).
  2. Выберите подходящий хук из списка WooCommerce, например, woocommerce_order_status_changed для действий при смене статуса.
  3. Напишите функцию-обработчик на PHP, используя объекты WC_Order и методы для чтения/записи данных.
  4. Добавьте функцию на хук с помощью add_action или add_filter.
  5. Протестируйте на тестовом заказе: измените статус, создайте заказ и проверьте, сработала ли логика.
  6. Отладка: включите WP_DEBUG, выводите логи через error_log для отслеживания работы функций.

Проверка результата после внедрения

  • Создайте тестовый заказ в WooCommerce.
  • Измените статус заказа (например, с processing на completed).
  • Проверьте, что в метаданных заказа или в интерфейсе появились ожидаемые изменения (например, новое поле, изменённая сумма).
  • Используйте var_dump или print_r объекта WC_Order в отладочных целях.
  • Проверьте логи ошибок PHP для исключения сбоев.

Частые ошибки и как их исправить

  • Ошибка: логика не срабатывает при смене статуса
    Причина: неправильный приоритет хука или неверное имя статуса.
    Решение: проверьте точное имя статуса (например, completed, а не «завершён»), увеличьте приоритет в add_action.
  • Ошибка: мета-данные не сохраняются
    Причина: забыли вызвать $order->save() после обновления.
    Решение: всегда вызывайте save() у объекта WC_Order после изменения мета.
  • Ошибка: итог заказа рассчитывается некорректно
    Причина: прямое изменение суммы без перерасчёта налогов и скидок.
    Решение: используйте WooCommerce API для применения скидок и купонов, либо корректно обновляйте все параметры.
  • Ошибка: влияние на производительность сайта
    Причина: тяжелые операции в хуках, например, запросы к внешним API без кеша.
    Решение: оптимизируйте код, используйте асинхронные запросы или фоновые задачи.

Практические советы по безопасности и производительности

  • Не доверяйте входящим данным без проверки — используйте sanitize_text_field, intval, и другие функции очистки.
  • Не загружайте тяжелые библиотеки и не выполняйте длительные запросы в хуках, вызываемых часто.
  • Кэшируйте результаты внешних API, если интегрируетесь с CRM или почтой.
  • Для сложной логики используйте WP-Cron или системные задачи, чтобы не блокировать выполнение запросов пользователей.
  • Обязательно тестируйте на staging-сайте перед продакшеном.

Сравнение способов добавления логики в заказы WooCommerce

МетодПреимуществаНедостаткиКогда использовать
Хуки WooCommerce (add_action, add_filter)Гибкость, интеграция без изменения ядра, много точек входаТребует знаний WooCommerce API и правильного выбора хукаДобавление простой и средней логики, уведомления, мета-данные
Кастомные плагины или расширенияМодульность, удобство распространения, возможность сложной логикиНужно писать и поддерживать отдельный код, возможны конфликтыБольшие проекты, повторное использование кода
Изменение шаблонов и overrideКонтроль над выводом, кастомизация UIМожет конфликтовать с обновлениями, не подходит для бизнес-логикиИзменение отображения информации о заказе
Как использовать WPCommunity для создания форума на WordPress
17.03.2026
Как создать автоматический отчет о проблемах WordPress
12.01.2026
Как добавить дополнительные поля в форму регистрации WordPress
28.02.2026
Как создать собственный виджет WordPress с примерами кода WPLab
14.11.2025
Автоматический откат обновлений WordPress при ошибках: как настроить и реализовать
23.03.2026