В работе с WPForms часто возникает необходимость создавать формы, в которых поля меняются в зависимости от внешних условий — например, данных пользователя, параметров страницы, или даже ответов из API. В этой статье разберём, как реализовать динамическое изменение полей формы WPForms с помощью собственной логики и хуков, не ограничиваясь стандартными встроенными функциями.
Почему стандартных возможностей WPForms недостаточно для сложной динамики
WPForms отлично справляется с созданием условной логики на основе ответов пользователя, но что если нужно менять поля в зависимости от внешних факторов? Например:
- Подгрузить список городов в зависимости от выбранной страны, получая данные из внешнего API.
- Показать или скрыть поля в зависимости от роли пользователя WordPress.
- Изменить плейсхолдеры или значения по умолчанию, ориентируясь на параметры URL или куки.
Для таких задач понадобится подключать свои функции, которые будут динамически изменять структуру или параметры полей формы до её рендеринга.
Используем хук wpforms_fields_show для изменения полей перед выводом
WPForms предоставляет фильтр wpforms_fields_show, который позволяет модифицировать массив полей формы перед их отображением. Рассмотрим пример, когда мы хотим динамически заменить список городов в поле выбора, получая данные из внешнего API.
function wpformsdinamicheskie_update_cities_list($fields, $form_data, $form_id) {
// Проверяем ID формы, чтобы не влиять на все формы сразу
if ($form_id !== 123) {
return $fields;
}
// Находим поле с выбором города по ID поля (например 4)
if (isset($fields[4])) {
// Получаем страну из параметров URL
$country = isset($_GET['country']) ? sanitize_text_field($_GET['country']) : '';
// Получаем список городов из внешнего API
$cities = wpformsdinamicheskie_get_cities_by_country($country);
// Формируем опции для поля
$choices = [];
foreach ($cities as $city) {
$choices[] = [
'label' => $city,
'value' => $city,
];
}
// Обновляем поле
$fields[4]['choices'] = $choices;
}
return $fields;
}
add_filter('wpforms_fields_show', 'wpformsdinamicheskie_update_cities_list', 10, 3);
// Пример функции получения городов
function wpformsdinamicheskie_get_cities_by_country($country) {
if (!$country) {
return [];
}
// Здесь может быть реальный запрос к API, но для примера — статический список
$data = [
'russia' => ['Москва', 'Санкт-Петербург', 'Новосибирск'],
'usa' => ['New York', 'Los Angeles', 'Chicago'],
];
return isset($data[strtolower($country)]) ? $data[strtolower($country)] : [];
}В этом примере мы динамически меняем список городов в зависимости от параметра country в URL. Такой подход позволяет легко интегрировать формы с внешними сервисами и расширять их функционал.
Динамическое отображение полей в зависимости от роли пользователя
Ещё одна частая задача — показывать или скрывать поля в зависимости от того, кто заполняет форму. Можно использовать хук wpforms_fields_show для удаления или добавления полей перед выводом.
function wpformsdinamicheskie_fields_by_user_role($fields, $form_data, $form_id) {
if ($form_id !== 123) {
return $fields;
}
if (!is_user_logged_in()) {
// Удаляем поле с ID 5 для гостей
unset($fields[5]);
} else {
$user = wp_get_current_user();
if (in_array('subscriber', (array) $user->roles)) {
// Для подписчиков меняем плейсхолдер поля с ID 6
if (isset($fields[6])) {
$fields[6]['placeholder'] = 'Введите ваш дополнительный код подписчика';
}
}
}
return $fields;
}
add_filter('wpforms_fields_show', 'wpformsdinamicheskie_fields_by_user_role', 10, 3);Такой подход помогает создавать адаптивные формы, которые учитывают статус пользователя без необходимости создавать несколько версий одной и той же формы.
Изменение значений по умолчанию и плейсхолдеров из URL или куки
Иногда нужно подставлять в поля формы значения, полученные из параметров запроса или куки — например, для предварительного заполнения email или других данных. Это можно сделать также через фильтр wpforms_fields_show:
function wpformsdinamicheskie_prefill_fields($fields, $form_data, $form_id) {
if ($form_id !== 123) {
return $fields;
}
// Предварительно заполняем поле email из параметра URL
if (isset($_GET['email']) && isset($fields[2])) {
$fields[2]['value'] = sanitize_email($_GET['email']);
}
// Используем куки для имени
if (isset($_COOKIE['wpform_user_name']) && isset($fields[1])) {
$fields[1]['value'] = sanitize_text_field($_COOKIE['wpform_user_name']);
}
return $fields;
}
add_filter('wpforms_fields_show', 'wpformsdinamicheskie_prefill_fields', 10, 3);Такое решение повышает удобство для пользователей и увеличивает конверсию форм.
Как отлаживать динамические изменения полей
Для отладки полезно выводить в лог или на экран текущий массив полей. Можно использовать error_log(print_r($fields, true)) или временно добавить var_dump($fields), чтобы понять, как меняются поля.
Также стоит проверять, что ID полей совпадают с теми, что в вашей форме, и не забывать обрабатывать возможные ошибки или пустые значения.
Заключение
Использование фильтра wpforms_fields_show открывает большие возможности для создания кастомных и динамических форм в WPForms. Вы можете подгружать данные из внешних источников, менять поля в зависимости от пользователя или контекста, а также наполнять формы значениями из параметров запроса или куки.
Если вы хотите расширить функционал WPForms, рекомендую также посмотреть плагины с расширениями и интеграциями, например, расширения WPForms на WPSHOP, которые помогут автоматизировать многие процессы.