Диагностика задачи: зачем нужно динамическое ценообразование через 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 | Просто реализовать, быстро | Проблемы с кэшированием, масштабируемостью | Небольшие проекты, быстрые решения |
| Куки | Работают на клиенте, не зависят от сервера | Уязвимы, ограничение размера | Легкие данные, не конфиденциальные |
| Пользовательские метаданные заказа | Надежно, масштабируемо | Сложнее реализовать, требует доработки логики | Проекты с большим трафиком и сложной логикой |