WooCommerce: автоматическое изменение стоимости вариативных товаров в зависимости от выбранных опций

Диагностика задачи: когда нужно менять цену вариативных товаров динамически

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

Типичная проблема: стандартные вариации не покрывают все сценарии ценообразования, а плагины с кастомными полями либо слишком громоздки, либо не дают гибкости. Решение — сделать автоматическое изменение стоимости на основе выбранных опций с помощью кастомного кода.

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

Шаг 1. Добавление дополнительных опций в форму товара

Для примера добавим чекбоксы дополнительных услуг на странице вариативного товара. Используем хук woocommerce_before_add_to_cart_button:

add_action('woocommerce_before_add_to_cart_button', function() {
    echo '<label><input type="checkbox" name="extra_service" value="yes"> Услуга за 500 руб.</label>';
});

Шаг 2. Передача данных опций в корзину и заказ

Чтобы данные с чекбокса попали в корзину, ловим событие добавления товара и сохраняем опцию:

add_filter('woocommerce_add_cart_item_data', function($cart_item_data, $product_id, $variation_id) {
    if (!empty($_POST['extra_service']) && $_POST['extra_service'] === 'yes') {
        $cart_item_data['extra_service'] = true;
        // Генерируем уникальный ключ, чтобы товары с различными опциями не сливались
        $cart_item_data['unique_key'] = md5(microtime().rand());
    }
    return $cart_item_data;
}, 10, 3);

Шаг 3. Изменение цены в корзине в зависимости от опций

Для корректного отображения цены добавим 500 руб. к стоимости вариации, если выбрана услуга:

add_action('woocommerce_before_calculate_totals', function($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item) {
        if (!empty($cart_item['extra_service'])) {
            $extra_price = 500; // фиксированная сумма за услугу
            $original_price = $cart_item['data']->get_price();
            $cart_item['data']->set_price($original_price + $extra_price);
        }
    }
});

Шаг 4. Отображение выбранных опций в корзине и заказе

Добавим отображение выбранной опции в списке товаров:

add_filter('woocommerce_get_item_data', function($item_data, $cart_item) {
    if (!empty($cart_item['extra_service'])) {
        $item_data[] = array(
            'key' => 'Дополнительная услуга',
            'value' => 'Да',
            'display' => '',
        );
    }
    return $item_data;
}, 10, 2);

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

  • Зайдите на страницу вариативного товара и выберите любую вариацию.
  • Отметьте дополнительную услугу чекбоксом и добавьте товар в корзину.
  • Перейдите в корзину — цена товара должна увеличиться на 500 рублей.
  • Убедитесь, что в списке товаров в корзине и в заказе отображается информация о дополнительной услуге.
  • Проверьте, что товары с и без услуги считаются отдельно (не сливаются).

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

  • Цена не меняется в корзине
    Проверьте, что хук woocommerce_before_calculate_totals не конфликтует с другими плагинами, и что цена изменяется именно в объекте продукта $cart_item['data']->set_price().
  • Опции не передаются в корзину
    Убедитесь, что поле формы отправляется с корректным name, и что фильтр woocommerce_add_cart_item_data обрабатывает данные из $_POST.
  • Товары с разными опциями сливаются в корзине
    Добавьте уникальный ключ в данные корзины, например, с помощью md5(microtime().rand()), чтобы WooCommerce рассматривал их как разные позиции.

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

  • Не используйте AJAX без необходимости — изменение цены происходит серверно и корректно обновляется при добавлении в корзину.
  • Для большого количества опций рассмотрите кеширование вычислений цены, чтобы не нагружать сервер.
  • Валидация данных из $_POST обязательна, чтобы избежать XSS и инъекций.
  • Если используете сторонние плагины для кастомных полей, убедитесь, что их данные синхронизируются с ценой через аналогичные хуки.

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

МетодПреимуществаНедостаткиПрименимость
Кастомный код (описанный выше)Гибкость, контроль, нет зависимости от плагиновТребует знаний PHP, поддержка своими силамиМалое и среднее число опций
Плагины кастомных полей и ценообразования (например, WooCommerce Extra Product Options)Простота настройки, UI для менеджераПлатные, могут замедлять сайт, частые обновленияБольшое количество сложных опций
Использование вариаций с фиксированными ценамиСтандартный функционал WooCommerceОграничена гибкость, много вариаций создается вручнуюПростые сценарии с фиксированными наборами
WooCommerce: автоматическое отключение промо-кодов после успешного использования
22.06.2026
Автоматическое удаление неиспользуемых плагинов в WordPress
04.03.2026
WooCommerce: автоматическое изменение стоимости товаров при изменении количества в корзине
21.05.2026
WooCommerce: автоматическое изменение наличия товаров при изменении заказа
29.06.2026
Автоматическое отключение неактивных пользователей WordPress
02.01.2026