Как создать динамическую форму в WordPress на PHP и AJAX

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

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

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

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

Для реализации динамических форм в WordPress обычно применяется AJAX — технология, позволяющая обмениваться данными с сервером асинхронно.

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

Для удобства и масштабируемости создадим простой плагин. В папке wp-content/plugins/wpfreecourses-dynamic-form создайте файл wpfreecourses-dynamic-form.php со следующим содержимым:

<?php
/**
 * Plugin Name: WPFreeCourses Dynamic Form
 * Description: Плагин для создания динамической формы с использованием AJAX в WordPress
 * Version: 1.0
 * Author: WPFreeCourses
 */

// Подключаем скрипты
add_action('wp_enqueue_scripts', 'wpfreecourses_enqueue_dynamic_form_scripts');
function wpfreecourses_enqueue_dynamic_form_scripts() {
    wp_enqueue_script('wpfreecourses-dynamic-form-js', plugin_dir_url(__FILE__) . 'dynamic-form.js', array('jquery'), '1.0', true);
    wp_localize_script('wpfreecourses-dynamic-form-js', 'wpfreecourses_ajax_obj', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce'    => wp_create_nonce('wpfreecourses_dynamic_form_nonce')
    ));
}

// Добавляем шорткод для вывода формы
add_shortcode('wpfreecourses_dynamic_form', 'wpfreecourses_dynamic_form_shortcode');
function wpfreecourses_dynamic_form_shortcode() {
    ob_start();
    ?>
    <form id="wpfreecourses-dynamic-form">
        <label for="category">Выберите категорию:</label>
        <select id="category" name="category">
            <option value="">-- Выберите --</option>
            <option value="books">Книги</option>
            <option value="courses">Курсы</option>
            <option value="videos">Видео</option>
        </select>
        <div id="wpfreecourses-dynamic-result" style="margin-top:15px;"></div>
    </form>
    <?php
    return ob_get_clean();
}

// Обработка AJAX запроса
add_action('wp_ajax_wpfreecourses_get_items', 'wpfreecourses_get_items_callback');
add_action('wp_ajax_nopriv_wpfreecourses_get_items', 'wpfreecourses_get_items_callback');
function wpfreecourses_get_items_callback() {
    check_ajax_referer('wpfreecourses_dynamic_form_nonce', 'nonce');

    $category = sanitize_text_field($_POST['category'] ?? '');

    $items = wpfreecourses_get_items_by_category($category);

    if (empty($items)) {
        wp_send_json_error('Нет элементов для выбранной категории');
    }

    wp_send_json_success($items);
}

// Вспомогательная функция для получения данных
function wpfreecourses_get_items_by_category($category) {
    $data = [
        'books' => [
            ['title' => 'PHP для начинающих', 'link' => 'https://example.com/php-book'],
            ['title' => 'WordPress. Полный курс', 'link' => 'https://example.com/wp-book']
        ],
        'courses' => [
            ['title' => 'Курс по WordPress', 'link' => 'https://example.com/wp-course'],
            ['title' => 'Курс по PHP', 'link' => 'https://example.com/php-course']
        ],
        'videos' => [
            ['title' => 'Видео урок по AJAX', 'link' => 'https://example.com/ajax-video'],
            ['title' => 'Видео по JavaScript', 'link' => 'https://example.com/js-video']
        ]
    ];

    return $data[$category] ?? [];
}

Код JavaScript для отправки AJAX запроса и обновления формы

Создайте файл dynamic-form.js в папке плагина с таким содержимым:

jQuery(document).ready(function($) {
    $('#category').on('change', function() {
        var category = $(this).val();
        var resultContainer = $('#wpfreecourses-dynamic-result');

        if (!category) {
            resultContainer.html('');
            return;
        }

        $.ajax({
            url: wpfreecourses_ajax_obj.ajax_url,
            method: 'POST',
            data: {
                action: 'wpfreecourses_get_items',
                nonce: wpfreecourses_ajax_obj.nonce,
                category: category
            },
            beforeSend: function() {
                resultContainer.html('Загрузка...');
            },
            success: function(response) {
                if (response.success) {
                    var items = response.data;
                    var html = '<ul>';
                    items.forEach(function(item) {
                        html += '<li><a href="' + item.link + '" target="_blank">' + item.title + '</a></li>';
                    });
                    html += '</ul>';
                    resultContainer.html(html);
                } else {
                    resultContainer.html('<span style="color:red;">' + response.data + '</span>');
                }
            },
            error: function() {
                resultContainer.html('<span style="color:red;">Ошибка запроса</span>');
            }
        });
    });
});

Тестирование и интеграция на сайте

После активации плагина добавьте шорткод [wpfreecourses_dynamic_form] в любую страницу или запись WordPress. Форма автоматически загрузит список элементов в зависимости от выбранной категории, не перезагружая страницу.

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

Советы по оптимизации и безопасности динамических форм в WordPress

Используйте nonce для защиты AJAX запросов

В нашем примере мы применили wp_create_nonce и check_ajax_referer для предотвращения CSRF атак. Это обязательный элемент при работе с AJAX в WordPress.

Санитизация и валидация данных

Всегда проверяйте и очищайте входящие данные функциями типа sanitize_text_field или esc_html, чтобы не допустить внедрения вредоносного кода и ошибок.

Минимизируйте количество AJAX запросов

Старайтесь не делать AJAX запросы при каждом событии, если это не нужно. Можно добавить задержку или проверку на изменения, чтобы снизить нагрузку на сервер и улучшить отзывчивость.

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

WooCommerce: автоматическое создание скидки при покупке N товаров без использования плагинов
11.05.2026
Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
05.04.2026
Как использовать PHPStan для анализа кода WordPress: практическое руководство
05.02.2026
Как создать автоматический excerpt для курсов в WordPress
18.01.2026
Как избежать проблем с производительностью WordPress при использовании внешних API
14.03.2026