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

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

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

Проблемы, с которыми сталкиваются пользователи:

  • Цена не обновляется на странице товара при выборе атрибутов.
  • Нельзя задать дополнительную логику изменения цены без создания вариаций.
  • Сложно интегрировать пользовательские правила ценообразования.

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

1. Отслеживаем выбор атрибутов на фронтенде

Используем jQuery, чтобы слушать событие изменения атрибутов на странице товара и выполнять AJAX-запрос к серверу.

jQuery(function($){
  $('.variations_form').on('woocommerce_variation_select_change', function(){
    var attributes = {};
    $('.variations select').each(function(){
      var attribute_name = $(this).data('attribute_name') || $(this).attr('name');
      var value = $(this).val();
      if(value) {
        attributes[attribute_name] = value;
      }
    });

    $.ajax({
      url: wc_add_to_cart_params.ajax_url,
      method: 'POST',
      data: {
        action: 'custom_price_update',
        product_id: $('.variations_form').data('product_id'),
        attributes: attributes
      },
      success: function(response) {
        if(response && response.new_price_html){
          $('.single_variation .price').html(response.new_price_html);
        }
      }
    });
  });
});

2. Обработка запроса на сервере и пересчёт цены

Добавьте код в functions.php вашей темы или в кастомный плагин.

add_action('wp_ajax_custom_price_update', 'custom_price_update_callback');
add_action('wp_ajax_nopriv_custom_price_update', 'custom_price_update_callback');

function custom_price_update_callback() {
  if (empty($_POST['product_id']) || empty($_POST['attributes']) || !is_array($_POST['attributes'])) {
    wp_send_json_error('Invalid parameters');
  }

  $product_id = intval($_POST['product_id']);
  $attributes = $_POST['attributes'];

  $product = wc_get_product($product_id);
  if (!$product || !$product->is_type('variable')) {
    wp_send_json_error('Product not found or not variable');
  }

  // Пример логики изменения цены
  $base_price = $product->get_price();
  $extra = 0;

  // Допустим, если выбран атрибут color=red, добавляем 500 рублей
  if (isset($attributes['attribute_pa_color']) && $attributes['attribute_pa_color'] === 'red') {
    $extra += 500;
  }
  // Если размер большой - добавляем 300 рублей
  if (isset($attributes['attribute_pa_size']) && $attributes['attribute_pa_size'] === 'large') {
    $extra += 300;
  }

  $new_price = $base_price + $extra;

  // Формируем HTML для отображения цены с учётом валюты
  $price_html = wc_price($new_price);

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

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

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

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

  • Цена не меняется: убедитесь, что скрипт JS подключен и срабатывает, проверьте правильность селекторов и AJAX-адрес.
  • Ошибка в AJAX ответе: проверьте, что PHP-функция корректно получает и обрабатывает данные, используйте error_log для отладки.
  • Неправильный ключ атрибута: WooCommerce добавляет префикс attribute_pa_ к slug атрибута. Проверьте, что вы используете правильные имена в условии.
  • Конфликты с кэшированием: при использовании кэш-плагинов убедитесь, что AJAX-запросы не кэшируются.

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

  • Всегда проверяйте и фильтруйте входящие данные в AJAX-обработчиках.
  • Для повышения производительности кэшируйте результаты вычислений, если они сложные.
  • Не храните динамическую цену в базе, рассчитывайте на лету для актуальности.
  • Минимизируйте объем передаваемых данных в AJAX, отправляйте только необходимые параметры.

Сравнение подходов изменения цены вариативного товара

МетодОписаниеПлюсыМинусы
Создание вариаций с разными ценамиНаиболее стандартный способПолная поддержка WooCommerce, отображение в админкеМного вариаций сложно поддерживать, нагрузка на БД
Динамическое изменение цены через AJAX + PHPКак в статье, цена меняется на летуГибкость, меньше вариаций, кастомные правилаСложнее реализовать, нужно писать код, возможны баги
Плагины для динамического ценообразованияГотовые решения с настройкамиБыстрая настройка, поддержкаПлатные, ограниченная кастомизация
Как удалить кеш в WordPress: практические способы и примеры кода
28.12.2025
WooCommerce: как автоматически удалять заказы и товары со статусом «Отменен»
27.06.2026
Как отключить автоматическое обновление плагинов в WordPress
08.12.2025
WooCommerce: как добавить пользовательское поле в форму оплаты через хук
18.04.2026
Как удалить старые версии постов в WordPress для оптимизации базы данных
12.03.2026