В чем суть задачи и когда это нужно
Часто в проектах на WordPress требуется, чтобы данные, введённые пользователем в форму WPForms, автоматически сохранялись в его профиль — например, дополнительный телефон, адрес или дата рождения. Это актуально для сайтов с регистрацией, членством или личными кабинетами, где нужно расширить стандартный профиль WordPress пользовательскими метаданными.
По умолчанию WPForms не сохраняет данные в мета-поля пользователя, только отправляет письма или сохраняет в записи формы. Поэтому приходится реализовывать кастомную обработку отправленных данных.
Диагностика: как понять, что данные не передаются в профиль
- Проверка базы данных: в таблице
wp_usermetaотсутствуют новые записи по ключам кастомных полей. - В профиле пользователя в админке WordPress новые поля остаются пустыми.
- Нет ошибок валидации формы, форма успешно отправляется, но данные не сохраняются.
- В логах WPForms и сервера нет указаний на запись метаданных.
Пошаговое решение задачи: сохранение данных WPForms в пользовательские метаполя
1. Определите ID формы и имена полей
В админке WPForms выясните ID нужной формы и имена (name/field_id) полей, которые хотите сохранить в профиль.
2. Используйте хук wpforms_process_complete для обработки отправки
Этот хук вызывается после успешной отправки формы. В функции обработчика можно получить данные и пользователя, затем обновить метаполя.
3. Пример кода для functions.php темы или плагина
add_action('wpforms_process_complete', 'save_wpforms_data_to_user_meta', 10, 4);
function save_wpforms_data_to_user_meta($fields, $entry, $form_data, $entry_id) {
// Замените 123 на ID вашей формы
if ($form_data['id'] != 123) {
return;
}
// Проверяем, что пользователь авторизован
$user_id = get_current_user_id();
if (!$user_id) {
return; // Неавторизованные не сохраняем
}
// Пример: поле с ID 1 - телефон, ID 2 - дата рождения
$phone = isset($fields[1]) ? sanitize_text_field($fields[1]['value']) : '';
$birth_date = isset($fields[2]) ? sanitize_text_field($fields[2]['value']) : '';
if ($phone) {
update_user_meta($user_id, 'phone_number', $phone);
}
if ($birth_date) {
update_user_meta($user_id, 'birth_date', $birth_date);
}
}Проверка результата после внедрения
- Авторизуйтесь под пользователем, отправьте форму с заполнением нужных полей.
- В админке WordPress перейдите в профиль пользователя (Пользователи > Все пользователи > нужный пользователь).
- Убедитесь, что кастомные поля (phone_number, birth_date) заполнены новыми значениями.
- Проверьте таблицу
wp_usermetaв базе данных, запросом:SELECT * FROM wp_usermeta WHERE user_id = {user_id} AND meta_key IN ('phone_number','birth_date'); - Отсутствие ошибок в логах сервера и WPForms.
Частые ошибки и как их исправить
- Данные не сохраняются: убедитесь, что ID формы и ID полей совпадают с реальными из WPForms.
- Функция не вызывается: проверьте правильность подключения хука и что код загружается (в functions.php темы или плагина).
- Данные сохраняются, но не отображаются: добавьте вывод метаданных в шаблонах профиля или используйте плагины для отображения пользовательских полей.
- Пользователь не авторизован: если нужно сохранять данные для гостей, потребуется другая логика, например, создание пользователя на лету.
Практические советы по безопасности и производительности
- Всегда фильтруйте и санитизируйте входящие данные через
sanitize_text_field,sanitize_emailи другие функции. - Проверяйте, что пользователь авторизован, чтобы не сохранять данные анонимных.
- Для больших форм и большого количества данных используйте отложенную обработку через очередь (wp-cron или внешние сервисы).
- Ограничьте сохранение только изменённых данных, чтобы не перегружать базу.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Хук wpforms_process_complete | Прямой, простой, быстрое внедрение | Обрабатывает только после успешной отправки, требует авторизации | Сохранение пользовательских метаданных |
| Webhook + внешний скрипт | Интеграция с внешней CRM, расширяемость | Сложнее настроить, задержка обработки | Отправка данных в CRM, аналитику |
| Кастомный плагин с AJAX | Гибкость, интерактивность | Больше кода, сложность поддержки | Динамическое сохранение и валидация |