Автоматическое сохранение данных форм — важная функция для повышения удобства пользователей и предотвращения потери информации при заполнении длинных форм. Особенно это актуально для сайтов на WordPress, где часто используются контактные формы, формы регистрации, опросы и другие интерактивные элементы. В этой статье мы подробно разберём, как реализовать автоматическое сохранение данных формы с помощью AJAX, чтобы данные сохранялись без перезагрузки страницы и были доступны при следующем посещении.
Почему важно внедрять автоматическое сохранение форм в WordPress
Автосохранение помогает избежать потери данных, если пользователь случайно закроет вкладку или произойдет сбой соединения. Это повышает доверие и улучшает пользовательский опыт.
Кроме того, для сайтов с большими формами (например, опросы, анкеты, заявки) автосохранение позволяет пользователю прервать заполнение и продолжить позже, не начиная всё заново.
В WordPress реализация автосохранения потребует интеграции с серверной частью и взаимодействия с базой данных, а также корректной обработки данных на фронтенде.
Использование AJAX для автоматического сохранения данных формы
AJAX позволяет отправлять данные на сервер в фоновом режиме без перезагрузки страницы. В WordPress для этого обычно используется встроенный объект wp_ajax.
Основная идея — при изменении значений в полях формы с определённой задержкой отправлять через AJAX запрос на сервер, где данные сохраняются либо в пользовательские метаполя, либо в отдельную таблицу, либо в сессионные данные.
Важно использовать wp_localize_script для передачи URL обработки AJAX-запросов и nonce для безопасности.
Пример: базовая форма с автосохранением
Создадим простую форму с полями "Имя" и "Комментарий" и добавим автосохранение.
<form id="wpdesk_autosave_form">
<label for="name">Имя:</label>
<input type="text" id="name" name="name" />
<br />
<label for="comment">Комментарий:</label>
<textarea id="comment" name="comment"></textarea>
</form>
JavaScript с AJAX для автосохранения
Добавим скрипт, который будет слушать изменения в полях и отправлять данные на сервер через AJAX с задержкой 2 секунды после последнего изменения.
jQuery(document).ready(function($) {
let timer;
$('#wpdesk_autosave_form input, #wpdesk_autosave_form textarea').on('input', function() {
clearTimeout(timer);
timer = setTimeout(function() {
const data = {
action: 'wpdesk_autosave_save',
nonce: wpdesk_autosave.nonce,
name: $('#name').val(),
comment: $('#comment').val()
};
$.post(wpdesk_autosave.ajax_url, data, function(response) {
if(response.success) {
console.log('Данные успешно сохранены');
} else {
console.log('Ошибка сохранения данных');
}
});
}, 2000);
});
// При загрузке страницы загружаем ранее сохранённые данные
$.post(wpdesk_autosave.ajax_url, { action: 'wpdesk_autosave_load', nonce: wpdesk_autosave.nonce }, function(response) {
if(response.success) {
$('#name').val(response.data.name);
$('#comment').val(response.data.comment);
}
});
});
Обработка AJAX-запросов в PHP
Добавим функции для сохранения и загрузки данных. В примере данные сохраняются в пользовательские метаполя (user meta) текущего залогиненного пользователя. Для гостей можно использовать сессии или куки.
add_action('wp_ajax_wpdesk_autosave_save', 'wpdesk_autosave_save_callback');
add_action('wp_ajax_wpdesk_autosave_load', 'wpdesk_autosave_load_callback');
function wpdesk_autosave_save_callback() {
check_ajax_referer('wpdesk_autosave_nonce', 'nonce');
$user_id = get_current_user_id();
if (!$user_id) {
wp_send_json_error('Требуется авторизация');
}
$name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : '';
$comment = isset($_POST['comment']) ? sanitize_textarea_field($_POST['comment']) : '';
update_user_meta($user_id, '_wpdesk_autosave_name', $name);
update_user_meta($user_id, '_wpdesk_autosave_comment', $comment);
wp_send_json_success();
}
function wpdesk_autosave_load_callback() {
check_ajax_referer('wpdesk_autosave_nonce', 'nonce');
$user_id = get_current_user_id();
if (!$user_id) {
wp_send_json_error('Требуется авторизация');
}
$name = get_user_meta($user_id, '_wpdesk_autosave_name', true);
$comment = get_user_meta($user_id, '_wpdesk_autosave_comment', true);
wp_send_json_success([ 'name' => $name, 'comment' => $comment ]);
}
Подключение скриптов и локализация параметров
Для работы JavaScript нужно зарегистрировать и подключить скрипт, а также передать параметры AJAX и nonce. Добавьте следующий код в functions.php или в плагин:
function wpdesk_autosave_enqueue_scripts() {
wp_enqueue_script('wpdesk-autosave', get_template_directory_uri() . '/js/wpdesk-autosave.js', ['jquery'], '1.0', true);
wp_localize_script('wpdesk-autosave', 'wpdesk_autosave', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpdesk_autosave_nonce')
]);
}
add_action('wp_enqueue_scripts', 'wpdesk_autosave_enqueue_scripts');
Как адаптировать автосохранение для других сценариев
Если вы используете формы в публичной части сайта для гостей, стоит рассмотреть хранение данных в сессиях или локальном хранилище браузера с последующей отправкой в базу при регистрации или отправке формы.
Для сложных форм с множеством полей можно расширить механизм, отправляя только изменённые данные, или использовать дебаунсинг для уменьшения количества запросов.
Также можно интегрировать автосохранение с плагинами, например, с Clearfy Pro, чтобы оптимизировать работу сайта и повысить безопасность AJAX-запросов.
Выводы и рекомендации по реализации
Автоматическое сохранение форм с помощью AJAX — мощный инструмент для улучшения UX на вашем WordPress-сайте. Главное — обеспечить безопасность, минимизировать нагрузку на сервер и корректно обрабатывать данные.
Используйте nonce для защиты от CSRF, валидируйте и санитайзите данные на сервере, а также учитывайте сценарии для неавторизованных пользователей.
Внедрение данной технологии позволит сделать ваши формы более надёжными и удобными для пользователей.