WPForms и WooCommerce: динамическое ценообразование на основе пользовательского ввода формы

Диагностика задачи: зачем нужно динамическое ценообразование через WPForms

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

Как передать данные из WPForms в WooCommerce и изменить цену товара

Шаг 1. Создаём форму с нужными полями в WPForms

Создайте форму, например, с числовым полем "Количество единиц" и чекбоксом "Нужна срочная доставка". Эти поля будут влиять на цену. Важно, чтобы у формы был уникальный ID, например, 123.

Шаг 2. Передача данных формы в сессию или куки

Для дальнейшей работы нужно сохранить данные формы после отправки, чтобы использовать их в WooCommerce. Используем хук wpforms_process_complete для сохранения данных в сессию:

add_action('wpforms_process_complete', 'save_wpforms_data_to_session', 10, 4);
function save_wpforms_data_to_session($fields, $entry, $form_data, $entry_id) {
    if ($form_data['id'] != 123) return; // ID вашей формы
    session_start();
    $_SESSION['custom_quantity'] = isset($fields[1]['value']) ? intval($fields[1]['value']) : 1; // ID поля с количеством
    $_SESSION['rush_delivery'] = isset($fields[2]['value']) && $fields[2]['value'] === '1' ? true : false; // ID поля с чекбоксом
}

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

Шаг 3. Изменение цены товара в WooCommerce перед добавлением в корзину

Используем хук woocommerce_before_calculate_totals, чтобы изменить цену товара в корзине на основе данных из сессии:

add_action('woocommerce_before_calculate_totals', 'adjust_price_based_on_wpforms_data', 20, 1);
function adjust_price_based_on_wpforms_data($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    session_start();
    if (empty($_SESSION['custom_quantity']) && empty($_SESSION['rush_delivery'])) return;

    foreach ($cart->get_cart() as $cart_item) {
        // Проверяем нужный товар по ID или другому параметру
        if ($cart_item['product_id'] == 1234) { // ID товара для изменения цены
            $base_price = $cart_item['data']->get_regular_price();
            $quantity = $_SESSION['custom_quantity'] ?? 1;
            $rush_fee = ($_SESSION['rush_delivery'] ?? false) ? 500 : 0;
            $new_price = ($base_price * $quantity) + $rush_fee;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Замените 1234 на ID вашего товара, а также адаптируйте логику расчёта цены под свои требования.

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

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

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

  • Сессия не стартует или не сохраняется: убедитесь, что session_start() вызывается до вывода контента. Для WordPress лучше запускать сессии через init хук.
  • Данные формы не передаются: проверьте ID формы и полей в коде, они должны совпадать с вашей формой.
  • Цена не меняется в корзине: убедитесь, что ID товара указан верно, и хук woocommerce_before_calculate_totals подключён правильно.
  • Кэширование мешает обновлению цены: отключите кэширование страниц для корзины и страницы оформления заказа.

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

  • Не храните чувствительные данные в сессии без шифрования.
  • Очищайте сессию после оформления заказа, чтобы не было конфликтов при новых заказах.
  • Минимизируйте логику в woocommerce_before_calculate_totals, чтобы не замедлять расчёт корзины.
  • Для масштабируемости рассмотрите использование пользовательских метаданных заказа вместо сессий.

Сравнение вариантов передачи данных из WPForms в WooCommerce

МетодПлюсыМинусыПрименение
Сессии PHPПросто реализовать, быстроПроблемы с кэшированием, масштабируемостьюНебольшие проекты, быстрые решения
КукиРаботают на клиенте, не зависят от сервераУязвимы, ограничение размераЛегкие данные, не конфиденциальные
Пользовательские метаданные заказаНадежно, масштабируемоСложнее реализовать, требует доработки логикиПроекты с большим трафиком и сложной логикой
WPForms: автоматическая обновление формы без перезагрузки страницы
10.03.2026
WPForms: автоматическая передача данных из формы в поля пользовательского профиля WordPress
26.06.2026
Как создать собственный шорткод для WPForms в WordPress
07.11.2025
Как добавить многоуровневую валидацию в WPForms для WordPress
16.02.2026
WPForms и WooCommerce: как автоматически передавать дополнительные поля из формы в заказ
25.07.2026