Диагностика задачи: зачем создавать REST API эндпоинты для Contact Form 7
Contact Form 7 по умолчанию отправляет данные через стандартную форму на сайте, чаще всего на email. Но в проектах с нестандартной архитектурой, SPA или мобильных приложениях часто требуется отправлять данные формы напрямую на REST API WordPress, чтобы дальше обрабатывать их программно или интегрировать с внешними сервисами.
Проблема в том, что стандартный Contact Form 7 не предоставляет готовые REST API эндпоинты для отправки. Нужно самостоятельно создать кастомные маршруты, которые примут данные, валидируют их через Contact Form 7 API и вернут корректный ответ.
Шаг 1: регистрация кастомного REST API эндпоинта
Для начала создадим эндпоинт в WordPress с помощью register_rest_route. В этом примере endpoint будет принимать POST запросы с данными формы.
add_action('rest_api_init', function () {
register_rest_route('cf7/v1', '/submit-form', [
'methods' => 'POST',
'callback' => 'cf7_api_submit_form',
'permission_callback' => '__return_true',
]);
});Здесь мы создаём маршрут /wp-json/cf7/v1/submit-form.
Шаг 2: обработка данных формы через API Contact Form 7
В callback-функции cf7_api_submit_form нужно получить данные из запроса, найти нужную форму по ID и запустить её валидацию и отправку.
function cf7_api_submit_form(WP_REST_Request $request) {
$params = $request->get_json_params();
if (empty($params['form_id'])) {
return new WP_REST_Response(['error' => 'form_id is required'], 400);
}
$form_id = intval($params['form_id']);
$contact_form = WPCF7_ContactForm::get_instance($form_id);
if (!$contact_form) {
return new WP_REST_Response(['error' => 'Form not found'], 404);
}
// Подготавливаем данные POST для CF7
$_POST = [];
if (!empty($params['fields']) && is_array($params['fields'])) {
foreach ($params['fields'] as $key => $value) {
$_POST[$key] = sanitize_text_field($value);
}
}
// Запускаем валидацию и отправку
$result = $contact_form->submit();
if ($result['status'] === 'mail_sent') {
return new WP_REST_Response(['message' => 'Form submitted successfully'], 200);
} else {
// Возвращаем ошибки валидации
return new WP_REST_Response(['error' => $result['message']], 422);
}
}Важно: функция submit() Contact Form 7 запускает всю логику обработки формы, включая валидацию, хук на отправку письма и прочее.
Шаг 3: тестирование REST API эндпоинта
Для проверки используйте curl или Postman. Пример запроса:
curl -X POST https://your-site.ru/wp-json/cf7/v1/submit-form \
-H "Content-Type: application/json" \
-d '{
"form_id": 1234,
"fields": {
"your-name": "Иван",
"your-email": "ivan@example.com",
"your-message": "Тестовое сообщение"
}
}'Ответ должен быть JSON с сообщением об успехе или ошибке.
Чек-лист для успешной интеграции REST API с Contact Form 7
- Получить ID формы Contact Form 7, которую хотите использовать
- Создать и зарегистрировать кастомный REST API endpoint
- В callback-функции подготовить
$_POSTиз данных запроса - Вызвать метод
submit()объекта формы для обработки - Вернуть понятный JSON с результатом
- Проверить корректность полей и выявить ошибки валидации
Частые ошибки и их исправление
Ошибка: форма не найдена (404)
Проверьте, что передаете правильный form_id. Его можно узнать в админке WordPress в разделе Contact Form 7.
Ошибка: валидация не проходит, но данные корректные
Contact Form 7 ждет поля с определенными именами, соответствующими форме. Проверьте, что ключи в fields совпадают с именами полей в форме.
Ошибка: письма не отправляются
Проверьте почтовую конфигурацию WordPress, SMTP настройки и логи ошибок сервера.
Практические советы по безопасности и производительности
- В
permission_callbackможно реализовать проверку nonce или авторизации, если API не публичный. - Используйте
sanitize_text_fieldили другие функции очистки для входящих данных. - Ограничьте частоту запросов к эндпоинту через плагины типа Rate Limiting или на уровне сервера.
- Кешируйте результаты, если форма не требует мгновенного обновления.
Сравнение вариантов реализации REST API для Contact Form 7
| Вариант | Плюсы | Минусы |
|---|---|---|
| Кастомный REST API эндпоинт (как в статье) | Полный контроль, гибкость, интеграция с любыми клиентами | Требует программирования, тестирования, поддержки |
| Использование плагинов интеграции (Webhook, интеграции) | Простота настройки, готовые решения | Меньше контроля, может не подходить под специфичные задачи |
| Отправка через AJAX стандартным методом CF7 | Простота, не требует API | Ограничена фронтендом, сложно интегрировать с внешними системами |