Диагностика проблемы: почему дополнительные поля из WPForms не появляются в заказах WooCommerce
При интеграции WPForms с WooCommerce часто возникает задача передать данные из дополнительных полей формы в заказ, чтобы хранить и отображать их в админке магазина и в уведомлениях. Чаще всего пользователи сталкиваются с ситуацией, когда дополнительные поля заполняются, но информация не попадает в заказ или не видна в админке.
Основные причины:
- Отсутствие правильного связывания данных формы и объекта заказа WooCommerce
- Недостаток кода для записи мета-данных заказа
- Неправильные ключи или формат данных, не соответствующий WooCommerce
- Конфликты с другими плагинами или темой
Пошаговое решение: автоматическая передача дополнительных полей из WPForms в заказ WooCommerce
1. Создайте форму WPForms с дополнительными полями
Добавьте необходимые обязательные поля и кастомные поля, например, текстовое поле "Номер паспорта" или "Дата доставки".
2. Получите ID формы и ID полей
Для передачи данных нужно знать ID формы и ID каждого поля. Их можно найти в редакторе WPForms — откройте форму и наведите курсор на поле, чтобы увидеть ID.
3. Добавьте обработчик для записи данных в заказ
В functions.php вашей темы (или в отдельном плагине) подключите следующий код. Он слушает событие создания заказа и переносит данные из отправленной формы WPForms в мета-данные заказа WooCommerce.
add_action('wpforms_process_complete', 'wpforms_to_woocommerce_order_meta', 10, 4);
function wpforms_to_woocommerce_order_meta($fields, $entry, $form_data, $entry_id) {
// ID вашей формы WPForms
$target_form_id = 123;
if ($form_data['id'] != $target_form_id) {
return;
}
// Получаем ID пользователя, если он авторизован
$user_id = get_current_user_id();
// Создаем заказ в WooCommerce
$order = wc_create_order();
// Добавляем товары или оставляем пустым — зависит от логики
// $order->add_product(wc_get_product(456), 1); // пример добавления товара
// Проходим по полям формы и сохраняем нужные
foreach ($fields as $field_id => $field) {
// Например, поле с ID 4 — "Номер паспорта"
if ($field_id == 4) {
$order->update_meta_data('_passport_number', sanitize_text_field($field['value']));
}
// Добавьте дополнительные поля по аналогии
if ($field_id == 5) {
$order->update_meta_data('_delivery_date', sanitize_text_field($field['value']));
}
}
// Привязываем заказ к пользователю, если есть
if ($user_id) {
$order->set_customer_id($user_id);
}
// Завершаем и сохраняем заказ
$order->calculate_totals();
$order->save();
}
4. Отобразите дополнительные поля в админке WooCommerce
Чтобы видеть данные в заказах, добавьте их в мета-блок админки:
add_action('woocommerce_admin_order_data_after_billing_address', 'display_custom_order_meta_in_admin', 10, 1);
function display_custom_order_meta_in_admin($order) {
$passport_number = $order->get_meta('_passport_number');
$delivery_date = $order->get_meta('_delivery_date');
if ($passport_number) {
echo '<p><strong>Номер паспорта:</strong> ' . esc_html($passport_number) . '</p>';
}
if ($delivery_date) {
echo '<p><strong>Дата доставки:</strong> ' . esc_html($delivery_date) . '</p>';
}
}
Проверка результата после внедрения
Для проверки:
- Отправьте тестовую форму WPForms с заполнением всех дополнительных полей.
- Перейдите в WooCommerce → Заказы и откройте последний созданный заказ.
- Проверьте наличие дополнительных полей в блоке с информацией о заказе (дополнительные мета-данные).
- Если поля не отображаются, проверьте логи ошибок, а также корректность ID формы и полей.
Частые ошибки и как их исправить
- Неправильный ID формы или полей: Убедитесь, что вы используете актуальные ID из WPForms. Обычно они меняются при редактировании.
- Заказ не создается автоматически: Функция
wc_create_order()создаст пустой заказ. Если логика требует добавления товаров, не забудьте$order->add_product(). Без товаров заказ может не отображаться в обычном списке. - Данные не сохраняются в мета: Проверьте, что функция
update_meta_dataвызывается корректно, и затем вызывается$order->save(). - Поля не отображаются в админке: Проверьте, что хук
woocommerce_admin_order_data_after_billing_addressподключен и выводит данные. Также проверьте права доступа пользователя. - Конфликты с другими плагинами: Отключите плагины, которые могут изменять обработку заказов, чтобы исключить конфликт.
Практические советы по безопасности и производительности
- Обязательно фильтруйте и проверяйте данные с помощью
sanitize_text_fieldи аналогичных функций, чтобы избежать XSS-уязвимостей. - Создавайте заказы только при полной и корректной отправке формы, иначе можно получить мусорные заказы.
- Не создавайте заказ при каждом вызове хуков — проверяйте условия и уникальность, чтобы избежать дублирования.
- Если форма заполняется часто, подумайте о кешировании данных и оптимизации запросов к базе.
Сравнение вариантов передачи дополнительных полей в WooCommerce
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Через wpforms_process_complete + wc_create_order | Полный контроль, можно создавать заказ с нуля | Нужно писать больше кода, риск дублирования заказов | Пример из статьи |
| Использовать хуки WooCommerce (например, woocommerce_checkout_update_order_meta) | Интеграция с оформлением заказа, меньше кода | Требуется передавать данные из формы в checkout, сложнее связать с WPForms | Подходит если WPForms только для сбора доп. инфо |
| Плагины интеграции WPForms и WooCommerce | Простота настройки, готовый функционал | Меньше гибкости, возможны конфликты и ограничения | WPForms WooCommerce Integration (платные) |