Задача: автоматическое добавление данных из WPForms в заказ WooCommerce
При использовании WPForms вместе с WooCommerce часто возникает необходимость передать дополнительные данные из пользовательской формы (например, опрос, комментарии, выбор опций) непосредственно в метаданные заказа WooCommerce. Это позволяет впоследствии использовать эти данные в админке, для автоматизации или интеграций.
Диагностика проблемы
Если вы создали форму WPForms и хотите, чтобы её данные появились в заказе WooCommerce, но данные не сохраняются, проверьте:
- Правильно ли настроена отправка формы и есть ли ID заказа (order ID) к моменту обработки данных.
- Используете ли вы правильные хуки для сохранения метаданных заказа.
- Есть ли конфликты с другими плагинами, которые могут изменять обработку заказов или форм.
- Форма не перезагружается ли после отправки, что может препятствовать сохранению данных.
Пошаговое решение: сохранение данных WPForms в метаданных заказа WooCommerce
Для примера возьмём форму WPForms с полем с ID 3 (например, поле комментария или выбор опции), которое надо сохранить в заказ.
- Добавьте пользовательский обработчик после отправки формы WPForms. Используйте хук
wpforms_process_complete, который запускается после успешной отправки. - Получите ID заказа WooCommerce. Обычно он доступен, если форма встроена на странице оформления заказа, или передавайте его через скрытое поле или сессии.
- Добавьте метаданные к заказу через WooCommerce API.
Пример кода в functions.php или в вашем кастомном плагине:
add_action('wpforms_process_complete', 'save_wpforms_data_to_wc_order', 10, 4);
function save_wpforms_data_to_wc_order($fields, $entry, $form_data, $entry_id) {
// ID нужной формы
$target_form_id = 123; // замените на ваш ID формы
if ($form_data['id'] != $target_form_id) {
return; // не наша форма
}
// Получаем ID заказа из поля формы, например, скрытого поля с ключом 'order_id'
$order_id = isset($fields[5]['value']) ? intval($fields[5]['value']) : 0; // замените 5 на ID вашего скрытого поля
if (!$order_id) {
return; // Нет ID заказа
}
$order = wc_get_order($order_id);
if (!$order) {
return; // Заказ не найден
}
// Получаем значение нужного поля, например, поле с ID 3
$custom_field_value = isset($fields[3]['value']) ? sanitize_text_field($fields[3]['value']) : '';
if ($custom_field_value) {
// Сохраняем в метаданные заказа
$order->update_meta_data('_custom_wpforms_field', $custom_field_value);
$order->save();
}
}Обратите внимание, что ID формы, полей и способ передачи ID заказа нужно настроить под ваш сценарий.
Проверка результата
- Создайте тестовый заказ через WooCommerce с заполнением формы WPForms.
- В админке WooCommerce откройте заказ, перейдите в «Дополнительные данные» или к метаданным через плагин типа «Advanced Custom Fields» или «WooCommerce Custom Fields».
- Убедитесь, что метаданные
_custom_wpforms_fieldсодержат значение из формы.
Варианты передачи ID заказа в форму WPForms
Чтобы связать форму и заказ, часто используют следующие методы:
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Скрытое поле с передачей order ID через URL | Добавить скрытое поле с параметром из URL, например ?order_id=123 | Просто реализовать | Не безопасно, можно подделать |
| Сессия PHP или куки | Сохранять ID заказа в сессии, читать при отправке формы | Скрыто для пользователя | Нужно правильно настроить сессии |
| Передача через JavaScript | Динамически подставлять ID заказа из JS-переменной | Гибко и динамично | Зависит от правильной загрузки JS |
Частые ошибки и их исправление
- Нет ID заказа в обработчике: Проверьте, что поле с ID заказа действительно передаётся в форму и читается в PHP.
- Метаданные не сохраняются: Убедитесь, что вызываете
$order->save()после обновления метаданных. - Данные формы пустые или некорректные: Используйте
sanitize_text_field()и проверяйте наличие данных. - Конфликты плагинов: Отключите другие плагины, которые могут влиять на обработку заказов, чтобы проверить конфликт.
Практические советы по безопасности и производительности
- Не доверяйте данным из формы без проверки — всегда фильтруйте и валидируйте данные перед сохранением.
- Для передачи ID заказа используйте nonce или другие методы защиты, чтобы избежать подделок.
- Если данных много, не сохраняйте всё в метаданных — используйте отдельные таблицы или внешние сервисы.
- Оптимизируйте код обработчиков, чтобы не замедлять оформление заказа.
Чек-лист для внедрения автоматического сохранения данных WPForms в WooCommerce
- Определить ID формы и нужные поля для передачи
- Реализовать передачу order ID в форму (скрытое поле, сессия, JS)
- Добавить обработчик на
wpforms_process_completeдля сохранения данных - Использовать функции WooCommerce API для обновления метаданных заказа
- Проверить работу на тестовом заказе
- Отладить и проверить на конфликтность с другими плагинами
- Обеспечить безопасность передачи данных