Диагностика проблемы: зачем менять наличие и цены при оформлении заказа
В стандартной работе WooCommerce наличие товара уменьшается автоматически после успешного оформления заказа. Но в некоторых случаях нужна дополнительная автоматизация: например, изменять цену товара после оформления заказа (акции, скидки, бонусы), или обновлять наличие с учетом внешних условий (интеграция со складской системой, учет резервов и пр.).
Без кастомных решений WooCommerce не позволяет гибко менять эти параметры в момент оформления или сразу после оплаты заказа.
Пошаговое решение: как автоматически изменять наличие и цену товара
1. Изменение наличия товара после успешной оплаты заказа
Для корректного управления остатками используйте хук woocommerce_payment_complete. В этом хуке можно получить заказ, пройтись по товарам и обновить наличие вручную.
add_action('woocommerce_payment_complete', 'custom_update_product_stock_after_order', 20, 1); function custom_update_product_stock_after_order($order_id) { $order = wc_get_order($order_id); foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product || !$product->managing_stock()) continue; $quantity = $item->get_quantity(); // Получаем текущее количество на складе $current_stock = $product->get_stock_quantity(); // Уменьшаем количество вручную $new_stock = max(0, $current_stock - $quantity); $product->set_stock_quantity($new_stock); $product->save(); }}Это позволит точно контролировать остатки, если требуется учесть дополнительные условия.
2. Автоматическое изменение цены товара после оформления заказа
Чтобы изменить цену товара в заказе, используйте хук woocommerce_checkout_create_order_line_item. Он срабатывает при создании позиции заказа, и позволяет менять цену в объекте позиции без изменения самого продукта.
add_action('woocommerce_checkout_create_order_line_item', 'custom_change_order_item_price', 20, 4); function custom_change_order_item_price($item, $cart_item_key, $values, $order) { $product = $item->get_product(); // Пример: скидка 10% для определённой категории if (has_term('sale-category', 'product_cat', $product->get_id())) { $price = $item->get_subtotal() * 0.9; // уменьшить на 10% $item->set_subtotal($price); $item->set_total($price); }}Изменение цены позиции заказа не влияет на цену самого товара в каталоге, что удобно для акций и персональных скидок.
Проверка результата после внедрения
- Оформите тестовый заказ с товаром, который управляет складом.
- После успешной оплаты проверьте остаток товара в админке WooCommerce (Товары - Товар - Управление запасами).
- Проверьте в заказе, что цена товара изменилась в соответствии с логикой хука.
- Для проверки скидок можно добавить логи в функции, например:
или использовать плагин Query Monitor для отладки.error_log('New stock: ' . $new_stock);
Частые ошибки и как их исправить
- Изменения не применяются: Проверьте приоритет хука и правильность параметров функции. Иногда другие плагины могут перезаписывать изменения.
- Наличие не обновляется: Убедитесь, что продукт управляет складом (
$product->managing_stock()возвращает true). - Цена меняется в каталоге: Помните, что изменения цен должны применяться только к позициям заказа, не к товару в целом.
- Ошибки при сохранении продукта: Вызывайте
$product->save()после изменения наличия, иначе изменения не сохранятся.
Практические советы по производительности и безопасности
- Не используйте тяжелые внешние запросы в хуках изменения заказа — это замедляет оформление.
- Кэшируйте результаты, если нужно получать данные из внешних источников.
- Для безопасности проверяйте, что функции вызываются только для нужных статусов заказа (например,
$order->has_status('processing')илиcompleted). - В продакшне логирование ошибок отключайте или направляйте в отдельные файлы для анализа.
- Для сложной логики интеграции со складом лучше использовать отдельные сервисы и очереди задач, чтобы не блокировать процесс оформления.
Сравнение способов изменения наличия и цены в WooCommerce
| Метод | Изменение | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_payment_complete | Обновление наличия товара | Прямое управление остатками, гибкость | Требует аккуратного учёта остатков, возможны ошибки при одновременных заказах |
Хук woocommerce_checkout_create_order_line_item | Изменение цены позиции заказа | Изменения не влияют на каталог, легко реализовать скидки | Изменения действуют только в заказе, не для других покупателей |
| Использование плагинов | Автоматизация наличия и цен | Готовые решения, интеграции | Могут замедлять сайт и конфликтовать с кастомным кодом |