Проблема: повторная отправка формы при обновлении страницы
При работе с WPForms в WordPress часто встречается ситуация, когда пользователь после успешной отправки формы обновляет страницу браузера (F5 или Ctrl+R), и форма повторно отправляется. Это приводит к дублированию данных, ошибкам в базе и неудобствам для пользователей и администраторов.
Диагностика проблемы
Первый шаг — убедиться, что именно при обновлении страницы происходит повторная отправка формы. Для этого:
- Отправьте форму и обратите внимание на URL после отправки.
- Обновите страницу в браузере и проверьте, появляется ли повторное сообщение об отправке.
- Просмотрите базу данных или email-уведомления — дублируются ли записи.
Повторная отправка возникает из-за того, что форма отправляется методом POST, а при обновлении браузер пытается повторить последний POST-запрос.
Пошаговое решение: реализуем Post/Redirect/Get (PRG) паттерн для WPForms
Идея решения — после успешной отправки формы сделать редирект на другую страницу или на ту же, но с GET-запросом. Это предотвратит повторную отправку при обновлении.
Шаг 1. Создайте дочернюю тему или используйте файл functions.php
Вставьте следующий код в functions.php вашей активной темы или в плагин кастомных функций:
add_action('wpforms_process_complete', 'wpforms_prg_redirect', 10, 4);
function wpforms_prg_redirect($fields, $entry, $form_data, $entry_id) {
// ID формы, для которой применяем редирект
$target_form_id = 123; // Замените на ID вашей формы
if ($form_data['id'] == $target_form_id) {
// URL для редиректа после отправки
$redirect_url = add_query_arg('wpforms_submitted', '1', get_permalink());
wp_safe_redirect($redirect_url);
exit;
}
}Этот код срабатывает после успешной отправки формы с ID 123 и перенаправляет пользователя на ту же страницу с параметром wpforms_submitted=1.
Шаг 2. Обработка сообщения об успешной отправке
Чтобы не показывать форму повторно с параметром wpforms_submitted, добавьте проверку и вывод сообщения:
add_shortcode('wpforms_prg', function($atts) {
$form_id = isset($atts['id']) ? intval($atts['id']) : 0;
if (!$form_id) return 'Не указан ID формы.';
if (isset($_GET['wpforms_submitted']) && $_GET['wpforms_submitted'] == '1') {
return '<div class="wpforms-success">Спасибо, ваша форма успешно отправлена.</div>';
}
return do_shortcode('[wpforms id="' . $form_id . '"]');
});Используйте шорткод [wpforms_prg id="123"] в контенте страницы вместо обычного шорткода WPForms. Таким образом, после редиректа пользователю покажется сообщение, а повторная отправка не произойдет.
Проверка результата после внедрения
- Отправьте форму на странице с новым шорткодом.
- После отправки произойдет редирект на ту же страницу с параметром
?wpforms_submitted=1. - Появится сообщение об успешной отправке.
- Обновите страницу браузера — форма не отправится повторно, так как запрос теперь GET.
Частые ошибки и как их исправить
- Редирект не работает (белый экран или ошибка): Проверьте, что вызов
wp_safe_redirect()происходит до вывода любого контента. Код должен быть вfunctions.phpили плагине, без пробелов и вывода до редиректа. - ID формы указан неверно: Убедитесь, что
$target_form_idсовпадает с ID вашей формы WPForms. - Параметр
wpforms_submittedконфликтует с другими параметрами страницы: можно изменить имя параметра, например, наform_sent, и поправить код соответственно.
Практические советы по безопасности и производительности
- Используйте
wp_safe_redirect()вместоwp_redirect()для безопасности редиректа. - Не храните состояние отправки формы в сессиях или куках — это усложняет логику и может вызвать ошибки.
- Если у вас несколько форм на странице, реализуйте редирект для каждой через проверку ID формы.
- Для многошаговых форм PRG паттерн нужно настраивать с учётом логики переходов между шагами.
Сравнение вариантов решения
| Способ | Плюсы | Минусы |
|---|---|---|
| Использование PRG с редиректом | Надежно предотвращает повторную отправку; прост в реализации; совместим с WPForms | Требует изменения шаблона (шорткода); дополнительный HTTP-запрос |
| AJAX-отправка формы с блокировкой кнопки | Нет перезагрузки страницы; мгновенная реакция | Сложнее реализовать; не всегда устраняет проблему при обновлении страницы полностью |
| Использование сессий/куков | Можно хранить состояние | Увеличивает нагрузку; сложно настроить корректно; возможны ошибки |