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

|

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

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

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

Пошаговое решение: изменение цены товаров при оплате

1. Используем хук для перезаписи цены в корзине

Чтобы изменить цену товара до оформления заказа, можно использовать фильтр woocommerce_before_calculate_totals. Вот пример кода, меняющего цену товара на 90% от исходной, если выбрана оплата определённым способом:

add_action('woocommerce_before_calculate_totals', 'custom_discount_based_on_payment_method', 10, 1);
function custom_discount_based_on_payment_method($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Проверяем выбранный метод оплаты
    $chosen_payment = WC()->session->get('chosen_payment_method');
    if ($chosen_payment !== 'cod') return; // только для наложенного платежа

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $original_price = $cart_item['data']->get_price();
        $new_price = $original_price * 0.9; // 10% скидка
        $cart_item['data']->set_price($new_price);
    }
}

2. Изменение цены уже в заказе после оплаты

Если нужно изменить цену товаров после успешной оплаты, например, для корректировки стоимости в заказе, стоит использовать хук woocommerce_order_status_completed. В этом примере уменьшим цену каждого товара в заказе на 5%:

add_action('woocommerce_order_status_completed', 'custom_update_order_item_prices_after_payment', 10, 1);
function custom_update_order_item_prices_after_payment($order_id) {
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item_id => $item) {
        $original_total = $item->get_total();
        $new_total = $original_total * 0.95; // снижение на 5%
        $item->set_total($new_total);
        $item->save();
    }
    $order->calculate_totals();
    $order->save();
}

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

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

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

Сравнение способов изменения цены: фильтр корзины vs изменение после оплаты

МетодКогда применяетсяПреимуществаНедостатки
woocommerce_before_calculate_totals В процессе формирования корзины перед оформлением заказа Цены видны пользователю сразу, влияет на итоговую сумму заказа Нельзя менять цены уже созданных заказов; требует сессии
woocommerce_order_status_completed После успешного завершения оплаты (статус заказа) Можно изменять цену в заказах, гибко настраивать логику после оплаты Пользователь видит цену до оплаты, возможны рассогласования
Оптимизация базы данных WordPress: удаляем избыточные данные для ускорения сайта
18.11.2025
Как удалить или изменить slug постов WordPress без потери ссылок
07.01.2026
WooCommerce: автоматическое удаление просмотренных товаров из корзины
30.04.2026
WooCommerce: как автоматически удалять товары из корзины после оплаты
11.05.2026
Как удалить пустые термины в WordPress через код и плагины
05.04.2026
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »