Если форма WPForms визуально отправляется, но после клика пользователь видит ошибку 403 или 500, проблема обычно не в самой форме. Чаще ломается один из слоёв вокруг неё: REST/AJAX-запрос, безопасность сервера, конфликт плагина, PHP-ошибка в обработчике или кэш, который подменяет ответ.
Ниже — рабочий порядок диагностики и исправления. Он подходит для обычной формы обратной связи, формы заявки и любых сценариев, где WPForms отправляет данные без перезагрузки страницы.
Как понять, где именно ломается отправка
Сначала нужно отделить проблему фронтенда от проблемы сервера. Ошибка 403 обычно означает, что запрос заблокирован на уровне безопасности, а 500 — что PHP-код на стороне WordPress или хостинга падает с фатальной ошибкой.
Что проверить в браузере
Откройте страницу с формой, нажмите F12 и перейдите во вкладку Network. Отправьте форму и найдите запрос, связанный с WPForms. Если в ответе виден статус 403, 500 или HTML-страница ошибки вместо JSON, это уже полезная зацепка.
- 403 — блокировка WAF, mod_security, плагином безопасности или правилом сервера.
- 500 — PHP fatal error, нехватка памяти, несовместимый код в теме или плагине.
- 200, но форма не отправляется — часто проблема в JavaScript или в некорректном ответе сервера.
Что проверить в логах WordPress и сервера
Если у вас включён лог ошибок WordPress, посмотрите wp-content/debug.log. Для временной диагностики можно включить отладку в wp-config.php:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );После повторной отправки формы откройте лог и ищите фатальные ошибки, предупреждения о несовместимых функциях, вызовы сторонних плагинов или темы. На хостинге полезно посмотреть и error log веб-сервера: там часто видно, что именно заблокировало запрос.
Почему WPForms получает 403
403 почти всегда связан не с WPForms как таковым, а с защитой сайта. На практике чаще всего мешают:
- плагин безопасности, который режет AJAX или REST-запросы;
- правила
mod_securityна хостинге; - WAF/CDN, который считает запрос подозрительным;
- жёсткие правила в
.htaccessили nginx-конфиге; - кэш/оптимизация, которые ломают nonce или подменяют ответ.
Если ошибка появляется только у незалогиненных пользователей, а в админке всё работает, это особенно похоже на блокировку на уровне защиты или CDN.
Как быстро исключить блокировку безопасности
Временно отключите плагины, которые фильтруют трафик: Wordfence, iThemes Security, All In One Security и похожие. Если после этого форма начинает отправляться, не оставляйте сайт без защиты — нужно добавить исключение для AJAX/REST-запросов WPForms или ослабить конкретное правило, а не выключать весь плагин.
На стороне хостинга попросите проверить логи mod_security. Для некоторых установок достаточно добавить исключение для конкретного URI, но это зависит от панели и провайдера.
Почему WPForms даёт 500 и как найти фатальную ошибку
500 — это уже не блокировка, а падение кода. Частый сценарий: в теме или в одном из плагинов есть хук, который срабатывает во время отправки формы и вызывает ошибку. Иногда виноват фильтр, который ожидает массив, а получает строку, или обращение к несуществующему объекту.
Если ошибка появилась после обновления темы, плагина или PHP, начните с отката последнего изменения в staging-копии. На живом сайте лучше не экспериментировать вслепую.
Минимальный тест без лишних факторов
Чтобы понять, виноват ли код темы, временно переключитесь на стандартную тему и отключите все плагины, кроме WPForms. Если форма отправляется, включайте плагины по одному и повторяйте тест. Это скучно, но быстрее, чем искать ошибку в абстрактном “конфликте”.
Если нужен более формальный способ, можно проверить, не ломает ли запрос сторонний код через временный лог в functions.php или в небольшом mu-plugin. Например, так можно отследить, доходит ли выполнение до вашего обработчика:
add_action( 'wpforms_process_complete', function( $fields, $entry, $form_data, $entry_id ) {
error_log( 'WPForms submit: form_id=' . ( $form_data['id'] ?? 'unknown' ) );
}, 10, 4 );Если строка в лог не попадает, значит ошибка происходит раньше — на уровне AJAX-запроса, валидации или блокировки сервера. Если лог есть, а дальше падает 500, ищите код, который выполняется в других хуках WPForms или в подключённых сервисах.
Пошаговое решение: что делать в правильном порядке
Ниже порядок, который обычно экономит время. Не начинайте с правки формы — сначала уберите внешние причины.
- Проверьте статус ответа в
Network. - Посмотрите
debug.logи error log сервера. - Временно отключите плагины безопасности и оптимизации.
- Очистите кэш страницы, CDN и серверный кэш.
- Проверьте форму на стандартной теме.
- Если ошибка остаётся, ищите фатал в хуках и кастомном коде.
Если у вас включён кэш HTML-страниц, убедитесь, что страница с формой не отдаёт устаревший nonce или старый JS. Для форм это критично: пользователь видит свежую страницу, а запрос уходит с уже невалидными данными.
Когда помогает исключение из кэша
Исключите страницу с формой из кэширования на уровне плагина, сервера или CDN. Если форма встроена в общий шаблон, иногда проще исключить весь шаблонный URL, чем пытаться точечно лечить отдельный блок.
Если у вас есть возможность, проверьте форму в режиме инкогнито и после очистки всех уровней кэша. Это помогает отличить реальную серверную ошибку от проблемы с устаревшей страницей.
Сравнение подходов: что быстрее в реальной работе
| Подход | Когда использовать | Плюс | Минус |
|---|---|---|---|
| Отключить плагины по одному | Если ошибка появилась после изменений | Быстро выявляет конфликт | Требует времени и тестов |
| Проверить логи | Если есть 500 или белый экран | Даёт точную причину | Нужно уметь читать ошибки |
| Исключить страницу из кэша | Если проблема плавающая | Убирает nonce и stale JS | Не лечит фатальные ошибки |
Как проверить, что исправление сработало
После каждого изменения отправьте форму минимум в двух сценариях: в обычном окне браузера и в инкогнито. Смотрите не только визуальный результат, но и ответ запроса в Network.
- Статус ответа должен быть
200или ожидаемый код без ошибок. - В логах не должно быть новых fatal error.
- Письмо-уведомление должно приходить стабильно, если оно настроено.
- Запись формы должна появляться в админке WPForms без дублей и без пустых полей.
Если после исправления 403/500 форма отправляется, но уведомления не приходят, это уже отдельная проблема почты, а не AJAX-отправки. Не смешивайте эти сценарии в одну диагностику.
Частые ошибки и как их исправить
Отключили кэш, но ошибка осталась
Значит, кэш был не единственной причиной. Проверьте security-плагин, WAF и серверные правила. Часто блокировка сидит именно там.
Сайт работает, а форма падает только на одной странице
На этой странице может быть конфликтующий шорткод, виджет, скрипт или блок, который ломает JS. Сравните исходный код страницы и список подключённых скриптов.
500 появляется только после добавления кастомного кода
Почти всегда виноват хук, который обращается к несуществующему индексу, объекту или функции. Уберите код, затем добавляйте его обратно частями.
403 возникает только на мобильных или в определённой сети
Это похоже на блокировку CDN, антибот-фильтра или правила по IP/географии. Смотрите логи внешнего сервиса, а не только WordPress.
Что стоит держать под контролем после исправления
Чтобы проблема не вернулась, полезно оставить базовую диагностику в рабочем наборе. Для сайта с формами это не роскошь, а нормальная эксплуатация.
- не обновлять плагины и тему без проверки формы на staging;
- не включать агрессивную оптимизацию JS без теста AJAX-отправки;
- не оставлять страницу формы в кэше, если там используется динамический nonce;
- следить за логами после обновлений PHP и плагинов безопасности.
Если на сайте много технических дублей, тяжёлых скриптов и лишнего мусора в шаблонах, имеет смысл отдельно почистить фронтенд и SEO-обвязку. В таких задачах полезны инструменты уровня Clearfy Pro, но только если вы понимаете, что именно отключаете и зачем.