Форма обратной связи — важный элемент любого сайта на WordPress. Многие разработчики стремятся использовать готовые плагины, но порой бывает полезно создать собственную форму с нуля, чтобы полностью контролировать процесс валидации, отправку данных и дизайн. В этой статье мы подробно рассмотрим, как сделать управляемую форму обратной связи без плагинов, используя стандартные средства WordPress и PHP.
Почему стоит создавать форму обратной связи без плагинов
Использование плагинов удобно, но иногда:
- Плагины сильно нагружают сайт.
- Они добавляют лишний код, который сложно кастомизировать под свои задачи.
- В некоторых случаях нужна уникальная логика обработки данных.
Создавая форму самостоятельно, вы полностью контролируете валидацию, защиту от спама и внешний вид, а также минимизируете зависимости и повышаете производительность сайта.
Основные этапы создания формы обратной связи
Процесс можно разбить на несколько этапов:
- Создание HTML-разметки формы.
- Обработка и валидация данных на сервере.
- Отправка письма администратору сайта.
- Вывод сообщений об ошибках или успехе.
- Защита формы от спама (например, с помощью nonce и простого капчи).
Создаем HTML-форму обратной связи
Добавим в шаблон или в отдельный файл следующий код формы:
<form action="" method="post" id="wptemy-contact-form">
<p>
<label for="wptemy-name">Имя</label><br>
<input type="text" id="wptemy-name" name="wptemy_name" required>
</p>
<p>
<label for="wptemy-email">Email</label><br>
<input type="email" id="wptemy-email" name="wptemy_email" required>
</p>
<p>
<label for="wptemy-message">Сообщение</label><br>
<textarea id="wptemy-message" name="wptemy_message" rows="5" required></textarea>
</p>
<input type="hidden" name="wptemy_nonce" value="<?php echo wp_create_nonce('wptemy_contact_form'); ?>">
<p><input type="submit" name="wptemy_submit" value="Отправить"></p>
</form>Обратите внимание на wp_create_nonce — это встроенная функция WordPress для защиты от CSRF-атак.
Обрабатываем отправку формы и валидируем данные
Добавьте следующий код в файл functions.php вашей темы или в отдельный подключаемый файл:
function wptemy_handle_contact_form() {
if (isset($_POST['wptemy_submit'])) {
if (!isset($_POST['wptemy_nonce']) || !wp_verify_nonce($_POST['wptemy_nonce'], 'wptemy_contact_form')) {
echo '<p style="color:red;">Ошибка безопасности. Попробуйте снова.</p>';
return;
}
$name = sanitize_text_field($_POST['wptemy_name']);
$email = sanitize_email($_POST['wptemy_email']);
$message = sanitize_textarea_field($_POST['wptemy_message']);
$errors = array();
if (empty($name)) {
$errors[] = 'Введите имя.';
}
if (!is_email($email)) {
$errors[] = 'Введите корректный email.';
}
if (empty($message)) {
$errors[] = 'Введите сообщение.';
}
if (!empty($errors)) {
foreach ($errors as $error) {
echo '<p style="color:red;">' . esc_html($error) . '</p>';
}
return;
}
$to = get_option('admin_email');
$subject = 'Сообщение с сайта от ' . $name;
$headers = array('Content-Type: text/html; charset=UTF-8', 'From: ' . $name . ' <' . $email . '>');
$body = nl2br(esc_html($message));
$sent = wp_mail($to, $subject, $body, $headers);
if ($sent) {
echo '<p style="color:green;">Спасибо за ваше сообщение! Мы свяжемся с вами в ближайшее время.</p>';
} else {
echo '<p style="color:red;">Ошибка при отправке письма. Попробуйте позже.</p>';
}
}
}
add_action('wp_footer', 'wptemy_handle_contact_form');Этот код проверяет nonce, валидирует поля, отправляет письмо и выводит сообщения об ошибках или успехе. Обратите внимание, что мы используем wp_mail — стандартную функцию WordPress для отправки почты.
Добавляем защиту от спама
Для минимальной защиты от спама добавим простой вопрос-капчу. Измените форму, добавив поле:
<p>
<label for="wptemy-captcha">Сколько будет 3 + 4?</label><br>
<input type="text" id="wptemy-captcha" name="wptemy_captcha" required>
</p>А в обработке формы добавьте проверку:
$captcha = isset($_POST['wptemy_captcha']) ? trim($_POST['wptemy_captcha']) : '';
if ($captcha !== '7') {
$errors[] = 'Ответ на вопрос капчи неверный.';
}Таким образом вы отсеете часть спам-ботов без использования сторонних сервисов.
Пример интеграции с плагином WPRemark для отзывов
Если на сайте используется плагин WPRemark от WPSHOP, можно расширить функционал, чтобы после отправки формы создавать отзыв автоматически. Для этого в хук отправки письма добавьте код:
if ($sent && class_exists('WPRemark')) {
$review_data = array(
'author_name' => $name,
'author_email' => $email,
'content' => $message,
'status' => 'pending', // или 'approved'
);
WPRemark()->reviews->add_review($review_data);
}Это позволит быстро собирать отзывы с сайта, используя уже существующую платформу.
Выводы и советы
Создание управляемой формы обратной связи без плагинов дает следующие преимущества:
- Полный контроль над валидацией и логикой обработки.
- Минимум стороннего кода и зависимостей.
- Возможность легко интегрировать дополнительные функции — например, отправку отзывов в WPRemark.
Обязательно используйте nonce и базовую капчу для защиты от CSRF и спама. В дальнейшем вы можете расширить функционал, добавив, например, AJAX-отправку или подключение reCAPTCHA.