В современных проектах на 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-сайтах. Используя приведенный подход, вы сможете создавать гибкие и эффективные интерфейсы с минимальными затратами времени и ресурсов.