WooCommerce: автоматическое изменение стоимости товара при обновлении заказа

Диагностика проблемы: почему нужно менять цену товара при обновлении заказа

В WooCommerce стандартно цена товара фиксирована и не меняется по ходу оформления или обновления заказа. Но бывают ситуации, когда цена должна динамически корректироваться в зависимости от условий заказа — например, изменение скидок, добавление опций, учет текущих акций или изменение стоимости доставки. Без автоматизации приходится вручную корректировать цены, что неудобно и приводит к ошибкам.

Как автоматически изменить стоимость товара при обновлении заказа в WooCommerce

Используем хук woocommerce_before_calculate_totals

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

add_action('woocommerce_before_calculate_totals', 'custom_change_product_price_in_cart', 20, 1);function custom_change_product_price_in_cart($cart) {  if (is_admin() && !defined('DOING_AJAX')) return;  foreach ($cart->get_cart() as $cart_item_key => $cart_item) {    // Условие для изменения цены, например, по ID товара    if ($cart_item['product_id'] === 123) {      // Новая цена, например, с 10% скидкой      $new_price = $cart_item['data']->get_regular_price() * 0.9;      $cart_item['data']->set_price($new_price);    }  }}

Автоматическое обновление цены при обновлении заказа

Если нужно менять цену именно при обновлении существующего заказа (не только в корзине), то используйте хук woocommerce_update_order или woocommerce_before_order_object_save. Пример:

add_action('woocommerce_before_order_object_save', 'custom_update_order_item_prices', 10, 1);function custom_update_order_item_prices($order) {  foreach ($order->get_items() as $item_id => $item) {    $product = $item->get_product();    if ($product->get_id() === 123) {      $new_price = $product->get_regular_price() * 0.9;      $item->set_subtotal($new_price * $item->get_quantity());      $item->set_total($new_price * $item->get_quantity());      $item->save();    }  }}

Пошаговое руководство по внедрению

  1. Создайте дочернюю тему или используйте плагин для пользовательских функций.
  2. Добавьте первый код для изменения цены в корзине по нужным условиям.
  3. Протестируйте добавление товара в корзину с измененной ценой.
  4. Добавьте второй код для изменения цены в обновляемом заказе.
  5. Обновите заказ из админки и проверьте, что цена изменилась.
  6. Проверьте, что итоговая сумма и налоги пересчитались корректно.

Как проверить, что решение работает

  • В корзине при добавлении товара с нужным ID цена должна измениться.
  • При обновлении заказа в админке цена товара должна обновляться автоматически.
  • Итоговая сумма заказа должна соответствовать новым ценам.
  • Ошибок PHP в логах и на странице не должно быть.

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

  • Цена не меняется в корзине: возможно, приоритет хука слишком низкий или условие не срабатывает. Проверьте ID товара и используйте приоритет 20 или выше.
  • Изменение цены не сохраняется в заказе: в хуке для обновления заказа нужно вызывать $item->save() после изменения.
  • Неверный расчет итогов: обязательно меняйте цены до пересчета итогов, используйте правильные методы для установки subtotal и total.
  • Конфликт с кешем или плагинами оптимизации: отключите кеширование корзины и страниц оформления заказа.

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

  • Не меняйте цены напрямую в базе данных, используйте API WooCommerce.
  • Проверяйте, что пользователь не админ при изменении цены в корзине, чтобы не нарушить админский интерфейс.
  • Кэшируйте результаты сложных вычислений вне цикла изменения цены.
  • Тестируйте изменения на стадии разработки, чтобы избежать проблем в продакшене.

Сравнение вариантов реализации

Вариант Плюсы Минусы
Изменение цены в корзине (woocommerce_before_calculate_totals) Простота, мгновенный эффект, работает для всех заказов Не меняет цены в уже созданных заказах
Изменение цены в обновляемом заказе (woocommerce_before_order_object_save) Меняет цену в базе, подходит для заказов после оформления Сложнее в реализации, требует сохранения объектов

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как автоматизировать удалённую оптимизацию базы данных WordPress без плагинов
16.03.2026
Как использовать хук post save в WordPress для дополнительной обработки данных
19.12.2025
Как избежать проблем с транслитерацией меток (тегов) в WordPress: практическое руководство
02.04.2026
Как сделать автоматический редирект при изменении URL в WordPress
12.01.2026
Автоматическое изменение стоимости товара при обновлении заказа WooCommerce
03.08.2026
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙