wpforms.ru wordpress WPForms.ru

Как установить ограничение на отправку формы и избежать многократных отправок

Диагностика проблемы с многократной отправкой форм в WPForms

Пользователи часто сталкиваются с ситуацией, когда форма отправляется несколько раз подряд — например, при многократном клике на кнопку отправки или при обновлении страницы после отправки. Это приводит к дублированию записей, лишним уведомлениям и нагрузке на сервер.

Для диагностики проблемы проверьте следующие моменты:

  • Используется ли AJAX-отправка формы? Если нет, страница перезагружается, и пользователь может случайно отправить форму повторно.
  • Есть ли у вас кеширование страниц или плагинов, которые могут мешать корректной работе формы.
  • Проверяйте логи сервера на повторные POST-запросы к обработчику формы.
  • Обратите внимание на пользовательский опыт: насколько быстро срабатывает подтверждение отправки.

Пошаговое решение: ограничение одной отправки формы на сеанс пользователя

1. Включение AJAX-отправки в настройках WPForms

Перейдите в редактор формы, откройте настройки формы и убедитесь, что включена опция Enable AJAX form submission. Это предотвратит перезагрузку страницы и уменьшит риск повторных отправок.

2. Добавление серверной проверки с использованием сессий или куки

WPForms не хранит состояние отправки по умолчанию, поэтому можно реализовать проверку на уровне PHP, чтобы ограничить отправку формы одним разом за сессию пользователя.

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

add_action('wpforms_process', 'wpforms_limit_single_submission', 10, 3);
function wpforms_limit_single_submission($fields, $entry, $form_data) {
    // Уникальный ID формы
    $form_id = $form_data['id'];
    $cookie_name = 'wpforms_submitted_' . $form_id;

    if (isset($_COOKIE[$cookie_name])) {
        wpforms()->process->errors[$form_id]['header'] = 'Вы уже отправили эту форму. Повторная отправка невозможна.';
        // Прекращаем обработку формы
        return;
    }

    // Устанавливаем cookie на 1 час
    setcookie($cookie_name, '1', time() + 3600, COOKIEPATH, COOKIE_DOMAIN);
}

Этот код проверяет, был ли установлен cookie с отметкой о том, что форма уже отправлена, и при повторной попытке блокирует отправку с сообщением.

3. Настройка пользовательского сообщения об ошибке

Вы можете изменить текст ошибки в коде на свой, чтобы лучше информировать пользователя.

4. Дополнительная защита от многократных отправок через JavaScript

Добавьте блокировку кнопки отправки после первого клика, чтобы предотвратить повторные клики:

document.addEventListener('DOMContentLoaded', function() {
  var form = document.querySelector('.wpforms-form');
  if (!form) return;
  form.addEventListener('submit', function(e) {
    var submitBtn = form.querySelector('button[type="submit"]');
    if (submitBtn) {
      submitBtn.disabled = true;
      submitBtn.innerText = 'Отправка...';
    }
  });
});

Проверка результата после внедрения

Чтобы убедиться, что ограничение работает:

  • Заполните форму и отправьте её.
  • Попробуйте отправить форму повторно в том же браузере — должна появиться ошибка, и форма не отправится.
  • Очистите cookie или используйте другой браузер/инкогнито для теста повторной отправки.
  • Проверьте в консоли браузера, что кнопка отправки блокируется после первого клика.

Частые ошибки и как их исправить

  • Cookie не устанавливаются или не читаются: Проверьте, нет ли конфликтов с плагинами, которые управляют куки, и что код вызывается до вывода контента.
  • Сообщение об ошибке не отображается: Убедитесь, что хук wpforms_process используется корректно, и нет конфликтов с другими хуками.
  • AJAX не включен, форма перезагружает страницу: Включите AJAX-отправку в настройках формы.
  • Повторная отправка возможна при очищении cookie: Для более надежной защиты используйте серверное хранение отправок, например, в пользовательских мета или в базе данных, если пользователи авторизованы.

Практические советы по безопасности и производительности

  • Не храните длительные cookie для ограничения отправок, так как это может помешать легитимным повторным формам.
  • Если форма критична, учитывайте авторизацию пользователя и храните статус отправки в пользовательских метаданных.
  • Обязательно тестируйте на разных браузерах и устройствах, чтобы убедиться в корректной работе блокировки.
  • Для сайтов с большой нагрузкой используйте кеширование форм с исключением страниц с формами, чтобы не было конфликтов с AJAX.

Сравнительная таблица методов ограничения отправки формы

>
Метод Плюсы Минусы
AJAX + блокировка кнопки JS Простой, улучшает UX, уменьшает дубли Не защищает от повторных отправок через куки/сессию
Cookie на стороне сервера (PHP) Блокирует повторные отправки в пределах сессии Легко обходится очисткой cookie, не подходит для авторизованных пользователей
Хранение в базе (через мета пользователя) Надежно для авторизованных, не зависит от куки Сложнее в реализации, требует авторизации
×
День SEO
Время сделать подарок своему WordPress!
-20% на премиум

шаблоны и плагины

Порадуй свой сайт ⋙