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

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

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

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

Основные хуки для изменения стоимости в WooCommerce

Прежде всего стоит понять, какой хук использовать для изменения цены товара в заказе. woocommerce_before_calculate_totals — главный хук для изменения цены товаров в корзине перед расчетом итогов.

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

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 20, 1);
function custom_change_cart_item_price($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        // условие для изменения цены
        if (isset($cart_item['data']) && $cart_item['data']->get_id() == 123) {
            $new_price = 50; // новая цена
            $cart_item['data']->set_price($new_price);
        }
    }
}

Почему важно использовать именно этот хук

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

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

Шаг 1. Определить условие изменения цены

Например, меняем цену, если выбран способ оплаты «Оплата при получении» (COD).

Шаг 2. Добавить проверку выбранного метода оплаты и изменить цену в корзине

add_action('woocommerce_before_calculate_totals', 'change_price_on_cod_payment', 20, 1);
function change_price_on_cod_payment($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    // Проверяем выбран ли способ оплаты
    $chosen_payment_methods = WC()->session->get('chosen_payment_method');
    if ($chosen_payment_methods !== 'cod') return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        // Например, уменьшаем цену на 10%
        $original_price = $product->get_regular_price();
        $new_price = $original_price * 0.9;
        $product->set_price($new_price);
    }
}

Шаг 3. Проверка результата

1. Добавьте товар в корзину.
2. На странице оформления заказа выберите способ оплаты «Оплата при получении».
3. Убедитесь, что цена товаров уменьшилась на 10%.
4. Перейдите к оплате и проверьте итоговую сумму заказа.

Чек-лист для успешного внедрения изменения цены в WooCommerce

  • Используйте хук woocommerce_before_calculate_totals для изменения цены в корзине.
  • Проверяйте, не работает ли код в административной части (чтобы не влиять на админ-панель).
  • При изменении цены всегда используйте метод set_price() объекта товара в корзине.
  • Проверяйте выбранный способ оплаты через сессию WooCommerce.
  • Тестируйте изменения на нескольких товарах и способах оплаты.
  • Отслеживайте совместимость с другими плагинами, которые влияют на цены и скидки.

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

  • Изменение цены в админке или в не подходящий момент.
    Решение: добавляйте проверку if (is_admin() && !defined('DOING_AJAX')) return; в начале функции, чтобы не влиять на админ-панель.
  • Цена не меняется при смене способа оплаты на странице оформления.
    Решение: нужно обновлять корзину через JavaScript или использовать хук woocommerce_checkout_update_order_review, чтобы перезапустить расчет цен при выборе оплаты.
  • Изменение цены влияет на исходные данные товара.
    Решение: меняйте цену только в объекте товара корзины, а не в базе данных или объекте продукта глобально.

Проверка обновления цены при смене способа оплаты через AJAX

Для корректной работы при смене способа оплаты добавьте следующий код, который обновит корзину после выбора оплаты:

add_action('woocommerce_checkout_update_order_review', 'refresh_cart_on_payment_method_change');
function refresh_cart_on_payment_method_change($posted_data) {
    parse_str($posted_data, $output);
    if (isset($output['payment_method'])) {
        WC()->session->set('chosen_payment_method', $output['payment_method']);
    }
}

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

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

Сравнение вариантов решения задачи

МетодПлюсыМинусы
Изменение цены через woocommerce_before_calculate_totalsГибко, без сторонних плагинов, контролируемоНужны знания PHP, возможны ошибки при неправильной логике
Использование плагинов для динамических ценПростота настройки, готовый функционалДополнительная нагрузка, возможные конфликты, стоимость
Изменение цены через JavaScript на фронтендеБыстро, без вмешательства в PHPЦена не меняется на сервере, некорректный расчет итогов
Как правильно удалить или заблокировать роботов в robots.txt для WordPress
04.03.2026
Как удалить большие изображения из медиабиблиотеки WordPress для экономии места
11.02.2026
Как автоматически отключать неиспользуемые плагины в WordPress
06.04.2026
Как отлаживать REST API WordPress: практические методы и примеры
08.03.2026
Как удалить все незавершённые заказы WooCommerce без плагинов
23.04.2026