Диагностика задачи: зачем добавлять логику в заказы 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
- Определите задачу: какую дополнительную логику нужно реализовать (уведомления, изменения метаданных, интеграция с внешними сервисами).
- Выберите подходящий хук из списка WooCommerce, например,
woocommerce_order_status_changedдля действий при смене статуса. - Напишите функцию-обработчик на PHP, используя объекты
WC_Orderи методы для чтения/записи данных. - Добавьте функцию на хук с помощью
add_actionилиadd_filter. - Протестируйте на тестовом заказе: измените статус, создайте заказ и проверьте, сработала ли логика.
- Отладка: включите
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 | Может конфликтовать с обновлениями, не подходит для бизнес-логики | Изменение отображения информации о заказе |