Contact Form 7: отправка формы через REST API с авторизацией в WordPress

Диагностика задачи: зачем отправлять форму 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Быстрая настройкаМогут быть избыточны, не всегда поддерживают авторизацию

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

⭐⭐⭐⭐⭐
Contact Form 7: универсальные хуки для расширения функциональности
11.01.2026
Contact Form 7: как добавить внутреннюю валидацию на PHP для защиты и гибкости
05.12.2025
Contact Form 7: как создать многоступенчатую форму в WordPress
27.12.2025
Contact Form 7: как автоматически очищать форму после успешной отправки
20.04.2026
Contact Form 7 и отправка данных на внешний сервер через REST API
10.03.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙