Как создать защищённый формуляр обработки данных в WordPress

В современных проектах на WordPress часто возникает необходимость создавать формы для сбора данных пользователей — будь то формы обратной связи, регистрации, подписки или кастомные формы для специфических задач. При этом очень важно обеспечить безопасность обработки данных, чтобы избежать уязвимостей, таких как CSRF, XSS и SQL-инъекции. В этой статье мы подробно рассмотрим, как создать защищённый формуляр обработки данных в WordPress с использованием собственных функций и API платформы.

Основы создания форм в WordPress: ключевые моменты безопасности

Формы в WordPress можно создавать разными способами: с помощью плагинов, через шорткоды, напрямую в шаблонах тем или в плагинах. Но в любом случае необходимо учитывать несколько важных аспектов безопасности:

  • Использование nonce — специальных защитных кодов, предотвращающих CSRF-атаки.
  • Очистка и валидация пользовательских данных перед сохранением или выводом.
  • Правильное использование функций WordPress для работы с базой данных.
  • Безопасный вывод данных с экранированием HTML и специальных символов.

Далее мы создадим пример защищённой формы с нуля, используя нонсы и функции очистки данных.

Создание формы обратной связи с защитой: пошаговое руководство

Для примера создадим простую форму обратной связи с полями «Имя», «Email» и «Сообщение». Форма будет выводиться через шорткод, а данные обрабатываться в функции, зарегистрированной на hook admin_post_nopriv и admin_post. Это стандартный способ обработки POST-запросов в WordPress.

Шаг 1. Создаём шорткод для вывода формы

Добавим в файл functions.php вашей темы или в плагин следующий код:

function wpma_render_contact_form() {
    ob_start();
    ?>
    <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="POST">
        <?php wp_nonce_field('wpma_contact_form_action', 'wpma_contact_form_nonce'); ?>
        <p>
            <label for="wpma_name">Имя:</label><br>
            <input type="text" id="wpma_name" name="wpma_name" required>
        </p>
        <p>
            <label for="wpma_email">Email:</label><br>
            <input type="email" id="wpma_email" name="wpma_email" required>
        </p>
        <p>
            <label for="wpma_message">Сообщение:</label><br>
            <textarea id="wpma_message" name="wpma_message" rows="5" required></textarea>
        </p>
        <input type="hidden" name="action" value="wpma_handle_contact_form">
        <p><input type="submit" value="Отправить"></p>
    </form>
    <?php
    return ob_get_clean();
}
add_shortcode('wpma_contact_form', 'wpma_render_contact_form');

Здесь мы создаём форму, которая отправляет POST-запрос на admin-post.php с параметром action=wpma_handle_contact_form. Также используем функцию wp_nonce_field для добавления защищённого nonce.

Шаг 2. Обработка данных формы с проверкой nonce и валидацией

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

function wpma_handle_contact_form() {
    // Проверяем nonce
    if (!isset($_POST['wpma_contact_form_nonce']) || !wp_verify_nonce($_POST['wpma_contact_form_nonce'], 'wpma_contact_form_action')) {
        wp_die('Ошибка безопасности: неверный проверочный код.');
    }

    // Чистим и валидируем данные
    $name = sanitize_text_field($_POST['wpma_name'] ?? '');
    $email = sanitize_email($_POST['wpma_email'] ?? '');
    $message = sanitize_textarea_field($_POST['wpma_message'] ?? '');

    if (empty($name) || empty($email) || empty($message) || !is_email($email)) {
        wp_die('Пожалуйста, заполните форму корректно.');
    }

    // Здесь можно сохранить данные в базу, отправить письмо или выполнить другое действие
    $to = get_option('admin_email');
    $subject = 'Новое сообщение с сайта';
    $headers = ['Content-Type: text/html; charset=UTF-8', 'From: ' . $name . ' <' . $email . '>'];
    $body = '<p><strong>Имя:</strong> ' . esc_html($name) . '</p>' .
            '<p><strong>Email:</strong> ' . esc_html($email) . '</p>' .
            '<p><strong>Сообщение:</strong><br>' . nl2br(esc_html($message)) . '</p>';

    wp_mail($to, $subject, $body, $headers);

    wp_redirect(home_url('/thank-you/'));
    exit;
}
add_action('admin_post_nopriv_wpma_handle_contact_form', 'wpma_handle_contact_form');
add_action('admin_post_wpma_handle_contact_form', 'wpma_handle_contact_form');

Здесь мы:

  • Проверяем nonce для защиты от CSRF.
  • Очистили и проверили поля с помощью функций WordPress: sanitize_text_field, sanitize_email, sanitize_textarea_field и is_email.
  • Отправляем письмо администратору сайта через wp_mail с корректными заголовками.
  • Перенаправляем пользователя на страницу благодарности.

Дополнительные меры безопасности и улучшения

Использование reCAPTCHA для защиты от спама

Чтобы уменьшить вероятность отправки спам-запросов, можно интегрировать Google reCAPTCHA. Для этого потребуется добавить на форму виджет reCAPTCHA и проверить ответ на сервере. Это значительно повысит безопасность и качество собранных данных.

Пример простого подключения reCAPTCHA v2:

  • В форме добавьте перед кнопкой submit: <div class="g-recaptcha" data-sitekey="ВАШ_SITE_KEY"></div>
  • Подключите скрипт в футере: <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  • В обработчике добавьте проверку ответа с помощью wp_remote_post к API Google.

Сохранение данных в базе с использованием $wpdb

Если нужно сохранить данные в собственной таблице, лучше использовать объект $wpdb для безопасного взаимодействия с базой данных:

global $wpdb;
$table = $wpdb->prefix . 'wpma_contacts';
$wpdb->insert(
    $table,
    [
        'name' => $name,
        'email' => $email,
        'message' => $message,
        'created_at' => current_time('mysql')
    ],
    ['%s', '%s', '%s', '%s']
);

Перед этим необходимо создать таблицу при активации плагина или темы.

Рекомендуемые плагины для создания и защиты форм в WordPress

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

  • Contact Form 7 — мощный и гибкий, поддерживает интеграцию с reCAPTCHA и различные расширения.
  • WPForms — удобный конструктор форм с защитой от спама и интеграцией с почтовыми сервисами.
  • Gravity Forms — премиум-решение с расширенными возможностями и встроенными мерами безопасности.

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

Итоговые рекомендации по безопасности форм WordPress

Подводя итоги, чтобы создать защищённый формуляр обработки данных в WordPress, обязательно:

  • Используйте nonce для защиты от CSRF.
  • Очищайте и валидируйте все входящие данные с помощью встроенных функций WordPress.
  • Используйте безопасные методы работы с базой данных через $wpdb или API WordPress.
  • Экранируйте пользовательские данные при выводе.
  • Рассмотрите интеграцию систем антиспама, например reCAPTCHA.
  • При возможности используйте проверенные плагины, но не забывайте контролировать безопасность.
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
03.06.2026
Как использовать WP-Cron для автоматизации задач в WordPress
26.04.2026
WooCommerce: устранение проблем с корзиной и оплатой на WordPress
04.05.2026
Как автоматически удалить неиспользуемые шорткоды в WordPress
15.03.2026
WooCommerce: установка отзывов после покупки с автоподтверждением
20.04.2026