Проблема: передача данных калькулятора в заказ WooCommerce без формальной отправки
При создании калькулятора на сайте WordPress часто возникает задача сохранить введённые пользователем данные и использовать их в заказах WooCommerce, например, для автоматического добавления стоимости или параметров услуги. Однако не всегда удобно использовать форму для оформления заказа, особенно если калькулятор размещён отдельно или реализован кастомно. В таком случае можно сохранить данные во Cookie и потом считать их на этапе оформления заказа.
Диагностика проблемы
Если после заполнения калькулятора данные не передаются в заказ WooCommerce, причина может быть:
- Данные не сохраняются между страницами (например, при переходе на страницу корзины или оформления заказа);
- Данные не считываются из
Cookieили сессии; - Нет корректного механизма добавления метаданных в заказ;
- Кэширование страниц мешает обновлению данных
Cookieили их чтению.
Пошаговое решение: сохраняем данные калькулятора в Cookie и используем их в WooCommerce
1. Сохраняем данные калькулятора в Cookie с помощью JavaScript
Допустим, у вас есть калькулятор с полем input для стоимости:
<input type="number" id="calc_price" name="calc_price" />Добавим скрипт, который будет сохранять значение в Cookie при изменении поля:
document.getElementById('calc_price').addEventListener('change', function() {
document.cookie = 'calc_price=' + this.value + '; path=/; max-age=' + 60*60*24;
});Объяснение:
path=/— чтобы куки были доступны на всех страницах;max-age=86400— срок действия куки 1 день.
2. Читаем данные из Cookie в PHP и добавляем в заказ WooCommerce
Используем хук woocommerce_checkout_create_order для добавления данных из Cookie в метаданные заказа:
add_action('woocommerce_checkout_create_order', 'add_calc_data_to_order', 20, 2);
function add_calc_data_to_order($order, $data) {
if (isset($_COOKIE['calc_price'])) {
$calc_price = floatval($_COOKIE['calc_price']);
if ($calc_price > 0) {
$order->update_meta_data('calc_price', $calc_price);
}
}
}3. Отображаем данные на странице заказа в админке и в письмах
Для вывода значения в админке и email используем хук woocommerce_admin_order_data_after_billing_address и фильтр woocommerce_email_order_meta_fields:
add_action('woocommerce_admin_order_data_after_billing_address', 'show_calc_price_in_admin_order', 10, 1);
function show_calc_price_in_admin_order($order){
$calc_price = $order->get_meta('calc_price');
if ($calc_price) {
echo '<p><strong>Стоимость из калькулятора:</strong> ' . wc_price($calc_price) . '</p>';
}
}
add_filter('woocommerce_email_order_meta_fields', 'add_calc_price_to_email_meta', 10, 3);
function add_calc_price_to_email_meta($fields, $sent_to_admin, $order) {
$calc_price = $order->get_meta('calc_price');
if ($calc_price) {
$fields['calc_price'] = array(
'label' => __('Стоимость из калькулятора'),
'value' => wc_price($calc_price),
);
}
return $fields;
}Проверка результата после внедрения
- Откройте страницу с калькулятором, введите значение в поле и измените его (чтобы сработал
changeсобытие и записался Cookie). - Перейдите на страницу оформления заказа WooCommerce.
- Оформите заказ и убедитесь, что в метаданных заказа отображается сохранённое значение.
- Проверьте в админке WooCommerce заказ — должна отображаться дополнительная информация.
- Проверьте письмо с подтверждением заказа — там также должно быть значение калькулятора.
Частые ошибки и как исправить
- Cookie не устанавливаются или не сохраняются: проверьте путь
path=/и настройки браузера, убедитесь, что нет конфликтов с кэшированием. - Данные не появляются в заказе: убедитесь, что PHP-код подключён в functions.php вашей темы или плагине, и что хук
woocommerce_checkout_create_orderсрабатывает. - Некорректное значение (например, строка или 0): используйте
floatval()и проверяйте, что значение больше нуля перед записью. - Кэширование страниц мешает обновлению куки: отключите кэширование на страницах с калькулятором и оформлением заказа либо настройте исключения для cookie.
Практические советы по безопасности и производительности
- Не храните в Cookie чувствительные данные — только необходимые для расчёта числа или параметры.
- Для повышения безопасности проверяйте и фильтруйте данные, получаемые из
$_COOKIE. - Для ускорения работы используйте минимальный объём данных в Cookie.
- Если хотите хранить более сложные данные — рассмотрите использование сессий
PHPилиlocalStorageс передачей на сервер через AJAX.
Сравнение вариантов передачи данных калькулятора в заказ WooCommerce
| Способ | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Передача через форму на странице оформления заказа | Простая реализация, моментальное получение данных | Требует интеграции с формой, пользователь должен пройти страницу оформления | input в форме checkout |
| Сохранение в Cookie + чтение на сервере | Не требует изменения формы оформления, данные доступны на любой странице | Зависимость от браузера и кэширования, ограничение на объём данных | JS записывает cookie, PHP читает и сохраняет в заказ |
| Использование сессий PHP | Безопаснее и гибче, можно хранить сложные структуры | Не всегда стабильно на хостингах с кэшированием, требует старт сессии | session_start() + $_SESSION |