Создание форм на сайте — одна из самых распространенных задач для разработчиков, работающих с WordPress. Обычно для этого используют плагины, но иногда требуется сделать форму максимально легкой и гибкой, без дополнительной нагрузки от плагинов. В этой статье мы подробно рассмотрим, как создать динамические формы в WordPress без использования плагинов, с примерами обработки данных и защитой от ошибок.
Почему стоит создавать формы без плагинов
Плагины форм удобны, но они увеличивают вес сайта, могут конфликтовать с другими расширениями и иногда имеют избыточный функционал. Создавая форму вручную, вы получаете:
- Полный контроль над кодом и дизайном.
- Минимум зависимостей и оптимизацию скорости.
- Гибкость в обработке и валидации данных.
Кроме того, вы можете легко интегрировать форму с любыми API или системами, не ограничиваясь функционалом плагина.
Создание простой формы с обработкой данных
Начнем с базового примера формы обратной связи, которая отправляет данные на сервер, проверяет их и выводит сообщение об успехе.
Для начала создадим функцию wpgen_render_contact_form(), которая выведет HTML формы. Добавим ее через шорткод, чтобы использовать в любом месте сайта.
function wpgen_render_contact_form() {
if ('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['wpgen_contact_nonce'])) {
if (!wp_verify_nonce($_POST['wpgen_contact_nonce'], 'wpgen_submit_contact')) {
echo '<p>Ошибка безопасности. Попробуйте снова.</p>';
return;
}
$name = sanitize_text_field($_POST['wpgen_name']);
$email = sanitize_email($_POST['wpgen_email']);
$message = sanitize_textarea_field($_POST['wpgen_message']);
$errors = array();
if (empty($name)) $errors[] = 'Введите имя';
if (empty($email) || !is_email($email)) $errors[] = 'Введите корректный email';
if (empty($message)) $errors[] = 'Введите сообщение';
if (empty($errors)) {
// Здесь можно обработать данные, например, отправить email
wp_mail('admin@wpgen.ru', 'Новое сообщение с сайта', "От: $name <$email>\n\n$message");
echo '<p>Спасибо за ваше сообщение!</p>';
return;
} else {
echo '<p>' . implode('<br>', $errors) . '</p>';
}
}
?>
<form method="post" action="">
<p><label>Имя:<br><input type="text" name="wpgen_name" required></label></p>
<p><label>Email:<br><input type="email" name="wpgen_email" required></label></p>
<p><label>Сообщение:<br><textarea name="wpgen_message" required></textarea></label></p>
<p><input type="hidden" name="wpgen_contact_nonce" value="<?php echo wp_create_nonce('wpgen_submit_contact'); ?>"></p>
<p><input type="submit" value="Отправить"></p>
</form>
<?php
}
add_shortcode('wpgen_contact_form', 'wpgen_render_contact_form');Такой подход обеспечивает базовую защиту с помощью wp_nonce и валидацию данных. Чтобы вывести форму, просто добавьте шорткод [wpgen_contact_form] на страницу или в запись.
Добавление динамических полей в форму
Иногда требуется, чтобы форма содержала поля, количество и содержание которых меняется в зависимости от условий. Для этого можно использовать массив с настройками и циклически генерировать поля.
Например, создадим форму с выбором темы сообщения и дополнительными полями, которые появляются в зависимости от выбранной темы.
function wpgen_get_dynamic_fields($topic) {
$fields = [];
switch ($topic) {
case 'support':
$fields = [
['label' => 'Номер заказа', 'type' => 'text', 'name' => 'order_number'],
['label' => 'Описание проблемы', 'type' => 'textarea', 'name' => 'problem_description'],
];
break;
case 'feedback':
$fields = [
['label' => 'Оценка', 'type' => 'number', 'name' => 'rating', 'min' => 1, 'max' => 5],
['label' => 'Комментарий', 'type' => 'textarea', 'name' => 'comment'],
];
break;
default:
$fields = [
['label' => 'Сообщение', 'type' => 'textarea', 'name' => 'message'],
];
}
return $fields;
}
function wpgen_render_dynamic_form() {
$topic = isset($_POST['wpgen_topic']) ? sanitize_text_field($_POST['wpgen_topic']) : '';
if ('POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['wpgen_dynamic_nonce'])) {
if (!wp_verify_nonce($_POST['wpgen_dynamic_nonce'], 'wpgen_submit_dynamic')) {
echo '<p>Ошибка безопасности. Попробуйте снова.</p>';
return;
}
$topic = sanitize_text_field($_POST['wpgen_topic']);
$fields = wpgen_get_dynamic_fields($topic);
$errors = [];
foreach ($fields as $field) {
$val = isset($_POST[$field['name']]) ? sanitize_text_field($_POST[$field['name']]) : '';
if (empty($val)) {
$errors[] = 'Поле "' . $field['label'] . '" обязательно для заполнения';
}
}
if (empty($errors)) {
echo '<p>Спасибо за отправку формы по теме: ' . esc_html($topic) . '</p>';
return;
} else {
echo '<p>' . implode('<br>', $errors) . '</p>';
}
} else {
$fields = [];
}
?>
<form method="post" action="">
<p><label>Тема обращения:<br>
<select name="wpgen_topic" onchange="this.form.submit()">
<option value="">-- Выберите тему --</option>
<option value="support" <?php selected($topic, 'support'); ?>>Техническая поддержка</option>
<option value="feedback" <?php selected($topic, 'feedback'); ?>>Обратная связь</option>
<option value="other" <?php selected($topic, 'other'); ?>>Другое</option>
</select>
</label></p>
<?php
foreach ($fields as $field) {
echo '<p><label>' . esc_html($field['label']) . ':<br>';
if ($field['type'] === 'textarea') {
echo '<textarea name="' . esc_attr($field['name']) . '" required></textarea>';
} else {
$attrs = '';
if (isset($field['min'])) $attrs .= ' min="' . intval($field['min']) . '"';
if (isset($field['max'])) $attrs .= ' max="' . intval($field['max']) . '"';
echo '<input type="' . esc_attr($field['type']) . '" name="' . esc_attr($field['name']) . '" required' . $attrs . '>';
}
echo '</label></p>';
}
?>
<p><input type="hidden" name="wpgen_dynamic_nonce" value="<?php echo wp_create_nonce('wpgen_submit_dynamic'); ?>"></p>
<p><input type="submit" value="Отправить"></p>
</form>
<?php
}
add_shortcode('wpgen_dynamic_form', 'wpgen_render_dynamic_form');Здесь при выборе темы форма автоматически меняется (за счет перезагрузки страницы при onchange), показывая соответствующие поля. Такой подход можно доработать с помощью AJAX, чтобы не перезагружать страницу.
Валидация и безопасность данных в формах WordPress
При работе с формами очень важно правильно валидировать и санитизировать данные, чтобы избежать уязвимостей и ошибок. WordPress предоставляет удобные функции для этого:
sanitize_text_field()— для однострочного текста;sanitize_email()— для email;sanitize_textarea_field()— для многострочного текста;is_email()— проверка валидности email;wp_verify_nonce()— проверка nonce для защиты от CSRF;
Также важно использовать esc_html() и другие функции экранирования при выводе данных, чтобы избежать XSS-уязвимостей.
Примеры полезных плагинов для расширения форм
Хотя мы рассмотрели создание форм без плагинов, иногда стоит использовать готовые решения для сложных задач. Вот несколько популярных плагинов, которые помогут расширить функционал форм:
- Contact Form 7 — классика для создания простых форм с поддержкой AJAX и хука на отправку.
- Gravity Forms — коммерческий плагин с мощным визуальным конструктором и интеграциями.
- Ninja Forms — удобный бесплатный конструктор с расширениями.
- WPForms — простой и быстрый плагин с шаблонами форм.
Если нужна интеграция с CRM или платежными системами, лучше использовать проверенные плагины. Но для легких и кастомных решений лучше писать свой код.
Итоги и рекомендации по созданию форм в WordPress без плагинов
Создавая формы вручную, вы получаете максимум контроля и можете адаптировать их под любые задачи. Важно уделять внимание безопасности — использовать nonce, фильтры и валидацию. Для динамических форм можно создавать генераторы полей и обрабатывать данные централизованно.
Для удобства пользователей добавляйте подсказки, сообщения об ошибках и подтверждения отправки. Если же проект требует более сложного функционала, рассмотрите использование плагинов, но всегда помните о производительности и безопасности.