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

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

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

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

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

Выбор правильного хука для обработки обновления заказа

Для динамического изменения цены в заказе при его обновлении нужно использовать хук woocommerce_before_calculate_totals. Этот хук вызывается перед подсчетом итогов корзины и заказа, позволяя менять цены товаров в объекте WC_Cart на лету.

Пример кода: изменение цены товара по условию

Реализуем логику, которая уменьшает цену товара с ID 123 на 10% при обновлении заказа:

add_action('woocommerce_before_calculate_totals', 'custom_change_product_price_in_cart', 10, 1); function custom_change_product_price_in_cart($cart_object) { if (is_admin() && !defined('DOING_AJAX')) { return; } foreach ($cart_object->get_cart() as $cart_item_key => $cart_item) { if ($cart_item['product_id'] == 123) { $original_price = $cart_item['data']->get_price(); $new_price = $original_price * 0.9; // скидка 10% $cart_item['data']->set_price($new_price); } } }

Этот код изменит цену товара динамически при каждом расчете корзины или заказа. Аналогично можно добавить любую логику проверки — по пользовательским меткам, количеству и прочему.

Обработка обновления заказа в админке

Если нужно, чтобы цена менялась именно при сохранении/обновлении заказа в админке (например, для уже размещенного заказа), можно использовать хук woocommerce_order_item_product или перехватывать событие сохранения заказа:

add_action('woocommerce_process_shop_order_meta', 'custom_update_order_item_price', 10, 2); function custom_update_order_item_price($order_id, $post) { $order = wc_get_order($order_id); foreach ($order->get_items() as $item_id => $item) { if ($item->get_product_id() == 123) { $new_price = $item->get_subtotal() * 0.9; // скидка 10% $item->set_subtotal($new_price); $item->set_total($new_price); $item->save(); } } $order->calculate_totals(); }

Этот код срабатывает при сохранении заказа и меняет цену позиции в заказе вручную, после чего пересчитывает итоги.

Как проверить, что автоматическая смена цены работает

  • Добавьте товар с ID 123 в корзину и перейдите к оформлению заказа — цена должна автоматически уменьшиться на 10%.
  • Создайте новый заказ в админке с этим товаром, сохраните его — цена товара в заказе должна применить скидку и итог обновится.
  • Обновите заказ в админке и посмотрите в деталях заказа, что цена товара изменилась.
  • Включите режим отладки WooCommerce или добавьте error_log для логирования изменений, чтобы убедиться, что код срабатывает.

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

  • Цена не меняется в корзине: проверьте, что хук woocommerce_before_calculate_totals добавлен с приоритетом 10 и что вы изменяете цену именно через $cart_item['data']->set_price().
  • Изменения не сохраняются в заказе: при работе с существующим заказом нужно применять изменения через объекты WC_Order_Item_Product и не забывать вызывать $order->calculate_totals().
  • Цена сбрасывается после обновления страницы: убедитесь, что код не конфликтует с другими плагинами, которые могут перезаписывать цены.
  • Ошибка в админке: не используйте код изменения цены в административной части, если это не требуется, или оборачивайте проверкой is_admin() и DOING_AJAX.

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

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

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

МетодГде применяетсяПлюсыМинусы
Хук woocommerce_before_calculate_totalsКорзина и оформление заказаДинамическое изменение цены без сохранения в базеНе сохраняется цена в заказе, только для текущей сессии
Обработка woocommerce_process_shop_order_metaАдминка, сохранение заказаИзменение цены уже сохраненного заказаИзменения сохраняются, могут конфликтовать с другими плагинами
Создание отдельного плагина с настройкамиВсе случаиГибкость и удобство настройкиТребует времени на разработку

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

⭐⭐⭐⭐⭐
WooCommerce: автоматическое изменение цены товара при обновлении заказа
25.04.2026
Как сделать автоматическую оптимизацию базы данных WordPress без плагинов
10.02.2026
Как автоматизировать транслитерацию меток (тегов) в WordPress для SEO
26.03.2026
Как создать автоматическую удалённую оптимизацию базы данных WordPress
25.01.2026
Как автоматизировать перевод содержимого WordPress с помощью WPGPT
09.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее