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

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

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

Как изменить стоимость товара в WooCommerce по количеству: пошаговое решение

1. Используем хук woocommerce_before_calculate_totals

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

2. Добавляем функцию изменения цены

add_action('woocommerce_before_calculate_totals', 'custom_price_by_quantity', 20, 1);
function custom_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 ) {
        $quantity = $cart_item['quantity'];
        $product = $cart_item['data'];
        $base_price = $product->get_regular_price();

        // Пример: скидка 10% если больше 10 шт
        if ( $quantity >= 10 ) {
            $new_price = $base_price * 0.9;
        } elseif ( $quantity < 3 ) {
            // Наценка 20% если меньше 3 шт
            $new_price = $base_price * 1.2;
        } else {
            $new_price = $base_price;
        }

        $product->set_price( $new_price );
    }
}

3. Добавляем условия для более сложных сценариев

В примере выше можно расширить логику, например, учитывать категории товаров, пользователей, даты и т.д. Главное — менять цену через $product->set_price().

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

  • Добавьте в корзину один товар в количестве 1, проверьте цену — должна быть базовой с наценкой.
  • Добавьте количество 5, цена должна быть без изменений.
  • Добавьте 10 и больше — цена должна снизиться на 10%.
  • Для проверки точности используйте инструменты браузера и консоль WooCommerce, а также сбросьте кэш, если используете кеширующие плагины.

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

  • Изменение цены в админке или дублирование скидок: не забывайте проверять is_admin() и DOING_AJAX, чтобы не ломать админ-панель.
  • Повторный вызов хуков: если функция вызывается несколько раз, могут возникать проблемы — используйте did_action() для контроля.
  • Конфликты с кешем: кеширующие плагины могут показывать старую цену. Очищайте кеш после внесения изменений.
  • Цена не меняется: убедитесь, что используете $product->set_price(), а не напрямую меняете свойства объекта.

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

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

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

МетодПлюсыМинусыПример
Код на woocommerce_before_calculate_totalsГибкость, без плагиновТребует навыков, можно ошибитьсяПример выше
Плагины (например, "Dynamic Pricing")Простота настройки, готовые шаблоныСтоимость, нагрузкаWooCommerce Dynamic Pricing
Использование пользовательских типов ценУдобно для сложных правилСложнее для поддержкиДополнительные метаполя
Как создать многоуровневую навигацию в WordPress с помощью ABC Pagination
28.12.2025
Как удалить все комментарии в WordPress одним кликом
21.11.2025
Автоматическое удаление не оплаченных заказов в WooCommerce по времени
26.06.2026
Как избежать проблем с кешированием в WordPress: практические советы и решения
02.02.2026
Как избежать проблем с просмотром видео в WordPress: практические решения и плагины
08.01.2026