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

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

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

Как понять, что цена не меняется?

  • Добавляете товар в корзину, цена остаётся базовой.
  • Несмотря на попытки через фильтры, итоговая стоимость заказа не меняется.
  • Проблемы с кешированием — цена меняется в админке, но на фронте нет.

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

Для динамического изменения цены используйте хук woocommerce_before_calculate_totals. Он позволяет изменить цену у объекта $cart_item перед подсчётом итогов.

Пример: меняем цену товара на 50% для всех пользователей, кроме администраторов.

add_action('woocommerce_before_calculate_totals', 'wpall_dynamic_price_change', 20, 1);
function wpall_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'];
        if ( ! current_user_can('administrator') ) {
            $new_price = $product->get_regular_price() * 0.5; // 50% скидка
            $product->set_price( $new_price );
        }
    }
}

Обратите внимание, что мы проверяем, чтобы код не выполнялся в административной части и не вызывался несколько раз подряд.

Изменение цены в зависимости от количества товара

Если нужно менять цену при покупке большего количества, добавьте проверку количества:

add_action('woocommerce_before_calculate_totals', 'wpall_dynamic_price_by_quantity', 20, 1);
function wpall_dynamic_price_by_quantity( $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'];

        if ( $quantity >= 5 ) {
            $discount_price = $product->get_regular_price() * 0.8; // 20% скидка при 5+ товарах
            $product->set_price( $discount_price );
        }
    }
}

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

Чтобы убедиться, что цена изменилась:

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

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

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

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

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

Сравнение способов изменения цены в WooCommerce

МетодПлюсыМинусы
Фильтр woocommerce_get_price_htmlПростая смена отображения ценыНе меняет реальную цену в корзине и заказе
Хук woocommerce_before_calculate_totalsМеняет цену товара перед расчетом итога, работает корректноТребует аккуратного кода, чтобы не повторять изменения
Использование плагинов скидокГотовые решения с интерфейсом и настройкамиМогут быть тяжелыми и влиять на производительность
Автообновление статуса заказа в WooCommerce по срокам
25.04.2026
Как удалить заблокированных пользователей в WordPress
14.04.2026
Как создать автоматический сбор отзывов в WordPress с подтверждением
27.03.2026
Как избежать конфликтов между плагинами WordPress — практические решения и примеры кода
29.11.2025
Как создать многоуровневую навигацию в WordPress с примерами кода
10.02.2026