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

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

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

Как понять, что автоматическое изменение цены необходимо?

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

Пошаговое решение: изменение цены товара в корзине с помощью хуков WooCommerce

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

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

    // Чтобы не применять несколько раз
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

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

        // Пример условия: если куплено больше 3 штук, цена снижается на 10%
        if ( $quantity > 3 ) {
            $original_price = $product->get_regular_price();
            $discounted_price = $original_price * 0.9;
            $product->set_price( $discounted_price );
        } else {
            // Возвращаем оригинальную цену, если условие не выполняется
            $product->set_price( $product->get_regular_price() );
        }
    }
}

В этом примере мы проверяем количество товара и устанавливаем новую цену, если количество больше 3.

Как изменить цену в зависимости от роли пользователя

add_action('woocommerce_before_calculate_totals', 'custom_price_by_user_role', 20, 1);
function custom_price_by_user_role($cart) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;
    if ( did_action('woocommerce_before_calculate_totals') >= 2 ) return;

    $user = wp_get_current_user();
    if ( in_array('wholesale_customer', (array) $user->roles) ) {
        foreach ( $cart->get_cart() as $cart_item ) {
            $product = $cart_item['data'];
            $price = $product->get_regular_price();
            // Скидка 15% для оптовиков
            $product->set_price( $price * 0.85 );
        }
    }
}

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

  • Добавьте в корзину нужное количество товаров и убедитесь, что цена изменилась в соответствии с условием.
  • Проверьте, что на странице оформления заказа и в email-уведомлениях отображается скорректированная цена.
  • Очистите кэш сайта и браузера для корректного отображения изменений.

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

  • Цены не меняются в корзине: проверьте, что ваш код подключен через functions.php темы или плагина и что хук woocommerce_before_calculate_totals вызывается.
  • Изменение цены происходит несколько раз: используйте проверку did_action, чтобы предотвратить повторное применение.
  • Цена меняется в админке или AJAX-запросах не там, где нужно: добавьте проверку is_admin() и DOING_AJAX, чтобы ограничить выполнение кода.
  • Конфликты с другими плагинами скидок: протестируйте с отключенными плагинами скидок и проверьте совместимость.

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

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

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

МетодПлюсыМинусыПример
Хук woocommerce_before_calculate_totalsГибкий, позволяет менять цену программноТребует навыков PHP, возможны конфликты с другими плагинамиПример кода выше
Плагины скидок (Dynamic Pricing)Удобны для настройки без кодаМогут быть тяжелыми, не всегда гибкиеWooCommerce Dynamic Pricing & Discounts
Купоны WooCommerceПростые в использованииОграниченные условия и гибкостьВстроенный функционал WooCommerce
Автоматическое отключение неактивных пользователей WordPress
02.01.2026
Автоматическое удаление неиспользуемых плагинов в WordPress
04.03.2026
Автоматическое отключение способов оплаты в WooCommerce при неудачной оплате
09.07.2026
Как автоматически удалять неиспользуемые виджеты WordPress
27.03.2026
WooCommerce: автоматическое изменение наличия товаров при изменении заказа
16.07.2026