Проблема: потеря введенных данных при перезагрузке страницы с формой
Одна из распространенных проблем пользователей Contact Form 7 — это потеря всех введенных данных, если пользователь случайно перезагрузил страницу или нажал кнопку "Назад" в браузере. Это негативно сказывается на удобстве использования формы и может привести к снижению конверсии.
Contact Form 7 по умолчанию не сохраняет состояние формы между загрузками, поэтому при обновлении страницы все поля очищаются.
Как диагностировать потерю данных в форме
- Откройте страницу с формой Contact Form 7.
- Введите данные в несколько полей.
- Обновите страницу браузера (F5 или Ctrl+R).
- Проверьте, сохранились ли введенные данные.
Если поля пустые — значит, проблема подтверждается.
Решение: автосохранение данных формы в localStorage и восстановление при загрузке
Для сохранения данных формы Contact Form 7 между перезагрузками можно использовать JavaScript и Web Storage API (localStorage). Такой подход не требует серверной доработки и работает на стороне клиента.
Пошаговая инструкция по внедрению
- Добавьте кастомный JavaScript в тему или плагин. Например, в файле
functions.phpвашей темы подключите скрипт:
function cf7_autosave_scripts() {
if (is_page()) { // заменить на условие для страниц с формой
wp_enqueue_script('cf7-autosave', get_template_directory_uri() . '/js/cf7-autosave.js', ['jquery'], null, true);
}
}
add_action('wp_enqueue_scripts', 'cf7_autosave_scripts');- Создайте файл
js/cf7-autosave.jsс таким содержимым:
document.addEventListener('DOMContentLoaded', function() {
const form = document.querySelector('.wpcf7 form');
if (!form) return;
const storageKey = 'cf7-form-autosave';
// Восстановление данных из localStorage
const savedData = JSON.parse(localStorage.getItem(storageKey) || '{}');
Object.keys(savedData).forEach(function(name) {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
field.value = savedData[name];
}
});
// Сохраняем данные при изменении полей
form.addEventListener('input', function(e) {
const target = e.target;
if (!target.name) return;
savedData[target.name] = target.value;
localStorage.setItem(storageKey, JSON.stringify(savedData));
});
// Очищаем localStorage после успешной отправки формы
document.addEventListener('wpcf7mailsent', function() {
localStorage.removeItem(storageKey);
});
});Проверка результата
- Откройте страницу с формой.
- Введите данные в несколько полей.
- Обновите страницу — данные должны остаться в полях.
- Отправьте форму — после успешной отправки поля очистятся и данные в localStorage удалятся.
Частые ошибки и как их исправлять
- Форма не восстанавливает данные после перезагрузки: проверьте, что селектор
.wpcf7 formсоответствует вашей форме. Возможно, на странице несколько форм — тогда нужно адаптировать скрипт под конкретный ID. - Данные не очищаются после отправки: убедитесь, что событие
wpcf7mailsentсрабатывает. Для этого можно добавитьconsole.logв обработчик. - Ошибка JSON.parse: localStorage может содержать некорректные данные — в скрипт добавьте проверку или try/catch при парсинге.
Практические советы по безопасности и производительности
- Данные сохраняются только в браузере пользователя, не передаются на сервер, поэтому риск утечки минимален.
- Не сохраняйте в localStorage чувствительные данные (пароли, платежные данные).
- Для больших и сложных форм можно добавить дебаунс на сохранение, чтобы не записывать данные слишком часто.
- Если на странице несколько форм, используйте уникальные ключи localStorage для каждой формы.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| localStorage + JS | Простая реализация, не требует серверных изменений, работает для любого количества форм | Данные доступны только в одном браузере, не подходят для чувствительной информации |
| Сохранение в сессии PHP | Данные сохраняются на сервере, доступны при смене браузера | Требует доработки PHP, увеличение нагрузки на сервер, сложнее реализовать |
| Плагины автосохранения форм | Готовое решение с поддержкой, дополнительные функции | Могут влиять на производительность, требуют настройки и обновлений |