Диагностика задачи: зачем менять цену товара при оплате
В 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, '' );
}
}Пошаговое руководство по внедрению
- Откройте файл
functions.phpвашей дочерней темы или создайте плагин для пользовательских функций. - Вставьте код для изменения цены товара в корзине или добавления комиссии, в зависимости от задачи.
- При необходимости укажите условие для конкретного способа оплаты, используя
WC()->session->get('chosen_payment_method'). - Сохраните изменения и очистите кеш WooCommerce (если установлен плагин кеширования).
- Протестируйте сценарий, сделав заказ с выбранным способом оплаты.
Как проверить, что изменение стоимости сработало
- Добавьте товар в корзину и перейдите к оформлению заказа.
- Выберите способ оплаты, для которого прописана логика изменения цены.
- Обратите внимание на итоговую сумму в разделе «Итог» — она должна учитывать изменённую цену товара или дополнительную комиссию.
- При изменении цены товара в корзине проверьте, что цена товара изменилась в корзине, а не только итоговая сумма.
- Для дополнительной проверки откройте консоль разработчика в браузере и проверьте запросы 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) | Добавляет дополнительную плату к сумме заказа | Простая реализация, не меняет цену товара | Отдельно отображается, не подходит для прямого изменения цены |
| Изменение цены товара в базе | Меняет цену в метаданных товара | Постоянное изменение, влияет на все заказы | Риск рассинхронизации, не рекомендуется |