wpforms.ru wordpress WPForms.ru

Как динамически добавлять поля в форму через PHP

В этой статье мы подробно разберем, как динамически добавлять поля в формы WPForms с помощью PHP. Часто возникает задача добавлять поля в форму программно: например, на основе данных пользователя, контекста страницы или внешних условий. WPForms позволяет это сделать с помощью специальных хуков и фильтров.

Почему динамическое добавление полей важно для WPForms

Стандартный интерфейс WPForms позволяет создавать формы вручную, но иногда требуется автоматически изменять структуру формы на лету. Например, если на сайте разные пользователи видят разные поля, или нужно подставлять данные из профиля, или условия, зависящие от URL, даты или других параметров.

Динамическое добавление полей помогает сделать форму более гибкой и персонализированной, улучшая пользовательский опыт и увеличивая конверсию.

Рассмотрим, как это реализовать с помощью API и хуков WPForms.

Используем хук wpforms_frontend_output для изменения формы

WPForms не имеет официального фильтра для динамического добавления полей до рендера, но можно использовать хук wpforms_frontend_output, который изменяет HTML формы перед выводом на страницу.

Этот метод подойдет, если нужно добавить простые поля, но без обработки ввода по умолчанию.

Пример добавления HTML-поля после всех существующих полей:

add_filter('wpforms_frontend_output', 'wpformsru_add_custom_field_html', 10, 3);
function wpformsru_add_custom_field_html($form_html, $form_data, $form) {
    if ($form_data['id'] == 123) { // замените 123 на ID вашей формы
        $custom_field = '<p class="wpforms-field wpforms-field-text"><label for="custom_field">Дополнительное поле</label><input type="text" id="custom_field" name="custom_field" /></p>';
        $form_html = str_replace('</form>', $custom_field . '</form>', $form_html);
    }
    return $form_html;
}

Этот код добавит обычное текстовое поле в конец формы. Однако, чтобы получать данные этого поля после отправки, нужно дополнительно обрабатывать его вручную через действие wpforms_process_complete или wpforms_process.

Добавление поля через фильтр wpforms_fields_show

Для глубокой интеграции можно использовать фильтр wpforms_fields_show, который отвечает за поля формы перед рендером.

Пример динамического добавления поля в массив полей формы:

add_filter('wpforms_fields_show', 'wpformsru_dynamic_add_field', 10, 3);
function wpformsru_dynamic_add_field($fields, $form_data, $form) {
    if ($form_data['id'] == 123) {
        $fields['custom_field'] = array(
            'id'       => 'custom_field',
            'type'     => 'text',
            'label'    => 'Динамическое поле',
            'required' => true,
        );
    }
    return $fields;
}

Однако в зависимости от версии WPForms и типа вашей лицензии этот фильтр может работать или нет. Проверяйте совместимость.

Обработка динамически добавленных полей при отправке формы

Добавив поле, нужно получить его значение и обработать. Для этого используйте хук wpforms_process_complete или wpforms_process. Пример:

add_action('wpforms_process_complete', 'wpformsru_handle_custom_field', 10, 4);
function wpformsru_handle_custom_field($fields, $entry, $form_data, $entry_id) {
    if ($form_data['id'] == 123 && !empty($fields['custom_field'])) {
        $custom_value = sanitize_text_field($fields['custom_field']['value']);
        // например, сохранить в метаданные пользователя
        $user_id = get_current_user_id();
        if ($user_id) {
            update_user_meta($user_id, 'custom_wpforms_field', $custom_value);
        }
    }
}

Таким образом можно получить динамическое поле и использовать его для любых целей: сохранения, отправки письма, интеграции с CRM и т.д.

Примеры полезных сценариев динамического добавления полей

1. Поля, зависящие от роли пользователя

Если на сайте разные роли, вы можете показать дополнительные поля только для администраторов или подписчиков.

add_filter('wpforms_fields_show', 'wpformsru_add_field_by_role', 10, 3);
function wpformsru_add_field_by_role($fields, $form_data, $form) {
    if ($form_data['id'] == 123 && current_user_can('administrator')) {
        $fields['admin_note'] = array(
            'id'    => 'admin_note',
            'type'  => 'textarea',
            'label' => 'Комментарий для админа',
        );
    }
    return $fields;
}

2. Подстановка значения из URL-параметра

Динамически можно подставить в скрытое поле значение из GET-параметра, например utm-метку:

add_filter('wpforms_fields_show', 'wpformsru_add_utm_field', 10, 3);
function wpformsru_add_utm_field($fields, $form_data, $form) {
    if ($form_data['id'] == 123) {
        $utm = isset($_GET['utm_source']) ? sanitize_text_field($_GET['utm_source']) : '';
        $fields['utm_source'] = array(
            'id'    => 'utm_source',
            'type'  => 'hidden',
            'label' => '',
            'default_value' => $utm,
        );
    }
    return $fields;
}

3. Добавление поля с динамическим списком вариантов

Если нужно подгрузить варианты выбора из базы данных, можно формировать массив опций динамически:

add_filter('wpforms_fields_show', 'wpformsru_dynamic_select_options', 10, 3);
function wpformsru_dynamic_select_options($fields, $form_data, $form) {
    if ($form_data['id'] == 123) {
        global $wpdb;
        $results = $wpdb->get_results("SELECT name FROM wp_custom_table", ARRAY_A);
        $choices = array();
        foreach ($results as $row) {
            $choices[] = array('label' => $row['name'], 'value' => sanitize_title($row['name']));
        }
        $fields['dynamic_select'] = array(
            'id'       => 'dynamic_select',
            'type'     => 'select',
            'label'    => 'Выберите вариант',
            'choices'  => $choices,
            'required' => true,
        );
    }
    return $fields;
}

Советы и рекомендации

  • Для тестирования динамических полей создавайте отдельную тестовую форму, чтобы не ломать рабочие формы.
  • Используйте sanitize_text_field и другие функции очистки данных, чтобы избежать уязвимостей.
  • Если динамическое добавление не работает через фильтры, попробуйте использовать более простой способ с wpforms_frontend_output.
  • Всегда проверяйте ID формы, чтобы не влиять на другие формы.
  • Для сложных сценариев добавления полей лучше создавать кастомные дополнения к WPForms.

Динамическое добавление полей в WPForms — мощный инструмент, который позволяет создавать адаптивные и умные формы. Используйте представленные примеры как основу для своих решений.

×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙