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

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

В стандартном WooCommerce цена товара фиксирована и не зависит от количества, выбранного покупателем. Однако в ряде случаев бизнес-задачи требуют динамического изменения стоимости:

  • Скидки при покупке больших объемов (оптовые цены)
  • Увеличение цены при повышенном спросе на определенное количество
  • Внедрение ступенчатого ценообразования без использования сложных плагинов

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

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

1. Использование фильтра woocommerce_before_calculate_totals

Этот фильтр вызывается перед подсчетом итоговой суммы в корзине. Мы можем изменить цену товара прямо в объекте WC_Cart_Item.

2. Пример кода для изменения цены при покупке от 5 штук одного товара

add_action('woocommerce_before_calculate_totals', 'custom_quantity_based_price', 10, 1);
function custom_quantity_based_price(WC_Cart $cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    // Проходим по каждому товару в корзине
    foreach ($cart->get_cart() as $cart_item) {
        $quantity = $cart_item['quantity'];
        // Проверяем условие по количеству
        if ($quantity >= 5) {
            // Задаем новую цену с 10% скидкой
            $original_price = $cart_item['data']->get_regular_price();
            $discounted_price = $original_price * 0.9;
            $cart_item['data']->set_price($discounted_price);
        }
    }
}

Этот код уменьшает цену на 10% при покупке 5 и более единиц одного товара. Важно, что мы меняем цену только для расчета корзины, не трогая базовую цену товара в админке.

Как проверить, что решение сработало

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

Частые ошибки при реализации и их исправление

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

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

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

Таблица сравнения способов изменения цены в зависимости от количества

СпособПлюсыМинусыРекомендации
Код на woocommerce_before_calculate_totalsЛегко кастомизировать, нет лишних плагиновТребует базовых знаний PHP, ограничен при сложных сценарияхПодходит для простых скидок и цен
Плагины оптовых скидок (например, WooCommerce Dynamic Pricing)Многофункциональность, готовые решенияДополнительные нагрузки, возможны конфликтыИспользовать для сложных правил и масштабных проектов
Изменение цены через пользовательские метаполяГибкость для индивидуальных товаровСложность поддержки и интеграцииРекомендуется в сочетании с хуками корзины

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

add_action('woocommerce_before_calculate_totals', 'custom_price_by_role_and_quantity', 10, 1);
function custom_price_by_role_and_quantity(WC_Cart $cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    $user = wp_get_current_user();
    foreach ($cart->get_cart() as $cart_item) {
        $quantity = $cart_item['quantity'];
        if (in_array('wholesale_customer', (array) $user->roles) && $quantity >= 10) {
            $price = $cart_item['data']->get_regular_price();
            $cart_item['data']->set_price($price * 0.8); // 20% скидка для оптовиков
        }
    }
}

Этот код демонстрирует, как комбинировать условия по роли пользователя и количеству, что часто требуется в WooCommerce.

Как изменить атрибуты товаров WooCommerce в зависимости от роли пользователя
30.05.2026
WooCommerce: как изменить стоимость товара в зависимости от количества в корзине
16.06.2026
Автоматическое удаление старых changelog-ов в WordPress: практическое руководство
09.02.2026
Как создать собственный виджет в WordPress с примером кода
13.11.2025
Как удалить все заказы WooCommerce одним кодом
19.05.2026