Проблема: необходимость сбора дополнительных данных с корзины WooCommerce через WPForms
Многие разработчики сталкиваются с задачей расширения стандартной корзины WooCommerce дополнительными пользовательскими полями, которые нужно собрать через WPForms. При этом важно, чтобы заполненные пользователем данные автоматически передавались в заказ WooCommerce и сохранялись в метаданных заказа, чтобы их можно было использовать в админке и для дальнейшей обработки.
Диагностика проблемы
По умолчанию WooCommerce не имеет интеграции с WPForms для передачи пользовательских полей из формы в заказ. Если вы добавили поля в форму WPForms, но они не появляются в заказах, значит, не настроена логика передачи данных из WPForms в WooCommerce. Проверить это можно так:
- Отправьте тестовую форму WPForms с заполнением дополнительных полей;
- Создайте заказ в WooCommerce, если форма создана для оформления заказа;
- Перейдите в админку WooCommerce > Заказы и откройте созданный заказ;
- Проверьте раздел метаданных заказа (Custom fields) — если поля отсутствуют, значит данные не передаются.
Пошаговое решение: добавление полей и их передача в заказ WooCommerce
Шаг 1. Создание полей в форме WPForms
Добавьте необходимые поля в форму WPForms (например, текстовое поле "Номер квартиры" или "Комментарий к доставке"). Запомните идентификаторы полей (Field IDs или имена).
Шаг 2. Добавление хука для передачи данных из WPForms в заказ WooCommerce
Для передачи данных из WPForms в заказ WooCommerce используем хук woocommerce_checkout_update_order_meta. Его срабатывание зависит от оформления заказа через стандартный WooCommerce Checkout, но если у вас отдельная форма WPForms, то нужно вызвать обновление метаданных при успешной отправке формы.
Пример кода, который добавляет поля из WPForms в метаданные заказа:
add_action('wpforms_process_complete', 'wpforms_add_custom_fields_to_woocommerce_order', 10, 4); function wpforms_add_custom_fields_to_woocommerce_order($fields, $entry, $form_data, $entry_id) { if ($form_data['id'] != 123) { // замените 123 на ID вашей формы return; } // Получаем ID последнего созданного заказа WooCommerce $order_id = get_user_meta(get_current_user_id(), '_latest_order_id', true); if (!$order_id) { return; } // Пример: поле с ID 4 - номер квартиры if (!empty($fields[4]['value'])) { update_post_meta($order_id, '_apartment_number', sanitize_text_field($fields[4]['value'])); } // Пример: поле с ID 5 - комментарий к доставке if (!empty($fields[5]['value'])) { update_post_meta($order_id, '_delivery_comment', sanitize_text_field($fields[5]['value'])); }}Обратите внимание: чтобы получить текущий заказ, нужно хранить его ID заранее, например, при создании заказа сохранять в мета пользователя или реализовать передачу ID заказа в форму через скрытое поле.
Шаг 3. Автоматическое сохранение ID заказа для передачи в форму
Чтобы связать форму WPForms и заказ WooCommerce, добавьте код, который будет сохранять ID заказа пользователя в мета при создании заказа:
add_action('woocommerce_thankyou', 'save_latest_order_id_to_user_meta'); function save_latest_order_id_to_user_meta($order_id) { if (!$order_id) { return; } $user_id = get_current_user_id(); if ($user_id) { update_user_meta($user_id, '_latest_order_id', $order_id); }}Шаг 4. Передача ID заказа в форму WPForms через скрытое поле
Добавьте в форму WPForms скрытое поле с именем, например, order_id. Значение этого поля можно установить динамически с помощью фильтра:
add_filter('wpforms_fields_show_value', 'populate_order_id_hidden_field', 10, 3); function populate_order_id_hidden_field($value, $field_id, $form_data) { if ($form_data['id'] != 123) { return $value; } if ($field_id == 6) { // замените 6 на ID скрытого поля $order_id = get_user_meta(get_current_user_id(), '_latest_order_id', true); if ($order_id) { return $order_id; }}Проверка результата после внедрения
- Оформите заказ в WooCommerce, авторизовавшись на сайте;
- Перейдите на страницу с формой WPForms, которая должна заполнить дополнительные поля;
- Отправьте форму;
- В админке WooCommerce откройте заказ и убедитесь, что метаданные
_apartment_numberи_delivery_commentсодержат введённые значения; - Если данные отображаются, значит интеграция работает корректно.
Частые ошибки и как их исправить
- Неправильный ID формы или полей: Проверьте, что в коде совпадают ID формы и полей с реальными в WPForms.
- Отсутствие сохранения ID заказа: Убедитесь, что пользователь авторизован и ID заказа сохраняется в мета пользователя.
- Форма отправляется без авторизации: Для работы решения пользователь должен быть авторизован, иначе ID заказа не будет получен.
- Недостаточно прав для обновления метаданных заказа: Проверьте, что код выполняется с нужными правами и в нужный момент.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_field()или другие функции очистки данных перед сохранением в базу. - Не перегружайте форму лишними скрытыми полями без необходимости.
- Кэширование ID заказа в мета пользователя уменьшает количество запросов к базе.
- Для гостей реализуйте альтернативный способ передачи ID заказа, например, через сессию или URL-параметры, если нужно.
Итоговый чек-лист внедрения
- Добавить необходимые поля в WPForms;
- Добавить скрытое поле для передачи ID заказа в форму;
- Реализовать сохранение ID заказа в мета пользователя при оформлении заказа;
- Дописать фильтр для динамической подстановки ID заказа в форму;
- Добавить обработчик для сохранения данных формы в метаданные заказа;
- Проверить корректность ID и прав доступа;
- Тестировать отправку и проверять сохранение данных в заказах.