Диагностика задачи: зачем отправлять форму Contact Form 7 через REST API с авторизацией
Обычная отправка формы Contact Form 7 происходит через AJAX-запросы на сервер WordPress с использованием стандартных механизмов. Но в ряде случаев требуется интегрировать форму с внешними сервисами или мобильными приложениями, которые должны отправлять данные по REST API, и при этом контролировать, чтобы отправка была доступна только авторизованным пользователям. Contact Form 7 из коробки не поддерживает REST API для обработки форм с авторизацией. В этой статье разберем, как реализовать такой функционал безопасно и эффективно.
Как проверить необходимость решения
- Требуется интеграция с внешним веб-клиентом или мобильным приложением, которое не может использовать AJAX Contact Form 7.
- Нужно, чтобы отправка формы была доступна только зарегистрированным и авторизованным пользователям WordPress.
- Необходимо контролировать доступ через токен или куки авторизации, а не через обычный HTML-формат.
Если эти пункты совпадают с вашими задачами, можно переходить к реализации.
Пошаговое решение: создаем REST API endpoint для Contact Form 7 с проверкой авторизации
1. Регистрируем REST API маршрут
В файле functions.php вашей темы или в кастомном плагине добавьте следующий код:
add_action('rest_api_init', function () {
register_rest_route('cf7/v1', '/submit/(?P<form_id>\d+)', [
'methods' => 'POST',
'callback' => 'cf7_rest_submit_form',
'permission_callback' => function () {
return is_user_logged_in();
},
]);
});Объяснение:
- Маршрут
/wp-json/cf7/v1/submit/{form_id}принимает ID формы Contact Form 7. - Метод
permission_callbackпроверяет, что пользователь авторизован.
2. Обрабатываем данные формы и вызываем Contact Form 7 для отправки
Функция-обработчик cf7_rest_submit_form принимает данные из POST-запроса, создает объект формы и вызывает стандартные методы Contact Form 7 для валидации и отправки письма.
function cf7_rest_submit_form(WP_REST_Request $request) {
$form_id = absint($request->get_param('form_id'));
$form = WPCF7_ContactForm::get_instance($form_id);
if (! $form) {
return new WP_REST_Response(['message' => 'Форма не найдена'], 404);
}
$data = $request->get_json_params();
// Формируем массив с данными, как если бы они пришли из $_POST
$submission_data = [];
foreach ($data as $key => $value) {
$submission_data[$key] = sanitize_text_field($value);
}
// Создаем объект отправки формы
$submission = WPCF7_Submission::get_instance();
$submission->set_posted_data($submission_data);
// Запускаем валидацию
$result = $form->validate($submission_data);
if (! $result) {
return new WP_REST_Response(['message' => 'Ошибка валидации данных'], 422);
}
// Отправляем письмо
$mail_sent = $form->submit();
if ($mail_sent) {
return new WP_REST_Response(['message' => 'Форма успешно отправлена'], 200);
} else {
return new WP_REST_Response(['message' => 'Ошибка отправки письма'], 500);
}
}3. Отправка запроса с клиента
Для проверки можно использовать curl или Postman. Пример curl-запроса с авторизацией через куки (пользователь должен быть залогинен):
curl -X POST https://example.com/wp-json/cf7/v1/submit/123 \
-H "Content-Type: application/json" \
-b "wordpress_logged_in_HASH=your_cookie_value" \
-d '{"your-name":"Иван","your-email":"ivan@example.com","your-message":"Тестовое сообщение"}'Проверка результата после внедрения
Чтобы убедиться, что все работает:
- Отправьте тестовый запрос с корректными данными и авторизацией — получите ответ 200 и сообщение об успешной отправке.
- Попробуйте отправить запрос без авторизации — должны получить ошибку 403 Forbidden.
- Отправьте запрос с некорректными данными — получите ошибку 422 с сообщением о валидации.
Частые ошибки и их исправление
- Ошибка 403 Forbidden — пользователь не авторизован. Проверьте, что в запросе передаются куки или заголовок авторизации WordPress.
- Ошибка 404 — форма с указанным ID не найдена. Убедитесь, что передаете правильный ID формы Contact Form 7.
- Ошибка 422 — данные не прошли валидацию. Проверьте формат полей, обязательные поля и используйте
sanitize_text_fieldдля очистки. - Ошибка 500 — внутренняя ошибка отправки письма. Проверьте настройки почты WordPress и SMTP, а также логи сервера.
Практические советы по безопасности и производительности
- Используйте
permission_callbackдля контроля доступа по авторизации. - Санитизируйте все входящие данные через
sanitize_text_fieldили более строгие фильтры при необходимости. - Ограничьте количество запросов к API для предотвращения DDOS-атак, например, с помощью плагина Limit Login Attempts или кастомных решений.
- Для повышения производительности кэшируйте ответы в случае частых повторяющихся запросов, если это возможно.
- Не отправляйте в ответе конфиденциальную информацию — только статус и сообщения.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Стандартная AJAX отправка CF7 | Использует встроенный механизм CF7 | Простота, поддержка всеми браузерами | Нет контроля авторизации, не подходит для внешних клиентов |
| REST API с авторизацией (как в статье) | Кастомный endpoint с проверкой пользователя | Безопасно, подходит для мобильных и внешних приложений | Требует дополнительного кода и настройки авторизации |
| Использование сторонних плагинов REST API | Плагины для расширения API CF7 | Быстрая настройка | Могут быть избыточны, не всегда поддерживают авторизацию |