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

Проблема: Как автоматически менять цену товара в WooCommerce при выборе разных атрибутов

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

Диагностика проблемы

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

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

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

1. Подготовка атрибутов

Создайте атрибуты в WooCommerce через Товары > Атрибуты. Например, атрибут Цвет с вариантами Красный, Синий.

2. Добавление пользовательских цен для атрибутов

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

function wptool_get_price_by_attribute( $attribute_value ) {
    $prices = array(
        'Красный' => 1200,
        'Синий' => 1500,
    );
    return isset( $prices[ $attribute_value ] ) ? $prices[ $attribute_value ] : null;
}

3. Динамическое обновление цены на странице товара

Добавим JavaScript, который будет ловить изменение select для атрибута и менять отображаемую цену:

add_action( 'wp_footer', 'wptool_dynamic_price_script' );
function wptool_dynamic_price_script() {
    if ( ! is_product() ) {
        return;
    }
    ?>
    <script>
    jQuery(document).ready(function($) {
        var prices = {
            'Красный': 1200,
            'Синий': 1500
        };
        var priceContainer = $('.summary .price');
        $('select.attribute-select').on('change', function() {
            var selected = $(this).val();
            if (prices[selected]) {
                priceContainer.html('<span class="woocommerce-Price-amount amount">' + prices[selected] + ' ₽</span>');
            }
        });
    });
    </script>
    <?php
}

Убедитесь, что селектор select.attribute-select совпадает с селектором вашего атрибута (можно проверить через инструменты разработчика браузера).

4. Обновление цены в корзине и заказе

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

add_filter( 'woocommerce_add_cart_item_data', 'wptool_add_cart_item_data', 10, 3 );
function wptool_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    if ( isset( $_POST['attribute_pa_color'] ) ) { // пример для атрибута color
        $color = sanitize_text_field( $_POST['attribute_pa_color'] );
        $price = wptool_get_price_by_attribute( $color );
        if ( $price ) {
            $cart_item_data['custom_price'] = $price;
        }
    }
    return $cart_item_data;
}

add_action( 'woocommerce_before_calculate_totals', 'wptool_set_custom_price', 20, 1 );
function wptool_set_custom_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    foreach ( $cart->get_cart() as $cart_item ) {
        if ( isset( $cart_item['custom_price'] ) ) {
            $cart_item['data']->set_price( $cart_item['custom_price'] );
        }
    }
}

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

  • На странице товара при смене атрибута меняется цена в блоке с ценой.
  • При добавлении товара в корзину и переходе в нее отображается цена, соответствующая выбранному атрибуту.
  • В оформлении заказа и админке WooCommerce цена совпадает с выбранной.

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

  • Неправильный селектор в JavaScript: используйте инструменты разработчика, чтобы найти правильный select для атрибута. В WooCommerce атрибуты с префиксом pa_ в селекторах.
  • Не учитывается цена в корзине: проверьте, что фильтры woocommerce_add_cart_item_data и woocommerce_before_calculate_totals подключены и работают.
  • Цена не обновляется при AJAX добавлении в корзину: добавьте поддержку AJAX, убедитесь, что скрипты загружаются корректно.

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

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

Сравнение подходов к динамическому изменению цены

МетодПлюсыМинусыКому подходит
Вариации WooCommerceСтандартное решение, поддерживается ядромСложно при большом количестве атрибутовМалое и среднее число вариантов
Кастомный код с JS и фильтрамиГибкость, можно менять цену без вариацийТребует поддержки и тестированияРазработчики с опытом PHP и JS
Плагины для динамических ценПростота внедренияМогут быть платными, нагрузка на сайтБыстрое решение для непрофильных разработчиков
Как создать динамическую страницу в WordPress с помощью shortcode
19.12.2025
Как установить ограничения на регистрацию пользователей в WordPress
21.01.2026
Как автоматизировать проверку и удаление спам-комментариев в WordPress
25.01.2026
Оптимизация производительности WordPress без плагинов: практические советы и примеры кода
03.12.2025
Как удалить метаданные из медиатеки WordPress: практическое руководство
30.11.2025