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

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

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

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

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

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

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

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

Шаг 1. Добавляем JavaScript для обработки выбора вариаций

jQuery(document).ready(function($) {
    $('.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_get_variation_price',
                variation_data: data
            },
            success: function(response) {
                if (response.success) {
                    $('.woocommerce-variation-price').html(response.data.price_html);
                }
            }
        });
    });
});

Этот скрипт отслеживает изменение атрибутов вариаций и отправляет AJAX-запрос с выбранными данными.

Шаг 2. Создаем PHP-обработчик AJAX-запроса

add_action('wp_ajax_custom_get_variation_price', 'custom_get_variation_price_callback');
add_action('wp_ajax_nopriv_custom_get_variation_price', 'custom_get_variation_price_callback');

function custom_get_variation_price_callback() {
    if (empty($_POST['variation_data'])) {
        wp_send_json_error();
    }

    parse_str($_POST['variation_data'], $data);

    if (empty($data['attribute_pa_size']) || empty($data['product_id'])) {
        wp_send_json_error();
    }

    $product = wc_get_product($data['product_id']);
    if (!$product || !$product->is_type('variable')) {
        wp_send_json_error();
    }

    // Поиск вариации по атрибутам
    $available_variations = $product->get_available_variations();
    $price_html = '';

    foreach ($available_variations as $variation) {
        $match = true;
        foreach ($variation['attributes'] as $attr_name => $attr_value) {
            if (isset($data[$attr_name]) && $data[$attr_name] !== $attr_value) {
                $match = false;
                break;
            }
        }
        if ($match) {
            // Тут можно добавить кастомную логику изменения цены
            $variation_obj = wc_get_product($variation['variation_id']);
            $price_html = $variation_obj->get_price_html();
            break;
        }
    }

    if (!$price_html) {
        $price_html = $product->get_price_html();
    }

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

Данный код ищет вариацию по выбранным атрибутам и возвращает HTML цены. При необходимости здесь можно добавить дополнительную логику для изменения цены.

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

  • Перейдите на страницу вариативного товара.
  • Выберите разные варианты атрибутов.
  • Убедитесь, что цена меняется без перезагрузки страницы.
  • Добавьте товар в корзину и проверьте, что цена в корзине совпадает с отображаемой.

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

  • Ошибка: AJAX-запрос не срабатывает.
    Проверьте правильность подключения wc_add_to_cart_params.ajax_url и подключение jQuery. Убедитесь, что скрипт загружается только на страницах товаров.
  • Ошибка: не возвращается цена вариации.
    Проверьте, что передаются все необходимые атрибуты и product_id. Используйте var_dump в PHP для отладки.
  • Ошибка: цена не обновляется визуально.
    Проверьте селектор .woocommerce-variation-price, он может отличаться в вашей теме. Можно использовать инструменты разработчика браузера для поиска блока с ценой.

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

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

Сравнение вариантов реализации динамической цены

МетодПлюсыМинусы
Стандартные вариации WooCommerceПростая реализация, поддерживается ядромЦена статична, нет кастомной логики
AJAX + кастомный PHP обработчик (как в статье)Гибкость, динамическое обновление цены без перезагрузкиСложнее реализовать, требует поддержки кода
Плагины для динамического ценообразованияБыстрая настройка, готовые функцииМожет быть дорого и нагружать сайт
Как создать автоматический отзыв с подтверждением в WordPress
19.03.2026
Как создать собственный метабокс в WordPress
05.11.2025
WooCommerce: как программно удалять товар из корзины по условию
24.05.2026
Добавление дополнительного поля в форму регистрации WordPress
22.03.2026
WooCommerce: отмена платежа и возврат денег через API и хуки
01.06.2026