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

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

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

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

  • Пользователь выбирает способ доставки на странице оформления заказа.
  • Цена товара или итоговая сумма в заказе динамически меняется без необходимости обновлять страницу вручную.
  • Изменение стоимости сохраняется в заказе и отображается в админке.

Пошаговое решение: автоматическое изменение стоимости товара в WooCommerce

1. Добавление пользовательского поля для цены с учётом доставки

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

add_action('woocommerce_before_calculate_totals', 'adjust_price_based_on_shipping_method', 10, 1);function adjust_price_based_on_shipping_method( $cart ) {    if ( is_admin() && ! defined( 'DOING_AJAX' ) )        return;    // Получаем выбранный способ доставки    $chosen_methods = WC()->session->get('chosen_shipping_methods');    if ( empty($chosen_methods) )        return;    $shipping_method = $chosen_methods[0];    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {        $original_price = $cart_item['data']->get_regular_price();        $new_price = $original_price;        // Пример логики изменения цены        if ( strpos($shipping_method, 'express') !== false ) {            $new_price = $original_price * 1.1; // +10% за экспресс-доставку        } elseif ( strpos($shipping_method, 'pickup') !== false ) {            $new_price = $original_price * 0.9; // -10% для самовывоза        }        $cart_item['data']->set_price( $new_price );    }}

2. Обеспечение обновления цены при смене способа доставки

По умолчанию WooCommerce не обновляет цены товаров при смене способа доставки без перезагрузки страницы. Для динамического обновления добавим AJAX-скрипт.

add_action('wp_footer', 'shipping_method_price_update_script');function shipping_method_price_update_script() {    if ( ! is_checkout() ) return;    ?>    <script>    jQuery(function($){        $('form.checkout').on('change', 'input[name^="shipping_method"]', function(){            $('body').trigger('update_checkout');        });    });    </script>    <?php}

3. Сохранение корректной цены в заказе

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

add_action( 'woocommerce_checkout_create_order_line_item', 'save_custom_price_order_item', 20, 4 );function save_custom_price_order_item( $item, $cart_item_key, $values, $order ) {    $custom_price = $values['data']->get_price();    $item->set_subtotal( $custom_price * $values['quantity'] );    $item->set_total( $custom_price * $values['quantity'] );}

Проверка результата после внедрения

  • Перейдите на страницу оформления заказа.
  • Выберите разные способы доставки (например, экспресс и самовывоз).
  • Убедитесь, что стоимость товара и итоговая сумма меняются автоматически без перезагрузки страницы.
  • Оформите заказ и проверьте в админке, что цена товара в заказе соответствует выбранному способу доставки.

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

  • Изменения цены не применяются на фронте: Проверьте правильность хука woocommerce_before_calculate_totals и вызов set_price() на объекте товара.
  • Цена не меняется при смене способа доставки без обновления страницы: Добавьте JavaScript для триггера update_checkout при изменении способа доставки.
  • Цена в заказе не совпадает с отображаемой на фронте: Обработайте событие woocommerce_checkout_create_order_line_item, чтобы установить правильную цену для каждого товара в заказе.
  • Конфликты с кэшированием: Отключите кэширование страниц для страницы оформления заказа, чтобы динамические изменения работали корректно.

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

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

Сравнение подходов к изменению цены в зависимости от доставки

Метод Плюсы Минусы
Изменение цены в хуке woocommerce_before_calculate_totals Гибко, работает для любых товаров и условий Требует JavaScript для динамического обновления, возможны конфликты с кэшированием
Создание отдельных товаров с разной ценой под способы доставки Простая реализация без кода Усложняет каталог, не удобно для большого ассортимента
Использование плагинов для сложных правил ценообразования Много готовых функций, поддержка Платные решения, избыточность для простых задач
Как добавить автоматическое удаление старых записей через шорткод в WordPress
04.03.2026
Как сделать загрузку изображений по требованию в WordPress для ускорения сайта
15.12.2025
Как установить лимит на количество постов в WordPress на странице архива
08.03.2026
Как настроить автоматический импорт данных из Google Sheets в WordPress с примерами кода
15.02.2026
Как автоматически отключать плагины в WordPress при возникновении ошибок
18.03.2026