Contact Form 7 дублирует отправку и создаёт два сообщения: как найти причину и исправить

Если Contact Form 7 после отправки создаёт два одинаковых сообщения, проблема почти всегда не в самом плагине, а в связке из темы, кэша, JavaScript-обработчиков или дополнительной интеграции. На практике дубли появляются после обновления темы, установки оптимизатора скриптов, подключения reCAPTCHA, вебхуков или кастомного кода в functions.php.

Ниже — рабочая схема, которая помогает не гадать, а быстро сузить источник. Сначала разберём, как понять, где именно возникает дубль, потом — что менять в коде и настройках, и как проверить, что исправление действительно сработало.

Как выглядит проблема и где её искать

Типичный сценарий такой: пользователь нажимает кнопку отправки один раз, форма визуально уходит в состояние отправки, а затем:

  • письмо приходит дважды;
  • в CRM создаются две одинаковые заявки;
  • в консоли браузера видно, что обработчик срабатывает повторно;
  • после отправки страница перезагружается, и форма отправляется ещё раз;
  • в логах сервера есть два POST-запроса к одному и тому же endpoint.

Сначала важно понять, это действительно двойная отправка формы или двойная обработка одного и того же события на стороне интеграции. Это разные проблемы, и лечатся они по-разному.

Быстрая диагностика в браузере

Откройте DevTools и проверьте вкладку Network. После нажатия на отправку у Contact Form 7 обычно должен быть один AJAX-запрос. Если вы видите два одинаковых запроса подряд, значит форма или скрипт инициализируются повторно.

Полезно также временно отключить оптимизацию JS в плагинах кеша. Если дубли исчезли, причина почти наверняка в объединении, отложенной загрузке или повторной инициализации скриптов.

Пошаговое решение: от простого к точному

1. Проверьте, не дублируется ли сам блок формы

Иногда форму вставляют дважды: один раз через шорткод в контенте и второй раз через шаблон темы. Это особенно часто встречается в кастомных шаблонах, где разработчик добавил do_shortcode() и одновременно оставил блок в редакторе.

Проверьте:

  • нет ли одного и того же шорткода в контенте и в шаблоне;
  • не выводится ли форма через хук темы и через Gutenberg-блок одновременно;
  • не подключается ли один и тот же шаблон в нескольких местах страницы.

2. Отключите конфликтующие оптимизации JavaScript

Если используется кеширующий плагин, временно выключите для проверки:

  • объединение JS-файлов;
  • отложенную загрузку скриптов;
  • defer/async для скриптов формы;
  • lazy load для inline-инициализации.

У Contact Form 7 есть собственные скрипты, и их агрессивная оптимизация часто приводит к повторной инициализации обработчиков. Если после отключения оптимизации проблема пропала, дальше уже можно точечно исключать нужные файлы из обработки.

3. Проверьте сторонние обработчики submit

Дубли часто создают кастомные скрипты, которые слушают событие submit на форме и одновременно вызывают стандартную отправку. Например, разработчик добавил в тему свой обработчик аналитики и случайно вызывает form.submit() после preventDefault().

Если у вас есть кастомный JS, ищите код, который:

  • вешается на document вместо конкретной формы;
  • использует submit без проверки, что форма уже отправляется;
  • вызывает click() на кнопке отправки;
  • повторно инициализируется после AJAX-подгрузки.
document.addEventListener('submit', function (e) {
  const form = e.target;
  if (!form.classList.contains('wpcf7-form')) return;

  // Плохой пример: здесь нельзя вызывать form.submit() без крайней необходимости.
  // Это легко создаёт повторную отправку.
});

4. Проверьте интеграции: CRM, вебхуки, почта, аналитика

Если сама форма отправляется один раз, а дубли появляются уже в CRM или в почтовом сервисе, проблема может быть в повторной обработке webhook-события. Частая ошибка — один и тот же endpoint принимает и wpcf7mailsent, и серверный POST, а затем создаёт две записи.

Проверьте, не отправляете ли вы данные одновременно:

  • через JavaScript-событие wpcf7mailsent;
  • через серверный хук wpcf7_before_send_mail;
  • через отдельный webhook-плагин;
  • через интеграцию в CRM-плагине.

Если интеграция уже есть в двух местах, оставьте только один канал. Для заявок надёжнее серверная отправка, а JS-события лучше использовать только для аналитики и UI-логики.

Как убрать дубли на уровне кода

Если причина в кастомной интеграции, добавьте защиту от повторной обработки. Самый простой вариант — проверять, не отправляли ли уже заявку с тем же набором данных в рамках одного запроса. Ниже пример для серверной логики.

add_action('wpcf7_before_send_mail', function ($contact_form) {
    if (!class_exists('WPCF7_Submission')) {
        return;
    }

    $submission = WPCF7_Submission::get_instance();
    if (!$submission) {
        return;
    }

    $data = $submission->get_posted_data();

    // Пример простой защиты от повторной обработки в рамках одного запроса.
    static $processed = false;
    if ($processed) {
        return;
    }
    $processed = true;

    // Здесь ваша логика: запись в CRM, webhook, логирование и т.д.
    // Не вызывайте отправку повторно из другого хука для тех же данных.
});

Если дубли возникают из-за повторного клика по кнопке, можно временно блокировать кнопку после первого нажатия. Это не лечит первопричину, но помогает убрать двойные отправки, пока вы чините JS-конфликт.

document.addEventListener('wpcf7submit', function (event) {
  const form = event.target;
  const button = form.querySelector('input[type="submit"], button[type="submit"]');
  if (button) {
    button.disabled = true;
  }
});

Этот вариант стоит применять аккуратно: если отправка не удалась, кнопку нужно снова включить. Поэтому в реальном проекте лучше обрабатывать и события ошибки, а не просто отключать элемент навсегда.

Сравнение подходов: что быстрее помогает

ПодходКогда использоватьМинус
Отключить JS-оптимизациюЕсли дубли появились после кеша или минификацииНе решает проблему, если виноват кастомный код
Проверить шаблон и шорткодЕсли форма выводится в нескольких местахНужно руками смотреть тему и шаблоны
Убрать двойную интеграциюЕсли дубли только в CRM или почтеНадо понимать, где именно создаётся запись
Добавить защиту в кодЕсли есть собственный webhook или обработчикНе исправляет конфликт плагинов

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

После исправления не ограничивайтесь одним тестом. Проверьте проблему в нескольких сценариях:

  • отправка с обычной страницы;
  • отправка после очистки кеша браузера;
  • отправка в режиме инкогнито;
  • отправка на мобильном устройстве;
  • отправка после включения кеш-плагина обратно.

Что именно смотреть:

  • в Network должен быть один запрос на отправку;
  • в CRM должна создаваться одна запись;
  • почта должна приходить один раз;
  • в консоли не должно быть повторной инициализации скриптов формы;
  • если есть логирование, в нём не должно быть двух одинаковых событий подряд.

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

Форма отправляется дважды только на продакшене

Обычно это признак кеша, CDN или оптимизатора скриптов. На локальной среде всё работает, потому что там нет объединения JS и агрессивного defer. Сравните настройки окружений и исключите скрипты Contact Form 7 из оптимизации.

Дубли появляются только в CRM

Значит, форма уходит один раз, а интеграция создаёт две записи. Проверьте, не срабатывают ли одновременно JS-событие и серверный хук. Оставьте один источник данных.

После отправки страница перезагружается и форма уходит повторно

Это часто связано с темой: кнопка submit находится внутри <form>, но рядом есть ещё один обработчик, который делает location.reload() или отправляет форму повторно. Уберите лишний JS и проверьте, не вмешивается ли скрипт попапа, слайдера или аналитики.

Проблема исчезает после отключения плагина кеша

Тогда не нужно оставлять сайт без оптимизации. Лучше точечно исключить файлы Contact Form 7 из минификации и defer. Это безопаснее, чем отключать кеш целиком.

Что делать для безопасности и стабильности

Если форма принимает заявки с персональными данными, не отправляйте их в сторонние сервисы без необходимости. Любая лишняя интеграция — это ещё одна точка отказа и ещё один канал утечки. Для критичных форм лучше использовать серверную обработку, а не только JS-события.

Ещё один практический момент: не храните в коде формы секреты API. Если нужен webhook или токен CRM, передавайте его через защищённые серверные настройки, а не через фронтенд-скрипт. И не забывайте проверять, что кастомный код не выполняется дважды после AJAX-подгрузки страницы.

Если вы регулярно упираетесь в конфликты Contact Form 7, имеет смысл отдельно проверить, не создаёт ли лишние дубли ваш набор SEO- и cleanup-настроек. В проектах с большим количеством форм иногда помогает аккуратная чистка лишних скриптов и дублей через инструменты вроде Clearfy Pro, но только после проверки, что проблема действительно в мусорной обвязке, а не в логике формы.

Короткий чек-лист перед финальным релизом

  • Проверить, что форма выводится один раз.
  • Отключить JS-оптимизацию и сравнить поведение.
  • Убедиться, что нет двойной интеграции в CRM или webhook.
  • Проверить кастомные обработчики submit и wpcf7mailsent.
  • Протестировать отправку в инкогнито и на мобильном.
  • Снова включить кеш и убедиться, что дубль не вернулся.

Если после всех проверок проблема остаётся, значит, источник почти наверняка в конкретной теме или плагине, который повторно инициализирует форму. В таком случае проще изолировать конфликт на тестовой копии сайта, чем пытаться лечить его вслепую на продакшене.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Contact Form 7 отправляет пустые заявки: как отсечь пустые поля и спам-боты
25.08.2026
Contact Form 7 не отправляет письма: как убрать спам и настроить SMTP
22.08.2026
Contact Form 7 дублирует отправку и создаёт два сообщения: как найти причину и исправить
19.08.2026
Как запретить отправку Contact Form 7 на один и тот же email дважды
03.09.2026
Contact Form 7: как запретить отправку формы без согласия на обработку данных
31.08.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше