Диагностика задачи: зачем менять данные заказа автоматически
В WooCommerce часто возникает необходимость автоматически модифицировать заказы после их создания: например, добавить скидку по определённым условиям, изменить статус, добавить мета-данные или изменить стоимость доставки. Ручное редактирование каждого заказа неудобно и неэффективно. Чтобы автоматизировать эти процессы, используются фильтры и хуки WooCommerce.
Основные фильтры и хуки для изменения заказа
WooCommerce предоставляет несколько ключевых хуков для вмешательства в процесс создания и обновления заказа:
woocommerce_checkout_create_order— позволяет изменить объект заказа сразу после оформления.woocommerce_order_get_items— фильтр для изменения позиций заказа.woocommerce_order_get_total— фильтр для изменения итоговой суммы.woocommerce_update_order— хук для действий после обновления заказа.
Для большинства задач достаточно использовать woocommerce_checkout_create_order, чтобы внести изменения сразу после оформления.
Пример: добавление мета-данных и скидки на товар
add_action('woocommerce_checkout_create_order', 'custom_modify_order', 20, 2);
function custom_modify_order( $order, $data ) {
// Добавляем мета-данные к заказу
$order->update_meta_data('_custom_note', 'Проверить вручную');
// Проходимся по позициям и уменьшаем цену на 10% для товаров категории "Распродажа"
foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product();
if ( has_term( 'sale', 'product_cat', $product->get_id() ) ) {
$original_price = $item->get_subtotal();
$discounted_price = $original_price * 0.9;
$item->set_subtotal( $discounted_price );
$item->set_total( $discounted_price );
$item->save();
}
}
}Пошаговое решение для автоматического изменения статуса заказа
Рассмотрим кейс: автоматически переводить заказ в статус "в обработке", если сумма заказа превышает 5000 рублей.
- Добавьте следующий код в файл
functions.phpвашей темы или в плагин для пользовательских функций:
add_action('woocommerce_checkout_order_processed', 'auto_change_order_status', 10, 3);
function auto_change_order_status( $order_id, $posted_data, $order ) {
if ( $order->get_total() > 5000 ) {
$order->update_status('processing', 'Автоматическое изменение статуса по сумме заказа');
}
}- Сохраните файл и сделайте тестовый заказ с суммой выше 5000.
Проверка результата после внедрения
Чтобы проверить, что изменения работают, сделайте следующее:
- Создайте тестовый заказ в магазине с условиями, которые должны сработать (например, сумма больше 5000).
- Перейдите в админку WooCommerce → Заказы и откройте последний заказ.
- Проверьте, что статус автоматически изменился на "в обработке".
- Проверьте, что добавленные мета-данные доступны во вкладке "Дополнительные поля" (если применимо).
- Для проверки цен на позиции — убедитесь, что скидка применена в позиции заказа и итоговая сумма пересчитана.
Частые ошибки и их исправления
- Изменения не сохраняются: убедитесь, что вы используете методы
set_иsave()для позиций заказа, а для самого заказа —update_meta_data()и$order->save(). - Скидка не применяется к итоговой сумме: после изменения позиций вызовите
$order->calculate_totals();чтобы обновить общую сумму. - Статус заказа не меняется: не используйте хук
woocommerce_checkout_create_orderдля изменения статуса — лучше использоватьwoocommerce_checkout_order_processedилиwoocommerce_order_status_changed. - Изменения применяются не ко всем заказам: проверьте условия (например, категории товаров, сумма заказа) и убедитесь, что они правильно написаны и соответствуют данным.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые операции внутри хуков оформления заказа — это замедлит процесс оформления и ухудшит пользовательский опыт.
- Избегайте прямого изменения базы данных — используйте официальные методы WC_Order и WC_Order_Item_Product.
- Тестируйте код на тестовом окружении перед запуском на продакшн.
- Для сложных условий используйте кэширование результатов, если это возможно.
Сравнение вариантов реализации автоматической модификации заказов
| Метод | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_checkout_create_order | Изменения до создания заказа, можно модифицировать позиции | Не подходит для изменения статуса после создания |
Хук woocommerce_checkout_order_processed | Подходит для изменения статуса и дополнительной логики | Нельзя изменить позиции заказа, так как они уже созданы |
| Использование cron-задач для массовых изменений | Подходит для отложенной обработки | Не подходит для мгновенных изменений при оформлении заказа |