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

В чем заключается проблема с изменением стоимости вариативных товаров в WooCommerce

WooCommerce позволяет создавать вариативные товары с разными атрибутами и ценами. Однако, по умолчанию цена на странице товара меняется только при выборе вариации, а если требуется динамически изменять цену в зависимости от дополнительных опций (чекбоксы, селекты вне вариаций) или сложных условий, стандартных настроек недостаточно.

Типичная ситуация: вариативный товар с базовой ценой, к которой нужно добавить или вычесть стоимость в зависимости от выбранных опций, не входящих в вариации. Например, доплата за ускоренную доставку, персонализацию, упаковку и т. п.

Диагностика: как проверить, что стандартный WooCommerce не решит вашу задачу

  • Создайте вариативный товар с несколькими вариациями и убедитесь, что цена меняется при выборе вариации.
  • Добавьте кастомные поля (например, чекбоксы, селекты) на страницу товара через плагин или код, но посмотрите, что цена при этом остается фиксированной.
  • Проверьте, что выбранные опции не влияют на цену в корзине и на странице оформления заказа.

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

Пошаговое решение: динамическое изменение стоимости вариативного товара на основе пользовательских опций

1. Добавляем кастомные опции на страницу товара

Допустим, нам надо добавить чекбокс «Ускоренная доставка» с доплатой 500 рублей.

add_action('woocommerce_before_add_to_cart_button', function() {
    echo '<p class="form-field">';
    echo '<label for="fast_delivery"><input type="checkbox" id="fast_delivery" name="fast_delivery" value="1" /> Ускоренная доставка (+500 ₽)</label>';
    echo '</p>';
});

2. Сохраняем значение опции при добавлении в корзину

add_filter('woocommerce_add_cart_item_data', function($cart_item_data, $product_id, $variation_id) {
    if (isset($_POST['fast_delivery'])) {
        $cart_item_data['fast_delivery'] = true;
        // Генерируем уникальный ключ, чтобы разные опции создавали разные строки в корзине
        $cart_item_data['unique_key'] = md5(microtime().rand());
    }
    return $cart_item_data;
}, 10, 3);

3. Добавляем метаданные в корзину и показываем в корзине/чеке

add_filter('woocommerce_get_item_data', function($item_data, $cart_item) {
    if (!empty($cart_item['fast_delivery'])) {
        $item_data[] = [
            'key' => 'Ускоренная доставка',
            'value' => 'Да'
        ];
    }
    return $item_data;
}, 10, 2);

4. Изменяем цену товара в корзине

add_action('woocommerce_before_calculate_totals', function($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        if (!empty($cart_item['fast_delivery'])) {
            $price = $cart_item['data']->get_price();
            $cart_item['data']->set_price($price + 500);
        }
    }
});

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

  • Откройте страницу вариативного товара, отметьте чекбокс «Ускоренная доставка».
  • Добавьте товар в корзину — в корзине должна появиться строка «Ускоренная доставка: Да».
  • Проверьте, что цена товара в корзине увеличилась на 500 рублей.
  • На странице оформления заказа убедитесь, что опция сохраняется и сумма заказа корректна.

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

  • Цена не меняется в корзине: Возможно, код изменения цены в woocommerce_before_calculate_totals не сработал. Проверьте, что функция подключена правильно и в начале стоит проверка if (is_admin() && !defined('DOING_AJAX')) return;.
  • Опция не сохраняется для разных товаров: Нужно добавить уникальный ключ в cart_item_data, иначе опции будут объединяться в одну строку.
  • Опция не показывается в корзине или заказе: Убедитесь, что фильтр woocommerce_get_item_data корректно добавляет метаданные.
  • Цена сбрасывается при обновлении корзины: Проверьте, что цена меняется в цикле woocommerce_before_calculate_totals и не происходит конфликтов с другими плагинами.

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

  • Всегда проверяйте и валидируйте входящие данные из $_POST.
  • Используйте уникальные ключи для пользовательских опций, чтобы избежать слияния позиций в корзине.
  • Кешируйте результаты, если рассчитываете сложные цены на основе множества опций.
  • Тестируйте код на дев-сервере и с разными темами/плагинами, чтобы исключить конфликты.

Сравнение вариантов реализации изменения цены вариативных товаров

МетодПлюсыМинусы
Плагины (например, WooCommerce Extra Product Options)Готовое решение, настройка без кода, поддержка сложных опцийПлатные, могут замедлять сайт, ограниченная кастомизация
Кастомный код (как в статье)Полный контроль, легковесность, бесплатныйТребует навыков PHP, возможны ошибки в реализации
Использование вариаций WooCommerceПростая реализация, поддержка в ядреОграничено по количеству вариаций, не подходит для дополнительных опций
Автоматическое отключение неактивных пользователей WordPress
02.01.2026
Как создать собственный виджет в WordPress с примером кода
15.11.2025
Как создать собственный шорткод в WordPress
05.11.2025
WooCommerce: Автоматическое изменение стоимости товаров с точной границей и проверкой условий
18.05.2026
WordPress автоматическое создание резервных копий: лучшие методы и практические примеры
26.11.2025