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

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

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

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

Как работает изменение цены товаров в WooCommerce

Для изменения цены товара на лету в WooCommerce используют фильтр woocommerce_before_calculate_totals. В этот момент можно перебрать все товары в корзине и изменить цену каждого WC_Cart_Item.

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

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

1. Добавляем фильтр в functions.php или свой плагин

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_based_on_cart', 10, 1);
function custom_dynamic_price_based_on_cart( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    // Получаем общую сумму корзины
    $cart_total = $cart->get_cart_contents_total();
    // Получаем общее количество товаров
    $cart_quantity = 0;
    foreach ( $cart->get_cart() as $cart_item ) {
        $cart_quantity += $cart_item['quantity'];
    }

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $original_price = $product->get_regular_price();

        // Пример правила: если сумма корзины больше 10000, даём скидку 10% на все товары
        if ( $cart_total > 10000 ) {
            $new_price = $original_price * 0.9; // скидка 10%
        } 
        // Пример второго правила: если количество товаров больше 5, применяем скидку 15%
        elseif ( $cart_quantity > 5 ) {
            $new_price = $original_price * 0.85; // скидка 15%
        } else {
            $new_price = $original_price; // без изменений
        }

        // Устанавливаем новую цену для товара в корзине
        $product->set_price( $new_price );
    }
}

2. Проверяем работу на фронте и в админке

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

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

  • Добавьте товары в корзину с суммой меньше 10 000 — цена должна быть без изменений.
  • Увеличьте сумму корзины выше 10 000 — цена каждого товара должна снизиться на 10%.
  • Проверьте, что количество товаров больше 5 — применится скидка 15% (если сумма меньше 10 000).
  • Перейдите на страницу оформления заказа, убедитесь, что итоговая сумма совпадает с изменёнными ценами.
  • Проверьте, что цены корректно отображаются в админке WooCommerce в разделе заказов.

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

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

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

  • Код изменения цены выполняется при каждом пересчёте корзины, поэтому не стоит ставить сложные и ресурсоёмкие условия в этот хук.
  • Используйте is_admin() && ! defined('DOING_AJAX') для исключения админских запросов, чтобы не влиять на административные операции.
  • Для более сложных правил применяйте кэширование результатов вычислений, если данные берутся из внешних источников.
  • Всегда проверяйте типы и значения входящих данных, чтобы избежать ошибок PHP и сбоев в работе магазина.

Сравнение вариантов реализации динамического ценообразования в WooCommerce

МетодПлюсыМинусыПример использования
Фильтр woocommerce_before_calculate_totalsПолный контроль над ценами, работает на уровне корзиныТребует знаний PHP, может влиять на производительность при сложных условияхИзменение цены в зависимости от суммы или количества в корзине
Плагины для динамического ценообразования (например, WooCommerce Dynamic Pricing)Готовые решения с UI, много опцийПлатные, могут конфликтовать с кастомным кодомПростая настройка скидок и акций без кода
Использование купонов и правил корзиныВстроенный функционал WooCommerce, простота использованияМеньше гибкости для сложных правил, не всегда подходит для динамического изменения цены товараСкидки при достижении суммы, бесплатная доставка
Как создать динамические фильтры в WordPress на примере WooCommerce
28.01.2026
Как изменить стоимость доставки в WooCommerce в зависимости от роли пользователя
07.05.2026
Как избежать проблем с просмотром видео в WordPress: практические решения и плагины
08.01.2026
Как использовать WP-Cron для автоматизации задач в WordPress
17.04.2026
Как добавить динамические метаданные в WordPress для улучшения SEO
12.03.2026