В этой статье разберём, как создать собственный виджет для WordPress, позволяющий посетителям легко связаться с вами или оставить отзыв. Мы рассмотрим как базовый вариант на PHP, так и использование популярных плагинов для расширения функционала. Такой виджет полезен для сайта с подкастами, обучающими курсами или любой площадки, где важно поддерживать обратную связь с аудиторией.
Почему нужен кастомный виджет связи с пользователями в WordPress
Стандартные виджеты часто не покрывают все потребности сайта. Например, простой контактный формы может быть недостаточно, если нужно добавить дополнительные поля, проверку данных или интеграцию с CRM. Кастомный виджет поможет:
- Добавить уникальный дизайн и поля, соответствующие тематике сайта;
- Упростить для пользователя отправку сообщений без перехода на другую страницу;
- Обеспечить безопасность и валидацию данных;
- Интегрировать форму с внутренними или внешними сервисами.
Создадим такой виджет с нуля и рассмотрим его возможности.
Создание базового виджета обратной связи на PHP
Начнём с простого примера. В файле functions.php вашей темы или в отдельном плагине добавим код для регистрации виджета.
class Wptask_Contact_Widget extends WP_Widget {
public function __construct() {
parent::__construct(
'wptask_contact_widget',
'WPTask: Виджет связи',
['description' => 'Виджет для отправки сообщений с сайта']
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
if (!empty($instance['title'])) {
echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title'];
}
$this->wptask_render_form();
echo $args['after_widget'];
}
private function wptask_render_form() {
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['wptask_contact_nonce'])) {
if (wp_verify_nonce($_POST['wptask_contact_nonce'], 'wptask_contact_action')) {
$name = sanitize_text_field($_POST['wptask_name']);
$email = sanitize_email($_POST['wptask_email']);
$message = sanitize_textarea_field($_POST['wptask_message']);
if (is_email($email) && !empty($message)) {
$to = get_option('admin_email');
$subject = 'Новое сообщение с сайта';
$body = "Имя: $name\nEmail: $email\nСообщение:\n$message";
wp_mail($to, $subject, $body);
echo '<p>Спасибо за ваше сообщение!</p>';
} else {
echo '<p style="color:red;">Пожалуйста, заполните корректно все поля.</p>';
}
} else {
echo '<p style="color:red;">Ошибка безопасности. Попробуйте еще раз.</p>';
}
}
echo '<form method="post">';
wp_nonce_field('wptask_contact_action', 'wptask_contact_nonce');
echo '<p><label>Имя:</label><br><input type="text" name="wptask_name" required></p>';
echo '<p><label>Email:</label><br><input type="email" name="wptask_email" required></p>';
echo '<p><label>Сообщение:</label><br><textarea name="wptask_message" rows="4" required></textarea></p>';
echo '<p><button type="submit">Отправить</button></p>';
echo '</form>';
}
public function form($instance) {
$title = !empty($instance['title']) ? $instance['title'] : 'Связаться с нами';
echo '<p><label for="' . $this->get_field_id('title') . '">Заголовок:</label>';
echo '<input class="widefat" id="' . $this->get_field_id('title') . '" name="' . $this->get_field_name('title') . '" type="text" value="' . esc_attr($title) . '" /></p>';
}
public function update($new_instance, $old_instance) {
$instance = [];
$instance['title'] = sanitize_text_field($new_instance['title']);
return $instance;
}
}
add_action('widgets_init', function() {
register_widget('Wptask_Contact_Widget');
});Этот код создаёт виджет с формой, которая отправляет письмо на email администратора. Он включает базовую валидацию и защиту от CSRF через nonce. Вы можете расширить форму, добавив кастомные поля или интеграцию с API.
Использование плагинов для создания виджетов обратной связи
Если не хочется писать код, рассмотрите плагины:
Contact Form 7
Один из самых популярных плагинов для создания форм. Позволяет быстро создать форму обратной связи и вывести её в виджете или через shortcode.
Чтобы вывести форму в виджете:
- Создайте форму в Contact Form 7;
- Скопируйте shortcode, например
[contact-form-7 id="123" title="Связь"]; - Добавьте виджет «Текст» или «HTML» и вставьте shortcode.
WPForms
Плагин с визуальным конструктором форм. Имеет множество шаблонов и расширенный функционал, включая интеграцию с CRM и почтовыми сервисами.
WPForms также позволяет быстро добавить форму в виджет без программирования.
Расширенные возможности: AJAX-отправка и подтверждение
Чтобы улучшить UX, можно реализовать отправку формы без перезагрузки страницы с помощью AJAX. Ниже пример, как добавить AJAX-отправку для нашего виджета.
function wptask_enqueue_scripts() {
wp_enqueue_script('wptask-ajax-script', get_template_directory_uri() . '/js/wptask-contact.js', ['jquery'], null, true);
wp_localize_script('wptask-ajax-script', 'wptask_ajax', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wptask_ajax_nonce')
]);
}
add_action('wp_enqueue_scripts', 'wptask_enqueue_scripts');
function wptask_handle_ajax() {
check_ajax_referer('wptask_ajax_nonce', 'nonce');
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$message = sanitize_textarea_field($_POST['message']);
if (empty($name) || !is_email($email) || empty($message)) {
wp_send_json_error('Пожалуйста, заполните корректно все поля.');
}
$to = get_option('admin_email');
$subject = 'Новое сообщение с сайта';
$body = "Имя: $name\nEmail: $email\nСообщение:\n$message";
if (wp_mail($to, $subject, $body)) {
wp_send_json_success('Спасибо за ваше сообщение!');
} else {
wp_send_json_error('Ошибка отправки письма. Попробуйте позже.');
}
}
add_action('wp_ajax_wptask_send_message', 'wptask_handle_ajax');
add_action('wp_ajax_nopriv_wptask_send_message', 'wptask_handle_ajax');В файл wptask-contact.js добавьте:
jQuery(document).ready(function($) {
$('form.wptask-contact-form').on('submit', function(e) {
e.preventDefault();
var form = $(this);
var data = {
action: 'wptask_send_message',
nonce: wptask_ajax.nonce,
name: form.find('input[name="wptask_name"]').val(),
email: form.find('input[name="wptask_email"]').val(),
message: form.find('textarea[name="wptask_message"]').val()
};
$.post(wptask_ajax.ajax_url, data, function(response) {
if (response.success) {
form.html('<p>' + response.data + '</p>');
} else {
alert(response.data);
}
});
});
});Не забудьте изменить метод wptask_render_form() в виджете, добавив класс wptask-contact-form к форме, чтобы скрипт её находил.
Советы по безопасности и оптимизации виджета обратной связи
При работе с формами важно учитывать безопасность:
- Используйте
wp_nonce_field()и проверяйте nonce; - Санитизируйте и валидируйте все входящие данные;
- Ограничивайте частоту отправки сообщений (например, через сессии или IP);
- Используйте CAPTCHA (например, Google reCAPTCHA) для защиты от спама;
- Отправляйте письма через стандартную функцию
wp_mail()или сторонние SMTP-плагины для надежности.
Оптимизируйте виджет, чтобы не нагружать сайт лишними запросами и скриптами, подключайте их только на нужных страницах.
Заключение: виджет обратной связи как инструмент улучшения коммуникации
Создание собственного виджета связи с пользователями в WordPress позволяет адаптировать форму под конкретные задачи сайта, улучшить взаимодействие с посетителями и повысить конверсию. Даже базовый функционал с отправкой email уже даст значительный эффект, а с помощью AJAX и плагинов можно сделать форму современной и удобной.