wp-kurs.ru wordpress WP-Kurs

Как избежать повторной отправки формы в WordPress после обновления страницы

Проблема повторной отправки формы в WordPress

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

Почему возникает повторная отправка

  • Метод отправки формы — POST, при обновлении страницы браузер повторяет POST-запрос.
  • Отсутствие перенаправления после обработки формы.
  • Отсутствие защиты от двойного клика на кнопку отправки.

Диагностика проблемы на WordPress

Чтобы подтвердить, что повторная отправка вызвана именно обновлением страницы, можно проверить:

  • Появление дубликатов данных (записи, комментарии, заказы) сразу после перезагрузки страницы с формой.
  • В консоли браузера — повторение POST-запроса при обновлении.
  • Отсутствие редиректа после обработки формы в коде темы или плагина.

Пошаговое решение: применение паттерна POST/Redirect/GET (PRG)

Основная практика — после обработки данных формы сделать редирект на страницу с GET-запросом, чтобы при обновлении страницы браузер не повторял POST.

1. Обработка формы и сохранение данных

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['my_form_nonce'])) {
    if (! wp_verify_nonce($_POST['my_form_nonce'], 'my_form_action')) {
        wp_die('Ошибка безопасности');
    }
    // Сохраняем данные, например, в пользовательские мета, посты или отправляем email
    $name = sanitize_text_field($_POST['name']);
    $email = sanitize_email($_POST['email']);
    // ... обработка данных

    // После обработки делаем редирект
    wp_redirect(add_query_arg('form_submitted', '1', get_permalink()));
    exit;
}

2. Вывод сообщения об успешной отправке

if (isset($_GET['form_submitted']) && $_GET['form_submitted'] == '1') {
    echo '<div class="notice-success">Форма успешно отправлена.</div>';
}

3. Добавление nonce и метод POST в форме

<form method="post" action="">
    <input type="text" name="name" required>
    <input type="email" name="email" required>
    <input type="hidden" name="my_form_nonce" value="<?php echo wp_create_nonce('my_form_action'); ?>">
    <button type="submit">Отправить</button>
</form>

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

  • Отправьте форму, убедитесь, что после отправки происходит редирект и отображается сообщение об успехе.
  • Обновите страницу — повторной отправки данных не происходит, дубликатов нет.
  • Проверьте в базе данных, что записи не повторяются.

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

  • Отсутствие exit после wp_redirect() — редирект не срабатывает, браузер продолжает выполнять скрипт, возможны неожиданные ошибки. Обязательно добавляйте exit; после wp_redirect().
  • Неправильный nonce — форма не проходит проверку безопасности, данные не сохраняются. Используйте wp_create_nonce и wp_verify_nonce.
  • Редирект на страницу с POST-запросом — если URL редиректа содержит параметры, которые влияют на метод запроса, убедитесь, что вы используете GET-параметры, а не POST.
  • Двойное нажатие на кнопку отправки — можно предотвратить с помощью JavaScript, отключая кнопку после первого клика.

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

  • Всегда очищайте и валидируйте входящие данные с помощью sanitize_text_field, sanitize_email и подобных функций.
  • Используйте wp_nonce_field() для упрощения добавления nonce в форму.
  • Для предотвращения повторной отправки при двойном клике добавьте простой JavaScript:
document.querySelector('form').addEventListener('submit', function() {
    this.querySelector('button[type="submit"]').disabled = true;
});

Сравнение способов предотвращения повторной отправки формы

МетодПреимуществаНедостатки
POST/Redirect/GET (PRG)Прост в реализации, совместим со всеми браузерами, минимальный риск дублированияТребует дополнительного редиректа, может немного увеличить время отклика
JavaScript блокировка кнопкиУлучшает UX, снижает риск двойного кликаЗависит от включенного JS, не решает проблему при обновлении страницы
Использование уникальных токенов в формеГарантирует уникальность каждой отправкиСложнее реализовать, требует хранения токенов
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙