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

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

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

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

1. Настройка вариативного товара с атрибутами

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

2. Добавление кастомного скрипта для отслеживания выбора атрибутов

В файле functions.php вашей темы или в кастомном плагине подключите скрипт:

add_action('wp_enqueue_scripts', function() {
    if (is_product()) {
        wp_enqueue_script('custom-attr-price', get_stylesheet_directory_uri() . '/js/custom-attr-price.js', ['jquery'], null, true);
        wp_localize_script('custom-attr-price', 'attrPriceData', [
            'basePrice' => floatval(get_post_meta(get_the_ID(), '_regular_price', true)),
            'ajaxUrl' => admin_url('admin-ajax.php')
        ]);
    }
});

3. JS для динамического обновления цены

Создайте файл custom-attr-price.js с таким кодом:

jQuery(function($) {
    function updatePrice() {
        var selectedAttrs = {};
        $('.variations select').each(function() {
            var attrName = $(this).attr('name');
            var val = $(this).val();
            if (val) selectedAttrs[attrName] = val;
        });
        $.post(attrPriceData.ajaxUrl, {
            action: 'calculate_custom_price',
            product_id: wpsc_product_id,
            attributes: selectedAttrs
        }, function(response) {
            if (response.success) {
                $('.woocommerce-Price-amount.amount').text(response.data.new_price_html);
            }
        });
    }

    $('.variations select').on('change', updatePrice);
});

4. Обработка AJAX запроса в PHP

Добавьте в functions.php такой код:

add_action('wp_ajax_calculate_custom_price', 'calculate_custom_price_callback');
add_action('wp_ajax_nopriv_calculate_custom_price', 'calculate_custom_price_callback');

function calculate_custom_price_callback() {
    if (!isset($_POST['product_id']) || !isset($_POST['attributes'])) {
        wp_send_json_error('Неверные параметры');
    }
    $product_id = intval($_POST['product_id']);
    $attributes = $_POST['attributes'];

    $product = wc_get_product($product_id);
    if (!$product) {
        wp_send_json_error('Товар не найден');
    }
    $base_price = floatval($product->get_regular_price());

    // Пример: увеличиваем цену на 10%, если выбран определенный атрибут
    $price_modifier = 0;
    foreach ($attributes as $key => $value) {
        if ($value === 'large') { // замените на нужное значение
            $price_modifier += 0.1 * $base_price;
        }
        if ($value === 'premium') {
            $price_modifier += 0.2 * $base_price;
        }
    }

    $new_price = $base_price + $price_modifier;
    $new_price_html = wc_price($new_price);

    wp_send_json_success(['new_price_html' => $new_price_html]);
}

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

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

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

  • Цена не обновляется: Проверьте подключение JS-файла и правильность селекторов в скрипте.
  • AJAX возвращает ошибку: Убедитесь, что PHP-функция корректно получает параметры и подключена к нужным хукам.
  • Цена обновляется, но не форматируется: Используйте функцию wc_price() для форматирования цены в PHP.
  • Проблемы с кешированием: Отключите кеширование страниц на тестовом сайте, чтобы AJAX обновления не блокировались.

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

  • Обязательно проверяйте и фильтруйте входящие данные в AJAX-обработчиках, чтобы избежать XSS и других уязвимостей.
  • Старайтесь минимизировать количество AJAX вызовов — можно добавить debounce для обработки изменений в JS.
  • Если в магазине много вариаций, рассмотрите хранение готовых цен в метаданных вариаций для быстрого получения без вычислений в реальном времени.
  • При необходимости используйте nonce для защиты AJAX запросов.
Оптимизация базы данных WordPress: практические советы и примеры
12.11.2025
WooCommerce: автоматическое удаление товара после отмены заказа
01.06.2026
Как избежать проблем с производительностью при очистке кеша WooCommerce
25.04.2026
Как создать динамические роли пользователей в WordPress с примерами кода
12.12.2025
Как правильно кэшировать данные в WordPress для ускорения сайта
31.12.2025