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

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

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

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

Как проверить проблему:

  • Откройте товар в админке WooCommerce, перейдите к вариациям и проверьте, что для каждой вариации выставлена цена и статус наличия.
  • На фронтенде откройте страницу товара, выберите атрибуты и посмотрите, меняется ли цена и отображается ли статус наличия.
  • Включите режим отладки WooCommerce и посмотрите логи ошибок (wp-content/debug.log), если AJAX-запросы не обновляют цену.

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

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

1. Добавление пользовательского JavaScript для отслеживания изменения атрибутов

Добавьте в файл темы или плагина следующий код для перехвата выбора атрибутов:

jQuery(document).ready(function($) {
    $('form.variations_form').on('woocommerce_variation_select_change', function() {
        var form = $(this);
        var data = form.serialize();

        $.ajax({
            url: wc_add_to_cart_params.ajax_url,
            type: 'POST',
            data: {
                action: 'custom_update_price_availability',
                data: data,
                product_id: form.data('product_id')
            },
            success: function(response) {
                if(response.success) {
                    $('.woocommerce-variation-price').html(response.data.price_html);
                    $('.stock').html(response.data.availability_html);
                }
            }
        });
    });
});

2. Обработка AJAX-запроса на сервере

В functions.php добавьте следующий код для обработки запроса и возврата цены и наличия:

add_action('wp_ajax_custom_update_price_availability', 'custom_update_price_availability_callback');
add_action('wp_ajax_nopriv_custom_update_price_availability', 'custom_update_price_availability_callback');

function custom_update_price_availability_callback() {
    parse_str($_POST['data'], $data);
    $product_id = intval($_POST['product_id']);

    // Получаем вариацию по выбранным атрибутам
    $attributes = [];
    foreach($data as $key => $value) {
        if(strpos($key, 'attribute_') === 0) {
            $attributes[$key] = sanitize_text_field($value);
        }
    }

    $product = wc_get_product($product_id);
    if(!$product) {
        wp_send_json_error(['message' => 'Продукт не найден']);
    }

    // Поиск вариации
    $available_variations = $product->get_available_variations();
    $matched_variation = null;

    foreach ($available_variations as $variation) {
        $match = true;
        foreach ($attributes as $attr_name => $attr_value) {
            if(empty($variation['attributes'][$attr_name]) || $variation['attributes'][$attr_name] !== $attr_value) {
                $match = false;
                break;
            }
        }
        if($match) {
            $matched_variation = $variation;
            break;
        }
    }

    if(!$matched_variation) {
        wp_send_json_error(['message' => 'Вариация не найдена']);
    }

    // Формируем HTML для цены и наличия
    $variation_obj = wc_get_product($matched_variation['variation_id']);
    $price_html = $variation_obj->get_price_html();
    $availability_html = wc_get_stock_html($variation_obj);

    wp_send_json_success([
        'price_html' => $price_html,
        'availability_html' => $availability_html
    ]);
}

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

Чтобы убедиться, что все работает корректно:

  • Обновите страницу товара с вариациями.
  • Выберите разные комбинации атрибутов (цвет, размер и т.п.).
  • Проверьте, что цена и информация о наличии товара обновляются без перезагрузки страницы.
  • Используйте инструменты разработчика браузера (Console и Network) для отслеживания AJAX-запросов и ответов.

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

  • Не срабатывает AJAX-запрос: проверьте правильность URL и наличие wp_enqueue_script с локализацией wc_add_to_cart_params.
  • Вариация не находится: убедитесь, что имена атрибутов совпадают с теми, что в базе WooCommerce (с префиксом attribute_).
  • Цена не обновляется: проверьте, что вариация активна и имеет цену, вызов get_price_html() корректен.
  • Наличие не отображается: убедитесь, что функция wc_get_stock_html() возвращает корректный HTML и что вариация имеет статус наличия.

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

  • Кэшируйте результаты AJAX-запросов, если вариаций много и они редко меняются.
  • Используйте nonce для защиты AJAX-запросов от CSRF (добавьте wp_create_nonce и проверку в обработчике).
  • Минимизируйте количество запросов, объединяя атрибуты в один объект и отправляя только необходимые данные.
  • Отключайте ненужные скрипты WooCommerce на страницах, где нет вариаций, чтобы уменьшить нагрузку.

Сравнение подходов: стандартные вариации vs AJAX-обновление vs плагин

ПодходПлюсыМинусыКогда использовать
Стандартные вариации WooCommerceВстроено, поддержка WooCommerce, простотаПри большом количестве вариаций может тормозить, ограниченная логикаМалое и среднее число вариаций
AJAX-обновление цены и наличия (свой код)Гибкость, возможность сложной логики, кастомизацияТребует знания разработки, больше кода для поддержкиСложные сценарии, кастомные правила цены и наличия
Использование плагина (например, "WooCommerce Dynamic Pricing")Быстрое решение, поддержка, готовые функцииСтоимость, нагрузка, ограниченная кастомизацияБыстрый старт, стандартные задачи ценообразования
Автоматический импорт продуктов WooCommerce из CSV с примерами кода
04.02.2026
Как создать автоматические уведомления в WordPress с помощью хуков и AJAX
10.03.2026
Как автоматизировать проверку и удаление спам-комментариев в WordPress
25.01.2026
Как удалить или изменить авторские права в метаданных WordPress
08.02.2026
Как отключить AJAX в WooCommerce для ускорения страницы корзины
12.05.2026