Как создать динамические формы в WordPress с помощью AJAX и REST API

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

Что такое AJAX и REST API в WordPress и зачем они нужны для динамических форм

AJAX (Asynchronous JavaScript and XML) — технология, которая позволяет обмениваться данными с сервером в фоновом режиме без перезагрузки страницы. В контексте WordPress AJAX обычно используется для отправки данных формы и получения ответа.

REST API — это современный способ взаимодействия с WordPress через HTTP-запросы, который позволяет создавать, читать, обновлять и удалять данные, используя стандартизированные маршруты.

Использование REST API для обработки форм дает преимущества: упрощает маршруты, улучшает безопасность и расширяет возможности интеграции.

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

Почему не использовать только admin-ajax.php для обработки форм

Традиционно в WordPress для AJAX используют admin-ajax.php, но это может быть медленнее и менее гибко. REST API предоставляет более чистый и современный способ обработки запросов, особенно для публичных форм, где не нужно загружать весь административный контекст.

Создание REST API endpoint для обработки данных формы

Первый шаг — зарегистрировать собственный REST API endpoint, который будет принимать POST-запросы с данными формы.

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

add_action('rest_api_init', function () {
    register_rest_route('wpquery/v1', '/submit-form', array(
        'methods' => 'POST',
        'callback' => 'wpquery_handle_form_submit',
        'permission_callback' => '__return_true',
    ));
});

function wpquery_handle_form_submit(WP_REST_Request $request) {
    $params = $request->get_json_params();

    // Простейшая валидация
    if (empty($params['name']) || empty($params['email'])) {
        return new WP_REST_Response(array(
            'success' => false,
            'message' => 'Пожалуйста, заполните все обязательные поля.'
        ), 400);
    }

    // Дополнительная валидация email
    if (!filter_var($params['email'], FILTER_VALIDATE_EMAIL)) {
        return new WP_REST_Response(array(
            'success' => false,
            'message' => 'Неверный формат email.'
        ), 400);
    }

    // Здесь можно обработать данные: сохранить в базу, отправить email и т.д.
    // Пример: сохранить в пользовательские мета данные

    // Для демонстрации — просто возвращаем успех
    return new WP_REST_Response(array(
        'success' => true,
        'message' => 'Форма успешно отправлена!'
    ), 200);
}

В этом коде мы создаём маршрут /wp-json/wpquery/v1/submit-form, который принимает POST запросы с параметрами name и email, проверяет их и возвращает JSON-ответ.

Создание фронтенд-формы и JavaScript для отправки данных через AJAX

Теперь создадим форму в шаблоне WordPress и напишем JavaScript, который будет отправлять данные на REST API.

Пример формы:

<form id="wpquery-dynamic-form">
    <label for="name">Имя:</label>
    <input type="text" id="name" name="name" required>

    <label for="email">Email:</label>
    <input type="email" id="email" name="email" required>

    <button type="submit">Отправить</button>
</form>
<div id="wpquery-form-response"></div>

JavaScript для отправки:

document.getElementById('wpquery-dynamic-form').addEventListener('submit', function(e) {
    e.preventDefault();

    const name = document.getElementById('name').value.trim();
    const email = document.getElementById('email').value.trim();
    const responseContainer = document.getElementById('wpquery-form-response');

    fetch('/wp-json/wpquery/v1/submit-form', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ name: name, email: email })
    })
    .then(response => response.json())
    .then(data => {
        if(data.success) {
            responseContainer.textContent = data.message;
            responseContainer.style.color = 'green';
            document.getElementById('wpquery-dynamic-form').reset();
        } else {
            responseContainer.textContent = data.message;
            responseContainer.style.color = 'red';
        }
    })
    .catch(error => {
        responseContainer.textContent = 'Ошибка отправки формы. Попробуйте позже.';
        responseContainer.style.color = 'red';
        console.error(error);
    });
});

Этот скрипт перехватывает отправку формы, собирает данные и отправляет их на созданный нами REST API endpoint. В ответе выводится сообщение об успехе или ошибке.

Обработка безопасности и защита от спама

Для защиты формы от CSRF и спама рекомендуется добавить nonce и проверку на сервере.

Добавим nonce в форму через PHP:

<?php wp_nonce_field('wpquery_form_nonce_action', 'wpquery_form_nonce_field'); ?>

И передадим nonce в AJAX-запрос:

const nonce = document.querySelector('input[name="wpquery_form_nonce_field"]').value;

fetch('/wp-json/wpquery/v1/submit-form', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-WP-Nonce': nonce
    },
    body: JSON.stringify({ name: name, email: email })
})

На сервере добавим проверку nonce в колбэк:

function wpquery_handle_form_submit(WP_REST_Request $request) {
    $nonce = $request->get_header('X-WP-Nonce');
    if (!wp_verify_nonce($nonce, 'wpquery_form_nonce_action')) {
        return new WP_REST_Response(array(
            'success' => false,
            'message' => 'Ошибка безопасности. Неверный nonce.'
        ), 403);
    }
    // Далее валидация и обработка данных
}

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

Дополнительные возможности: интеграция с плагинами и сохранение данных

После создания базовой формы можно расширить функционал:

  • Сохранять данные в кастомные таблицы или посты, используя функции WordPress.
  • Отправлять уведомления на email с помощью wp_mail().
  • Интегрировать с плагинами, например, для сбора лидов или CRM.
  • Добавить валидацию на стороне клиента и сервера для улучшения UX и безопасности.

Пример сохранения данных в пост типа "lead":

function wpquery_save_lead($name, $email) {
    $post_data = array(
        'post_title' => sanitize_text_field($name),
        'post_type' => 'lead',
        'post_status' => 'publish',
        'meta_input' => array(
            'email' => sanitize_email($email)
        )
    );
    return wp_insert_post($post_data);
}

Вызывайте эту функцию внутри обработчика REST API после успешной валидации.

Заключение по созданию динамических форм в WordPress

Использование AJAX и REST API для создания динамических форм в WordPress делает взаимодействие пользователя с сайтом плавным и современным. Такой подход позволяет повысить удобство, улучшить безопасность и расширить функциональность. В статье приведён полный пример создания REST endpoint, фронтенд-формы и JavaScript для отправки данных. Также рассмотрены способы защиты и расширения возможностей.

Автоматическое отправление сообщений с формы обратной связи WordPress через SMTP
10.03.2026
Как создать уникальный REST API endpoint в WordPress: подробное руководство с примерами
01.12.2025
Как удалить неактивных пользователей в WordPress через HTML и PHP
14.01.2026
Как создать свой плагин для автоматизации задач в WordPress
30.01.2026
Как удалить неиспользуемые мета данные в WordPress для оптимизации базы
28.12.2025