Как настроить формы на WordPress

Как настроить формы на WordPress

За более 10 лет работы с WordPress-проектами я потерял счёт формам, которые настраивал для клиентов. И признаюсь честно: в начале карьеры я тоже терял заявки. Однажды клиент сообщил, что за две недели не получил ни одного обращения через сайт — форма отправляла письма, но они улетали в спам почтового сервера. С тех пор я разработал чёткую систему настройки форм, которой хочу поделиться.

Почему заявки теряются: главные причины

Прежде чем переходить к настройке, разберём типичные проблемы:

  1. Проблемы с отправкой почты — WordPress использует функцию wp_mail(), которая часто работает нестабильно на shared-хостингах
  2. Отсутствие резервного сохранения данных — если письмо не дошло, заявка просто теряется навсегда
  3. Неправильная валидация — боты и спам засоряют почту, из-за чего реальные заявки теряются в общем потоке
  4. Отсутствие уведомлений об ошибках — вы можете месяцами не знать, что форма не работает

Вариант 1: Настройка через плагины

Contact Form 7 + дополнительные модули

CF7 — самый популярный бесплатный плагин, но по умолчанию он не сохраняет заявки в базе данных. Это критическая ошибка многих разработчиков.

Мой алгоритм настройки форм:

  1. Устанавливаю CF7 и создаю форму с необходимыми полями;
  2. Обязательно добавляю плагин Flamingo — он сохраняет все отправленные формы в админке WordPress, даже если письмо не дошло;
  3. Настраиваю SMTP через плагин WP Mail SMTP, подключая реальный почтовый сервис (Gmail, Mailgun, и т.д.)
  4. Настраиваю дублирование уведомлений на дополнительный e-mail адрес

Преимущество этого стека: даже при полном отказе почты у вас останется резервная копия всех заявок в разделе Flamingo → Inbound Messages.

WPForms

Для клиентов с более серьёзными требованиями рекомендую WPForms Pro. Здесь встроена функция сохранения записей в базе данных без дополнительных плагинов.

Настройка:

  1. Создаю форму через drag-and-drop конструктор
  2. В настройках формы включаю раздел «Entries» — все заявки автоматически сохраняются
  3. Настраиваю логику для сложных форм (например, показ дополнительных полей при выборе определённой услуги)
  4. Интегрирую с CRM через встроенные коннекторы (AmoCRM, Bitrix24)
  5. Настраиваю уведомления через собственный SMTP-сервис плагина

Gravity Forms

Мой выбор для крупных корпоративных проектов. Стоит дороже, но окупается надёжностью.

Ключевые фишки:

  • Полное логирование всех отправок в базе данных
  • Условная логика любой сложности
  • Встроенная защита от спама без необходимости капчи

Вариант 2: Самописные формы

Когда клиенту нужна полная кастомизация или высокая производительность без лишних плагинов, я пишу формы вручную. Пример самописной формы с сохранением данных в БД

Добавляем в function.php вашей темы, код выполнится только при активации темы и добавит таблицу в БД:

function create_orders_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'form_orders';
    
    $charset_collate = $wpdb->get_charset_collate();
    
    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        name varchar(100) NOT NULL,
        email varchar(100) NOT NULL,
        phone varchar(50),
        message text,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        status varchar(20) DEFAULT 'new',
        PRIMARY KEY (id)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
add_action('after_switch_theme', 'create_orders_table');

Ключевой принцип: сначала сохраняем в БД, потом отправляем письмо. Если почта не сработает, заявка всё равно останется в системе.

function process_contact_form() {
    global $wpdb;
    
    // Проверка nonce для безопасности
    if (!wp_verify_nonce($_POST['form_nonce'], 'contact_form_action')) {
        wp_die('Проверка безопасности не пройдена!');
    }
    
    $name = sanitize_text_field($_POST['name']);
    $email = sanitize_email($_POST['email']);
    $message = sanitize_textarea_field($_POST['message']);
    
    // Шаг 1: Сохраняем в базу
    $table_name = $wpdb->prefix . 'form_orders';
    $wpdb->insert($table_name, array(
        'name' => $name,
        'email' => $email,
        'message' => $message,
        'created_at' => current_time('mysql')
    ));
    
    $order_id = $wpdb->insert_id;
    
    // Шаг 2: Отправка письма
    $sent = wp_mail(
        get_option('admin_email'),
        'Новая заявка №' . $order_id,
        $message,
        array('Content-Type: text/html; charset=UTF-8')
    );
    
    // Шаг 3: Логируем результат
    if (!$sent) {
        error_log('Не удалось отправить e-mail для заявки №' . $order_id);
    }
    
    wp_send_json_success(array('message' => 'Заявка принята, спасибо за обращение. В ближайшее время с вами свяжется наш менеджер.'));
}
add_action('wp_ajax_submit_form', 'process_contact_form');
add_action('wp_ajax_nopriv_submit_form', 'process_contact_form');

Обязательно создаю простой интерфейс в админке для просмотра всех заявок, даже если письма не дошли:

function add_orders_admin_menu() {
    add_menu_page(
        'Заявки с сайта',
        'Заявки',
        'manage_options',
        'site-orders',
        'display_orders_page'
    );
}
add_action('admin_menu', 'add_orders_admin_menu');

function display_orders_page() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'form_orders';
    $orders = $wpdb->get_results("SELECT * FROM $table_name ORDER BY created_at DESC");
    
    echo '<div class="wrap"><h1>Все заявки</h1><table class="wp-list-table widefat">';
    echo '<tr><th>Имя</th><th>Email</th><th>Сообщение</th><th>Дата</th></tr>';
    
    foreach ($orders as $order) {
        echo '<tr>';
        echo '<td>' . esc_html($order->name) . '</td>';
        echo '<td>' . esc_html($order->email) . '</td>';
        echo '<td>' . esc_html($order->message) . '</td>';
        echo '<td>' . esc_html($order->created_at) . '</td>';
        echo '</tr>';
    }
    echo '</table></div>';
}

Весь представленный код пишем в function.php. Советую создать отдельную папку например inc, создать в ней к примеру файл form.php и писать код формы в нем. Далее просто импортировать этот php файл с кодом формы в главный файл темы function.php, иначе код в function.php разрастается до нескольких тысяч строк и поддерживать его становится очень трудно.

Мои рекомендации по выбору подхода

Используйте плагины, если:

  • Нужен быстрый запуск проекта;
  • Клиент будет самостоятельно редактировать формы;
  • Бюджет не позволяет заказывать индивидуальную разработку.

Пишите свой код, если:

  • Требуется максимальная производительность (без лишних плагинов);
  • Нужна нестандартная логика обработки заявок;
  • Важна полная интеграция с внутренними системами компании.

Финальный чек-лист надёжности

Независимо от выбранного метода, я всегда проверяю:

  • Работает ли резервное сохранение данных в БД или отдельном хранилище
  • Настроен ли SMTP вместо стандартной функции почты
  • Есть ли защита от спам-ботов
  • Продублированы ли уведомления на несколько адресов
  • Настроено ли логирование ошибок отправки
  • Проведён ли тестовый прогон с проверкой всех сценариев

Такой комплексный подход позволил мне избежать ни одной потерянной заявки на проектах клиентов. Формы — это точка входа для потенциальных клиентов, и их надёжность напрямую влияет на прибыль бизнеса.