Создание динамических форм в WordPress без плагинов

Динамические формы — важный инструмент для взаимодействия с пользователями на сайте. В WordPress часто для этого используют плагины, но иногда нужно создать форму с уникальной логикой, которая не поддерживается плагинами, или минимизировать нагрузку на сайт. В этой статье разберём, как самостоятельно создать динамическую форму в WordPress без плагинов, с возможностью добавления и удаления полей, валидацией и обработкой данных.

Что такое динамическая форма и зачем она нужна в WordPress

Динамическая форма — это форма, которая может изменять своё количество полей в зависимости от действий пользователя. Например, можно добавлять несколько адресов, телефонов, или задавать параметры заказа. Такие формы удобны, когда количество вводимых данных заранее неизвестно, или требуется гибкая логика.

В WordPress часто используют Contact Form 7 или Gravity Forms, но они имеют ограничения или избыточны для простых задач. Создание формы вручную даёт полный контроль над процессом, улучшает производительность и безопасность.

Создание базовой формы с динамическими полями

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

HTML и JavaScript для динамических полей

Добавим форму в файл темы, например, в page-contact.php или через шорткод. Пример формы:

<form method="post" id="wpboot_dynamic_form">
    <label>Имя:</label>
    <input type="text" name="wpboot_name" required />

    <div id="phone_fields">
        <label>Телефон 1:</label>
        <input type="text" name="wpboot_phone[]" required />
    </div>
    <button type="button" id="add_phone">Добавить телефон</button>

    <input type="submit" name="wpboot_submit" value="Отправить" />
</form>

<script>
document.getElementById('add_phone').addEventListener('click', function() {
    var container = document.getElementById('phone_fields');
    var count = container.querySelectorAll('input[name="wpboot_phone[]"]').length + 1;

    var label = document.createElement('label');
    label.textContent = 'Телефон ' + count + ':';

    var input = document.createElement('input');
    input.type = 'text';
    input.name = 'wpboot_phone[]';
    input.required = true;

    container.appendChild(label);
    container.appendChild(input);
});
</script>

Здесь кнопка «Добавить телефон» добавляет новое поле ввода телефона с увеличением номера. Обратите внимание, что поля телефонов имеют одинаковое имя с массивом wpboot_phone[], что позволяет передать несколько значений на сервер.

Обработка и валидация данных в WordPress

После отправки формы нужно проверить данные и сохранить или отправить их. В WordPress для обработки данных формы безопаснее использовать хуки или обработчики в functions.php.

Пример функции для обработки формы

function wpboot_handle_dynamic_form() {
    if (isset($_POST['wpboot_submit'])) {
        // Проверка nonce для безопасности (если добавите)

        $name = sanitize_text_field($_POST['wpboot_name']);
        $phones_raw = $_POST['wpboot_phone'] ?? [];

        $phones = [];
        foreach ($phones_raw as $phone) {
            $phone_sanitized = sanitize_text_field($phone);
            if (!empty($phone_sanitized)) {
                $phones[] = $phone_sanitized;
            }
        }

        if (empty($name)) {
            echo '<div class="error">Пожалуйста, введите имя.</div>';
            return;
        }

        if (empty($phones)) {
            echo '<div class="error">Введите хотя бы один телефон.</div>';
            return;
        }

        // Сохранение данных, отправка письма или другое действие
        // Например, отправим письмо администратору

        $to = get_option('admin_email');
        $subject = 'Новая заявка с сайта';
        $message = 'Имя: ' . $name . "\n" . 'Телефоны: ' . implode(", ", $phones);

        wp_mail($to, $subject, $message);

        echo '<div class="success">Спасибо, ваша заявка принята.</div>';
    }
}
add_action('wp', 'wpboot_handle_dynamic_form');

Функция проверяет наличие отправки, очищает данные с помощью sanitize_text_field, валидирует обязательные поля и отправляет письмо администратору. Вывод сообщений реализован прямо в функции, можно улучшить вывод через сессии или AJAX.

Расширение функционала: добавление валидации и AJAX

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

Клиентская валидация

Можно использовать HTML-атрибуты required и регулярные выражения в pattern для телефонов:

<input type="tel" name="wpboot_phone[]" required pattern="\+?[0-9\s\-]{7,15}" />

Это позволит браузеру проверять формат телефонов. Для сложных проверок используйте JavaScript.

AJAX отправка формы

Добавим отправку через AJAX. В functions.php зарегистрируем обработчик:

function wpboot_enqueue_scripts() {
    wp_enqueue_script('wpboot-form', get_template_directory_uri() . '/js/wpboot-form.js', ['jquery'], null, true);
    wp_localize_script('wpboot-form', 'wpboot_ajax', [
        'ajax_url' => admin_url('admin-ajax.php')
    ]);
}
add_action('wp_enqueue_scripts', 'wpboot_enqueue_scripts');

function wpboot_ajax_handle_form() {
    $name = sanitize_text_field($_POST['name'] ?? '');
    $phones_raw = $_POST['phones'] ?? [];
    $phones = [];
    foreach ($phones_raw as $phone) {
        $phone_sanitized = sanitize_text_field($phone);
        if (!empty($phone_sanitized)) {
            $phones[] = $phone_sanitized;
        }
    }

    if (empty($name) || empty($phones)) {
        wp_send_json_error('Пожалуйста, заполните все обязательные поля.');
    }

    $to = get_option('admin_email');
    $subject = 'Новая заявка с сайта';
    $message = 'Имя: ' . $name . "\n" . 'Телефоны: ' . implode(", ", $phones);

    wp_mail($to, $subject, $message);

    wp_send_json_success('Спасибо, ваша заявка принята.');
}
add_action('wp_ajax_wpboot_submit_form', 'wpboot_ajax_handle_form');
add_action('wp_ajax_nopriv_wpboot_submit_form', 'wpboot_ajax_handle_form');

Создайте файл js/wpboot-form.js с таким содержимым:

jQuery(document).ready(function($) {
    $('#wpboot_dynamic_form').on('submit', function(e) {
        e.preventDefault();

        var name = $('input[name="wpboot_name"]').val();
        var phones = [];
        $('input[name="wpboot_phone[]"]').each(function() {
            if ($(this).val() !== '') {
                phones.push($(this).val());
            }
        });

        $.post(wpboot_ajax.ajax_url, {
            action: 'wpboot_submit_form',
            name: name,
            phones: phones
        }, function(response) {
            if (response.success) {
                alert(response.data);
                $('#wpboot_dynamic_form')[0].reset();
                $('#phone_fields').html('<label>Телефон 1:</label><input type="text" name="wpboot_phone[]" required />');
            } else {
                alert('Ошибка: ' + response.data);
            }
        });
    });
});

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

Подведение итогов и рекомендации

Создание динамических форм без плагинов даёт полный контроль над валидацией, внешним видом и логикой обработки. Вы можете расширять функционал, добавлять разные типы полей, интегрировать с REST API или сторонними сервисами.

Если хотите готовое решение с расширенными возможностями, обратите внимание на плагин Clearfy Pro — он помогает оптимизировать работу сайта и имеет инструменты для управления формами и безопасностью.

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

Как настроить безопасность WordPress с помощью плагинов
18.11.2025
Как добавить динамические атрибуты alt к картинкам в WordPress для SEO и доступности
11.03.2026
Как удалить неиспользуемые таблицы в базе данных WordPress
03.02.2026
Как увеличить качество изображений в WordPress для быстрой загрузки и высокого качества
20.05.2025
Как сделать автоматический экспорт постов WordPress в Excel
30.03.2026