Автоматическое изменение цены товара в WooCommerce при выборе разных атрибутов

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

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

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

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

1. Проверка текущей структуры товара

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

Перейдите в админку WooCommerce → Товары → откройте нужный товар → Вариации. Там должны быть вариации с разными ценами.

2. Пример динамического изменения цены с использованием JavaScript и PHP

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

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_adjustment', 10, 1);
function custom_dynamic_price_adjustment( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $base_price = $product->get_regular_price();
        $additional_price = 0;

        $attributes = $cart_item['variation']; // атрибуты вариации
        // Например, если выбран атрибут color=red, добавим 100 рублей
        if ( isset($attributes['attribute_pa_color']) && $attributes['attribute_pa_color'] === 'red' ) {
            $additional_price += 100;
        }
        // Другие условия по атрибутам

        $new_price = $base_price + $additional_price;
        $product->set_price( $new_price );
    }
}

Этот код нужно добавить в functions.php вашей темы или в отдельный плагин.

3. Автоматическое обновление цены на странице товара с помощью AJAX

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

jQuery(function($) {
    $('form.variations_form').on('woocommerce_variation_select_change', function() {
        var form = $(this);
        var variation = form.data('product_variations').find(function(variation) {
            return form.find('select').toArray().every(function(select) {
                var attribute = $(select).data('attribute_name') || $(select).attr('name');
                return variation.attributes[attribute] === $(select).val();
            });
        });
        if (variation) {
            $('.woocommerce-variation-price .price').html(variation.price_html);
        }
    });
});

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

Пошаговое решение задачи

  1. Создайте переменный товар с необходимыми атрибутами и вариациями с базовыми ценами.
  2. Добавьте PHP-функцию для корректировки цены в корзине в зависимости от выбранных атрибутов, как в примере выше.
  3. Добавьте JavaScript на страницу товара для динамического обновления цены при смене атрибутов.
  4. Проверьте работу на тестовом товаре, меняя атрибуты и добавляя товар в корзину.

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

  • На странице товара при смене атрибутов цена должна обновляться без перезагрузки.
  • В корзине и на странице оформления заказа цена товара должна соответствовать выбранным атрибутам с учётом дополнительной логики.
  • Если цена не меняется — проверьте консоль браузера на ошибки JavaScript и логи PHP на наличие ошибок.

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

  • Ошибка: Цена не обновляется на странице товара.
    Причина: Отсутствует или неправильно подключён JavaScript, либо данные вариаций не загружены.
    Исправление: Проверьте, что form.variations_form содержит атрибут data-product_variations, и скрипт подключён после загрузки jQuery.
  • Ошибка: Цена в корзине не изменяется.
    Причина: Хук woocommerce_before_calculate_totals не вызывается, или функция не обновляет цену.
    Исправление: Убедитесь, что функция корректно вызывает $product->set_price() и что цена меняется в объекте товара.
  • Ошибка: Некорректное вычисление цены при сложных условиях.
    Причина: Логика в функции PHP не учитывает все варианты атрибутов.
    Исправление: Расширьте условия, добавьте логи для отладки, используйте error_log() для проверки значений.

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

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

Сравнение подходов: вариации vs кастомная логика на PHP

ХарактеристикаВариации WooCommerceКастомная логика на PHP
ГибкостьОграничена стандартными вариациямиВысокая, можно учитывать любые условия
Сложность реализацииНизкая, через админкуСредняя, требует навыков программирования
ПроизводительностьОптимизировано WooCommerceЗависит от качества кода и кеширования
ПоддержкаОфициальная WooCommerceСамостоятельная поддержка
Как создать автоматический импорт выставок в WordPress
12.04.2026
Как использовать хуки для расширения функционала WordPress
23.12.2025
Как удалить старые или неиспользуемые мета данные в WordPress
05.12.2025
Как правильно кэшировать данные в WordPress для ускорения сайта
31.12.2025
WooCommerce: как добавить кастомные поля в форму оформления заказа
12.05.2026