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

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

Часто в интернет-магазинах на WooCommerce возникает необходимость динамически изменять цену товаров в корзине в зависимости от различных условий: скидки на определённые категории, специальные промоакции, комбинации товаров, или учет пользовательских данных (например, членство в клубе). Стандартными средствами WooCommerce это сделать сложно без вмешательства в код.

Основная сложность — корректно изменить цену товара в корзине, чтобы она отображалась и учитывалась при расчёте итоговой суммы, а также сохранялась при оформлении заказа.

Пошаговое решение: как программно изменять цену товара в корзине

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

Этот хук вызывается перед подсчётом итогов корзины. В нём можно изменить объект WC_Cart_Item, изменяя цену товара.

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

add_action('woocommerce_before_calculate_totals', 'custom_change_price_based_on_category', 20, 1);
function custom_change_price_based_on_category($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    
    // Проверяем, что корзина не пуста
    if (empty($cart->get_cart())) return;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if (has_term('special-category', 'product_cat', $product->get_id())) {
            // Устанавливаем новую цену, например, скидка 20%
            $original_price = $product->get_regular_price();
            $new_price = $original_price * 0.8;
            $product->set_price($new_price);
        }
    }
}

В этом примере для товаров из категории special-category применяется скидка 20%.

3. Обработка сложных условий — пример с проверкой количества товара в корзине

add_action('woocommerce_before_calculate_totals', 'custom_bulk_discount_for_category', 20, 1);
function custom_bulk_discount_for_category($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    
    $target_category = 'bulk-discount-cat';
    $total_qty = 0;

    // Считаем общее количество товаров из категории
    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        if (has_term($target_category, 'product_cat', $product->get_id())) {
            $total_qty += $cart_item['quantity'];
        }
    }

    // Если товаров больше 5, применяем скидку 15%
    if ($total_qty >= 5) {
        foreach ($cart->get_cart() as $cart_item) {
            $product = $cart_item['data'];
            if (has_term($target_category, 'product_cat', $product->get_id())) {
                $price = $product->get_regular_price();
                $product->set_price($price * 0.85);
            }
        }
    }
}

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

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

Частые ошибки и способы их устранения

  • Цена не меняется в корзине: Убедитесь, что ваш код подключён и хук woocommerce_before_calculate_totals срабатывает. Проверьте, нет ли конфликтов с другими плагинами, которые могут сбрасывать цену.
  • Изменение цены влияет на базовую цену товара в магазине: Никогда не меняйте цену товара напрямую вне корзины. Меняйте цену только через объект корзины $cart_item['data']->set_price(), чтобы не менять базовые данные в базе.
  • Цены меняются при обновлении страницы, но не сохраняются в заказе: Убедитесь, что цена меняется до подсчёта итогов, и что нет других хуков или плагинов, которые переопределяют цену на этапе оформления.
  • Неверные цены при использовании кеширования: Отключите кеширование для страниц корзины и оформления заказа или настройте исключения для динамических цен.

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

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

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

МетодПлюсыМинусыПрименимость
Использование хука woocommerce_before_calculate_totalsГибкость, полное управление ценами в корзине, без изменения базыТребует навыков PHP, возможны конфликты с другими плагинамиЛучший для кастомных условий и динамических скидок
Использование плагинов скидок (например, WooCommerce Dynamic Pricing)Простота настройки, много опций без кодаЗависимость от стороннего ПО, нагрузка, ограниченная кастомизацияПодходит для стандартных сценариев скидок
Изменение цены товара напрямую в базеПростота измененияНарушает целостность данных, влияет на все заказы, не рекомендуетсяНе рекомендуется к использованию
Как создать автоматическое отправление email в WordPress с помощью WP-Cron
11.02.2026
Как автоматизировать создание и удаление записей через WP-Cron в WordPress
08.01.2026
WooCommerce: как автоматически удалять товары с нулевым запасом из корзины
05.06.2026
Автоматический экспорт постов WordPress в PDF: пошаговое руководство
05.01.2026
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.12.2025

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