Задача: автозаполнение номера телефона в WPForms на WooCommerce сайте
Если у вас интернет-магазин на WooCommerce и вы используете WPForms для сбора дополнительной информации или оформления заказов, часто возникает необходимость автоматически подставлять номер телефона текущего пользователя в форму. Это упрощает заполнение, снижает ошибки и повышает конверсию.
Диагностика проблемы
Типичная ситуация: пользователь авторизован, но поле «Телефон» в форме WPForms остается пустым. Это происходит, потому что WPForms не умеет по умолчанию подтягивать данные из профиля WooCommerce или WordPress, а номер телефона хранится в метаданных пользователя (user meta).
Чтобы понять, где хранится номер телефона, проверьте в базе данных WordPress в таблице wp_usermeta с помощью запроса:
SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = YOUR_USER_ID;В большинстве случаев WooCommerce сохраняет номер телефона в мета-поле billing_phone.
Пошаговое решение: автозаполнение поля телефона в WPForms
1. Добавляем в форму WPForms поле телефона с уникальным идентификатором
В админке WPForms создайте или откройте форму, добавьте поле «Телефон» и в настройках поля задайте CSS класс, например, auto-phone (необязательно, но удобно для селектора).
2. Используем фильтр wpforms_field_value_{$field_id} для подстановки значения
Ниже пример кода, который вставляется в functions.php вашей темы или в плагин для кастомных функций:
add_filter('wpforms_field_value_123', 'wpforms_prefill_phone_from_user', 10, 3);
function wpforms_prefill_phone_from_user($value, $field_id, $form_data) {
if (is_user_logged_in()) {
$user_id = get_current_user_id();
// Получаем номер телефона из WooCommerce
$phone = get_user_meta($user_id, 'billing_phone', true);
if ($phone) {
return $phone;
}
}
return $value;
}Важное: замените 123 на реальный ID поля телефона в вашей форме WPForms. Его можно узнать, открыв форму в редакторе WPForms и посмотрев ID поля.
3. Активируем автозаполнение в настройках формы
В редакторе WPForms откройте настройки поля телефона и включите опцию «Populate Dynamic Value» (Автозаполнение динамическим значением). В поле для ключа динамического значения укажите 123 (ID поля), чтобы фильтр сработал.
Как проверить, что автозаполнение работает
- Авторизуйтесь на сайте под пользователем с заполненным телефоном в WooCommerce профиле.
- Откройте страницу с формой WPForms.
- Убедитесь, что поле телефона заполнено автоматически без вашего ввода.
- Для гостей поле должно оставаться пустым.
Частые ошибки и их причины
- Неверный ID поля в фильтре. Не забудьте заменить
123на реальный ID поля телефона. - Отсутствие номера телефона в профиле пользователя. Если поле
billing_phoneне заполнено, автозаполнение не сработает. - Неактивирована опция «Populate Dynamic Value» в настройках поля. Без неё фильтр не применяется.
- Кэширование страницы. При кэшировании сайта браузером или плагином кеша может не обновляться поле. Проверьте кеш и по возможности исключите страницу с формой.
Практические советы по безопасности и производительности
- Используйте проверку
is_user_logged_in(), чтобы не раскрывать персональные данные гостям. - Не храните номер телефона в куках или сессиях — используйте только user meta.
- Если форма используется на страницах с большим трафиком, минимизируйте нагрузку, не делайте лишних запросов к базе — код выше оптимален.
Таблица сравнения способов автозаполнения номера телефона
| Способ | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр wpforms_field_value_{$field_id} | Подстановка значения из user meta через PHP | Точно, безопасно, работает с любым полем | Требует доступа к коду |
| Динамические поля WPForms (через UI) | Использование встроенных динамических тегов (ограничено) | Просто, без кода | Не всегда есть возможность подтянуть billing_phone |
| JavaScript автозаполнение | Заполнение поля на клиенте через JS | Без изменений в PHP | Менее безопасно, зависит от кэша и JS |
Пример альтернативного JS-решения для автозаполнения (если PHP не подходит)
add_action('wp_footer', function() {
if (is_user_logged_in()) {
$phone = get_user_meta(get_current_user_id(), 'billing_phone', true);
if ($phone) {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
var phoneField = document.querySelector('.auto-phone input');
if (phoneField && !phoneField.value) {
phoneField.value = '<?php echo esc_js($phone); ?>';
}
});
</script>
<?php
}
}
});