Формы обратной связи — одна из важных частей любого сайта на WordPress. Однако стандартные формы, отправляющие данные с полной перезагрузкой страницы, часто ухудшают пользовательский опыт. В этой статье рассмотрим, как создать динамическую форму обратной связи с использованием AJAX, которая отправляет данные без перезагрузки, выводит сообщения об ошибках и подтверждениях, а также защищена от спама.
Почему стоит использовать AJAX в формах обратной связи WordPress
Использование AJAX позволяет отправлять данные на сервер асинхронно, не перезагружая страницу. Это повышает удобство для пользователей и снижает нагрузку на сервер, поскольку не происходит повторной генерации всей страницы. Кроме того, можно реализовать мгновенную валидацию и отображение ошибок.
Для реализации AJAX в WordPress важно корректно подключить скрипты и использовать admin-ajax.php для обработки запросов.
Создаем простую форму обратной связи
Начнем с создания HTML-формы в любом шаблоне или через шорткод. Например, добавим такой код в functions.php для создания шорткода [wp_shablon_ajax_form]:
function wp_shablon_ajax_form_shortcode() {
ob_start();
?>
<form id="wp-shablon-contact-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 />
<label for="message">Сообщение:</label>
<textarea id="message" name="message" required></textarea>
<button type="submit">Отправить</button>
<div id="wp-shablon-form-response"></div>
</form>
<?php
return ob_get_clean();
}
add_shortcode('wp_shablon_ajax_form', 'wp_shablon_ajax_form_shortcode');Теперь на любой странице можно вставить [wp_shablon_ajax_form] и будет выведена форма.
Подключаем скрипт AJAX в WordPress
Чтобы отправлять форму без перезагрузки, подключим JS-скрипт, который будет обрабатывать отправку и работать с AJAX.
function wp_shablon_enqueue_scripts() {
wp_enqueue_script('wp-shablon-ajax-form', get_template_directory_uri() . '/js/wp-shablon-ajax-form.js', ['jquery'], null, true);
wp_localize_script('wp-shablon-ajax-form', 'wpShablonAjax', [
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wp_shablon_ajax_nonce')
]);
}
add_action('wp_enqueue_scripts', 'wp_shablon_enqueue_scripts');Файл wp-shablon-ajax-form.js нужно создать в папке темы /js/ и написать в нем следующий код:
jQuery(document).ready(function($) {
$('#wp-shablon-contact-form').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var responseDiv = $('#wp-shablon-form-response');
responseDiv.html('Отправка...');
$.ajax({
url: wpShablonAjax.ajaxurl,
type: 'POST',
data: {
action: 'wp_shablon_send_contact_form',
nonce: wpShablonAjax.nonce,
name: form.find('#name').val(),
email: form.find('#email').val(),
message: form.find('#message').val()
},
success: function(data) {
if(data.success) {
responseDiv.html('<span style="color:green;">' + data.data + '</span>');
form[0].reset();
} else {
responseDiv.html('<span style="color:red;">' + data.data + '</span>');
}
},
error: function() {
responseDiv.html('<span style="color:red;">Ошибка запроса. Попробуйте позже.</span>');
}
});
});
});Обрабатываем AJAX-запрос на сервере
Теперь добавим обработчик на PHP, который будет принимать данные, валидировать их и отправлять письмо.
function wp_shablon_handle_contact_form() {
check_ajax_referer('wp_shablon_ajax_nonce', 'nonce');
$name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : '';
$email = isset($_POST['email']) ? sanitize_email($_POST['email']) : '';
$message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : '';
if(empty($name) || empty($email) || empty($message)) {
wp_send_json_error('Пожалуйста, заполните все поля.');
}
if(!is_email($email)) {
wp_send_json_error('Введите корректный email.');
}
$to = get_option('admin_email');
$subject = 'Новое сообщение с сайта';
$headers = ['Content-Type: text/html; charset=UTF-8', 'From: ' . $name . ' <' . $email . '>'];
$body = '<p><strong>Имя:</strong> ' . esc_html($name) . '</p>'
. '<p><strong>Email:</strong> ' . esc_html($email) . '</p>'
. '<p><strong>Сообщение:</strong><br>' . nl2br(esc_html($message)) . '</p>';
$mail_sent = wp_mail($to, $subject, $body, $headers);
if($mail_sent) {
wp_send_json_success('Спасибо за ваше сообщение! Мы свяжемся с вами в ближайшее время.');
} else {
wp_send_json_error('Ошибка при отправке письма. Попробуйте позже.');
}
wp_die();
}
add_action('wp_ajax_wp_shablon_send_contact_form', 'wp_shablon_handle_contact_form');
add_action('wp_ajax_nopriv_wp_shablon_send_contact_form', 'wp_shablon_handle_contact_form');Защита от спама и улучшения
Чтобы защитить форму от спама, можно добавить Google reCAPTCHA или использовать плагин Clearfy Pro, который интегрируется с формами и блокирует спам-ботов.
Другой вариант — добавить скрытое поле (honeypot), которое видят только боты, и если оно заполнено — отклонять запрос.
Также полезно логировать ошибки и успешные отправки, чтобы анализировать работу формы. Для этого можно использовать плагин Expert Review или собственные записи в базе.
Обзор полезных плагинов для форм и AJAX в WordPress
Если не хочется писать форму с нуля, рассмотрите эти плагины:
- Contact Form 7 — классика, поддерживает AJAX из коробки, множество расширений и интеграций.
- Ninja Forms — удобный визуальный конструктор форм с поддержкой AJAX.
- WPForms — платный плагин с отличной поддержкой AJAX, антиспамом и аналитикой.
- My Popup от WPGPT на WPSHOP — если хотите добавить форму обратной связи в попап с AJAX.
Итоговые рекомендации и советы
Динамические формы с AJAX значительно улучшают UX и помогают избежать лишних перезагрузок. При самостоятельной реализации важно внимательно относиться к безопасности — использовать nonce, валидировать данные и защищать от спама.
Подключайте JS через wp_enqueue_script, используйте обработку через admin-ajax.php и возвращайте ответы в формате JSON для удобного парсинга на фронтенде.
Если вы используете шаблоны Reboot или Root, то код можно интегрировать напрямую в шаблонные части. Для расширения возможностей и интеграции с CRM и аналитикой рассмотрите плагины от WPSHOP.