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

Почему нужно менять стоимость товаров в корзине динамически

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

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

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

  • Правильно ли добавлен хук woocommerce_before_calculate_totals с приоритетом не ниже 10.
  • Изменяете ли вы цену через метод $cart_item['data']->set_price(), а не напрямую в $cart_item['data']->price.
  • Не кэшируется ли стоимость корзины (иногда плагины кеша мешают).
  • Вызывается ли принудительное обновление корзины после изменения цены.

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

Допустим, нужно снизить цену на 20% для товаров с атрибутом color=red. Добавьте следующий код в functions.php вашей темы или в плагин:

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 ) {
        $product = $cart_item['data'];
        $attributes = $product->get_attributes();

        // Проверяем наличие атрибута color и его значение
        if ( isset($attributes['pa_color']) ) {
            $terms = wc_get_product_terms( $product->get_id(), 'pa_color', array( 'fields' => 'slugs' ) );
            if ( in_array('red', $terms) ) {
                $original_price = $product->get_regular_price();
                $new_price = $original_price * 0.8; // скидка 20%
                $product->set_price( $new_price );
            }
        }
    }
}

Обратите внимание, что мы используем таксономию атрибута pa_color и проверяем наличие значения red. Цена меняется через метод set_price().

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

  • Добавьте в корзину товар с атрибутом color=red и другой товар без этого атрибута.
  • Обновите страницу корзины и убедитесь, что цена товара с красным цветом уменьшилась на 20%.
  • Проверьте в разных браузерах и в режиме инкогнито, чтобы исключить кеширование.

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

  • Изменение цены напрямую в свойстве price объекта продукта
    Так делать не стоит, используйте set_price(), иначе цена не обновится в корзине.
  • Отсутствие проверки контекста (админка, AJAX)
    В коде надо игнорировать админские запросы, чтобы не ломать логику.
  • Не сбрасывается кеш корзины
    Если используете кеш, отключите его для страниц корзины и оформления заказа.
  • Использование неверного атрибута
    Проверьте, что таксономия атрибута имеет префикс pa_ и значение совпадает с тем, что в базе.

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

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

Сравнение вариантов реализации изменения цены в корзине

МетодПлюсыМинусыКогда использовать
Хук woocommerce_before_calculate_totals + set_price()Гибко, официально, работает с любыми условиямиТребует знания кода, легко ошибиться с условиямиДля сложных скидок по атрибутам, правилам
Плагины скидок и купоновПростота настройки, без кодаОграниченная гибкость, нагрузка на сайтДля стандартных скидок и акций
Изменение цены в БД напрямуюРаботает без хуковНебезопасно, ломает логику WooCommerceНе рекомендуется
Как закрыть тонкие страницы поисковых фильтров в WordPress без потери полезной индексации
22.08.2026
Как отключить дубли архивов, тегов и авторов в WordPress без поломки индексации
19.08.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.