Как настроить формы на WordPress
За более 10 лет работы с WordPress-проектами я потерял счёт формам, которые настраивал для клиентов. И признаюсь честно: в начале карьеры я тоже терял заявки. Однажды клиент сообщил, что за две недели не получил ни одного обращения через сайт — форма отправляла письма, но они улетали в спам почтового сервера. С тех пор я разработал чёткую систему настройки форм, которой хочу поделиться.
Почему заявки теряются: главные причины
Прежде чем переходить к настройке, разберём типичные проблемы:
- Проблемы с отправкой почты — WordPress использует функцию
wp_mail(), которая часто работает нестабильно на shared-хостингах - Отсутствие резервного сохранения данных — если письмо не дошло, заявка просто теряется навсегда
- Неправильная валидация — боты и спам засоряют почту, из-за чего реальные заявки теряются в общем потоке
- Отсутствие уведомлений об ошибках — вы можете месяцами не знать, что форма не работает
Вариант 1: Настройка через плагины
Contact Form 7 + дополнительные модули
CF7 — самый популярный бесплатный плагин, но по умолчанию он не сохраняет заявки в базе данных. Это критическая ошибка многих разработчиков.
Мой алгоритм настройки форм:
- Устанавливаю CF7 и создаю форму с необходимыми полями;
- Обязательно добавляю плагин Flamingo — он сохраняет все отправленные формы в админке WordPress, даже если письмо не дошло;
- Настраиваю SMTP через плагин WP Mail SMTP, подключая реальный почтовый сервис (Gmail, Mailgun, и т.д.)
- Настраиваю дублирование уведомлений на дополнительный e-mail адрес
Преимущество этого стека: даже при полном отказе почты у вас останется резервная копия всех заявок в разделе Flamingo → Inbound Messages.
WPForms
Для клиентов с более серьёзными требованиями рекомендую WPForms Pro. Здесь встроена функция сохранения записей в базе данных без дополнительных плагинов.
Настройка:
- Создаю форму через drag-and-drop конструктор
- В настройках формы включаю раздел «Entries» — все заявки автоматически сохраняются
- Настраиваю логику для сложных форм (например, показ дополнительных полей при выборе определённой услуги)
- Интегрирую с CRM через встроенные коннекторы (AmoCRM, Bitrix24)
- Настраиваю уведомления через собственный 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 вместо стандартной функции почты
- Есть ли защита от спам-ботов
- Продублированы ли уведомления на несколько адресов
- Настроено ли логирование ошибок отправки
- Проведён ли тестовый прогон с проверкой всех сценариев
Такой комплексный подход позволил мне избежать ни одной потерянной заявки на проектах клиентов. Формы — это точка входа для потенциальных клиентов, и их надёжность напрямую влияет на прибыль бизнеса.