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

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

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

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

Для изменения цены при оплате нужно вмешаться в процесс расчёта итоговой суммы в корзине и заказе. Менять цену самого товара в базе нельзя — это может привести к рассинхронизации. Вместо этого применяют фильтр woocommerce_cart_calculate_fees, чтобы добавить дополнительную плату к заказу. Если нужно изменить цену конкретного товара, можно модифицировать его цену в корзине с помощью woocommerce_before_calculate_totals.

Изменение цены товара в корзине

Этот способ позволяет динамически изменить цену товара, которая отображается в корзине и влияет на общую сумму. Пример кода, который увеличивает цену каждого товара на 10%:

add_action('woocommerce_before_calculate_totals', 'wpkit_modify_cart_item_price', 20, 1);
function wpkit_modify_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    foreach ( $cart->get_cart() as $cart_item ) {
        $original_price = $cart_item['data']->get_price();
        $new_price = $original_price * 1.10; // +10%
        $cart_item['data']->set_price( $new_price );
    }
}

Добавление комиссии на оплату

Если требуется добавить фиксированную или процентную комиссию именно при оплате, лучше использовать фильтр для сборов:

add_action( 'woocommerce_cart_calculate_fees', 'wpkit_add_payment_fee' );
function wpkit_add_payment_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    $payment_method = WC()->session->get('chosen_payment_method');
    if ( 'cod' === $payment_method ) { // пример: комиссия только для оплаты при получении
        $fee = $cart->subtotal * 0.05; // 5% комиссия
        $cart->add_fee( 'Комиссия за оплату при получении', $fee, true, '' );
    }
}

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

  1. Откройте файл functions.php вашей дочерней темы или создайте плагин для пользовательских функций.
  2. Вставьте код для изменения цены товара в корзине или добавления комиссии, в зависимости от задачи.
  3. При необходимости укажите условие для конкретного способа оплаты, используя WC()->session->get('chosen_payment_method').
  4. Сохраните изменения и очистите кеш WooCommerce (если установлен плагин кеширования).
  5. Протестируйте сценарий, сделав заказ с выбранным способом оплаты.

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

  • Добавьте товар в корзину и перейдите к оформлению заказа.
  • Выберите способ оплаты, для которого прописана логика изменения цены.
  • Обратите внимание на итоговую сумму в разделе «Итог» — она должна учитывать изменённую цену товара или дополнительную комиссию.
  • При изменении цены товара в корзине проверьте, что цена товара изменилась в корзине, а не только итоговая сумма.
  • Для дополнительной проверки откройте консоль разработчика в браузере и проверьте запросы AJAX корзины — цена должна обновляться корректно.

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

  • Изменение цены вне хука woocommerce_before_calculate_totals
    Цена товара изменится некорректно, итоговая сумма не пересчитается. Решение: использовать только этот хук для изменения цены в корзине.
  • Комиссия добавляется всегда, а не по условию
    Проверьте условие, например, способ оплаты. Используйте правильный идентификатор метода оплаты.
  • Изменения не отображаются из-за кеша
    Очистите кеш страниц и кеш WooCommerce (если используется). Временно отключите кеширование для теста.
  • Цена товара меняется в базе
    Не меняйте цену товара через update_post_meta или напрямую — это нарушит данные. Используйте методы объекта продукта в корзине.

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

  • Не храните изменённые цены в пользовательских метаполях заказа, если это не требуется — лучше рассчитывать динамически.
  • Проверяйте, что функция не вызывается в админке и не вызывает избыточные вычисления, используя проверки is_admin() и DOING_AJAX.
  • Если добавляете комиссии, используйте четкие названия и указывайте, облагается ли комиссия налогом (параметр в $cart->add_fee()).
  • Тестируйте на разных способах оплаты и в различных сценариях оформления заказа.

Сравнение способов изменения стоимости товара в WooCommerce

СпособОписаниеПлюсыМинусы
Изменение цены в корзине (woocommerce_before_calculate_totals)Меняет цену товара динамически в корзине и заказеОтражается на всех расчетах, корректно работает с налогамиНельзя менять цену товара в базе, подходит не для всех случаев
Добавление комиссии (woocommerce_cart_calculate_fees)Добавляет дополнительную плату к сумме заказаПростая реализация, не меняет цену товараОтдельно отображается, не подходит для прямого изменения цены
Изменение цены товара в базеМеняет цену в метаданных товараПостоянное изменение, влияет на все заказыРиск рассинхронизации, не рекомендуется
Как добавить дополнительное поле в форму регистрации WordPress с помощью кода
15.12.2025
Как создать массовое сообщение в WordPress с помощью PHP
16.11.2025
Автоматизация создания и удаления тем в WordPress через код
22.01.2026
WooCommerce: как использовать хуки для автоматического изменения стоимости товаров
07.07.2026
Как удалить не удаляемые плагины в WordPress: эффективные методы
20.11.2025