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

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

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

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

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

Пошаговое решение: динамическое изменение цены товара на основе выбранных атрибутов

1. Добавление пользовательских атрибутов к товару

В админке WooCommerce создайте атрибуты и добавьте их к товару. Для примера возьмём атрибут extra_feature с вариантами none, premium.

2. Перехват цены на сервере с помощью фильтра woocommerce_product_get_price

Добавим функцию, которая при загрузке цены учитывает выбранный атрибут из сессии или запроса.

add_filter('woocommerce_product_get_price', 'custom_dynamic_price_based_on_attribute', 10, 2);
function custom_dynamic_price_based_on_attribute($price, $product) {
    if (!is_admin() && is_product()) {
        if (isset($_GET['extra_feature'])) {
            $feature = sanitize_text_field($_GET['extra_feature']);
            if ($feature === 'premium') {
                $price += 1000; // добавляем 1000 рублей
            }
        }
    }
    return $price;
}

Так мы изменяем цену товара на странице по GET-параметру. Для полноценной работы нужно менять URL при выборе атрибута или использовать AJAX.

3. Обновление цены на странице товара с помощью JavaScript

Для UX можно динамически менять цену без перезагрузки страницы. Пример скрипта, который при смене select с атрибутом обновляет цену с помощью AJAX:

jQuery(document).ready(function($) {
    $('#extra_feature').on('change', function() {
        var feature = $(this).val();
        var productId = wc_product_params.product_id;
        $.ajax({
            url: wc_add_to_cart_params.ajax_url,
            type: 'POST',
            data: {
                action: 'get_dynamic_price',
                product_id: productId,
                extra_feature: feature
            },
            success: function(response) {
                if(response.price_html) {
                    $('.woocommerce-Price-amount').html(response.price_html);
                }
            }
        });
    });
});

4. Обработка AJAX-запроса для возврата новой цены

add_action('wp_ajax_get_dynamic_price', 'ajax_get_dynamic_price');
add_action('wp_ajax_nopriv_get_dynamic_price', 'ajax_get_dynamic_price');
function ajax_get_dynamic_price() {
    if (!isset($_POST['product_id'], $_POST['extra_feature'])) {
        wp_send_json_error();
    }
    $product_id = intval($_POST['product_id']);
    $feature = sanitize_text_field($_POST['extra_feature']);
    $product = wc_get_product($product_id);
    if (!$product) {
        wp_send_json_error();
    }
    $price = $product->get_price();
    if ($feature === 'premium') {
        $price += 1000;
    }
    $price_html = wc_price($price);
    wp_send_json_success(array('price_html' => $price_html));
}

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

  • Откройте страницу товара с атрибутом extra_feature (например, селект).
  • Выберите значение premium — цена должна увеличиться на 1000 рублей мгновенно без перезагрузки.
  • Проверьте, что при добавлении в корзину и оформлении заказа итоговая цена соответствует изменённой цене.

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

  • Цена не обновляется на странице при смене атрибута: Проверьте правильность селектора в JS, а также наличие AJAX-обработчика.
  • Изменённая цена не применяется в корзине и на оформлении заказа: Добавьте фильтр woocommerce_before_calculate_totals для пересчёта цены в корзине и при оформлении.
  • Проблемы с кешированием цен: Отключите кеширование страницы или используйте AJAX для загрузки актуальной цены.
  • Безопасность данных: Обязательно используйте sanitize_text_field и проверяйте входящие данные.

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

  • Для больших магазинов с множеством вариантов лучше использовать стандартные вариации WooCommerce — кастомные решения сложнее масштабировать.
  • Динамические цены лучше рассчитывать на сервере, клиентский JS только обновляет отображение.
  • Используйте nonce для AJAX-запросов для предотвращения CSRF-атак.
  • Минимизируйте количество AJAX-запросов — объединяйте логику и кешируйте результаты при возможности.

Чек-лист для внедрения динамического изменения цены по атрибутам в WooCommerce

  1. Создать необходимые атрибуты и добавить к товару.
  2. Добавить серверный фильтр для изменения цены woocommerce_product_get_price.
  3. Реализовать AJAX-обработчик для возврата актуальной цены.
  4. Подключить JS-скрипт для отправки AJAX-запроса при выборе атрибута.
  5. Обработать пересчёт цены в корзине через woocommerce_before_calculate_totals.
  6. Проверить корректность работы на фронтенде и в админке.
  7. Добавить защиту AJAX-запросов (nonce) и очистить кеш.
Как сделать автоматическое удаление спам комментариев в WordPress
28.12.2025
Как удалить старые или неиспользуемые мета данные в WordPress
05.12.2025
Использование WP-Cron для автоматического отправления email-отчетов в WordPress
09.05.2026
WooCommerce: как автоматически изменять стоимость товара при изменении атрибутов
28.05.2026
WooCommerce: как автоматически изменять стоимость товара при изменении атрибутов
16.07.2026