Как сохранить данные калькулятора в Cookie и использовать их в WooCommerce

Проблема: передача данных калькулятора в заказ 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;
}

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

  1. Откройте страницу с калькулятором, введите значение в поле и измените его (чтобы сработал change событие и записался Cookie).
  2. Перейдите на страницу оформления заказа WooCommerce.
  3. Оформите заказ и убедитесь, что в метаданных заказа отображается сохранённое значение.
  4. Проверьте в админке WooCommerce заказ — должна отображаться дополнительная информация.
  5. Проверьте письмо с подтверждением заказа — там также должно быть значение калькулятора.

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

  • 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
Как создать адаптивный калькулятор в WordPress с помощью Vue.js и AJAX
21.12.2025
Калькулятор расчёта времени работы в WordPress: создание и настройка
19.03.2026
Как создать динамический калькулятор с выбором услуг на WordPress
11.03.2026
Как создать динамический калькулятор с расчетом по формуле в WordPress
12.02.2026
WooCommerce: решение проблем с отправкой данных калькулятора в заказ
10.06.2026