В этой статье рассмотрим, как реализовать форму обратной связи, которая автоматически привязывает отправленные сообщения к зарегистрированным пользователям WordPress. Такая функциональность полезна для сайтов с личными кабинетами или когда нужно вести учет обращений именно от авторизованных пользователей.
Почему важна привязка обратной связи к пользователю
Стандартные формы обратной связи не сохраняют информацию о том, кто именно отправил сообщение, если пользователь не указывает свои данные явно. Это затрудняет последующую обработку обращений, особенно когда пользователь зарегистрирован на сайте и авторизован. Привязка сообщений к ID пользователя позволяет:
- Автоматически заполнять контактные данные;
- Отслеживать историю обращений пользователя;
- Упрощать коммуникацию и поддержку;
- Обеспечивать безопасность и контроль.
Реализовать такую систему можно с помощью кастомного плагина или в рамках дочерней темы. Рассмотрим пример на базе кастомного шорткода с AJAX-обработкой.
Создание формы обратной связи с привязкой к пользователю
Для начала создадим шорткод [hueman_feedback_form], который выведет форму с полями и кнопкой отправки. Если пользователь авторизован, поля с именем и email автоматически заполнятся.
function hueman_feedback_form_shortcode() {
if (!is_user_logged_in()) {
return '<p>Пожалуйста, войдите в систему, чтобы отправить сообщение.</p>';
}
$current_user = wp_get_current_user();
ob_start();
?>
<form id="hueman-feedback-form" method="post">
<label for="hueman-message">Ваше сообщение:</label><br>
<textarea id="hueman-message" name="message" required rows="5" cols="50"></textarea><br>
<input type="hidden" name="user_id" value="<?php echo esc_attr($current_user->ID); ?>">
<button type="submit">Отправить</button>
</form>
<div id="hueman-feedback-result"></div>
<script>
document.getElementById('hueman-feedback-form').addEventListener('submit', function(e) {
e.preventDefault();
var form = e.target;
var data = new FormData(form);
data.append('action', 'hueman_submit_feedback');
fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
method: 'POST',
credentials: 'same-origin',
body: data
})
.then(response => response.json())
.then(result => {
document.getElementById('hueman-feedback-result').textContent = result.data.message;
if(result.success){
form.reset();
}
})
.catch(() => {
document.getElementById('hueman-feedback-result').textContent = 'Ошибка при отправке сообщения.';
});
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('hueman_feedback_form', 'hueman_feedback_form_shortcode');
В этом коде мы создаём форму с текстовым полем для сообщения. ID текущего пользователя передаётся скрытым полем. Отправка реализована через JavaScript fetch к admin-ajax.php.
Обработка AJAX-запроса и сохранение сообщения
Теперь добавим обработчик AJAX, который будет сохранять сообщение как запись кастомного типа post или в таблице метаданных.
function hueman_handle_feedback() {
// Проверяем, что пользователь авторизован
if (!is_user_logged_in()) {
wp_send_json_error(['message' => 'Требуется авторизация']);
}
$user_id = get_current_user_id();
$message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : '';
if (empty($message)) {
wp_send_json_error(['message' => 'Сообщение не может быть пустым']);
}
// Создаем кастомный пост для хранения обратной связи
$feedback_post = wp_insert_post([
'post_type' => 'hueman_feedback',
'post_title' => 'Обращение пользователя #' . $user_id,
'post_content' => $message,
'post_status' => 'private',
'post_author' => $user_id
]);
if (is_wp_error($feedback_post)) {
wp_send_json_error(['message' => 'Ошибка сохранения сообщения']);
}
wp_send_json_success(['message' => 'Ваше сообщение успешно отправлено']);
}
add_action('wp_ajax_hueman_submit_feedback', 'hueman_handle_feedback');
Код сохраняет сообщение в виде приватного поста типа hueman_feedback, который нужно зарегистрировать отдельно, чтобы сообщения были удобны для просмотра в админке.
Регистрация кастомного типа записи для обратной связи
Добавим регистрацию типа записи в functions.php или плагин:
function hueman_register_feedback_post_type() {
register_post_type('hueman_feedback', [
'labels' => [
'name' => 'Обратная связь',
'singular_name' => 'Сообщение',
'menu_name' => 'Обратная связь'
],
'public' => false,
'show_ui' => true,
'supports' => ['title', 'editor', 'author'],
'capability_type' => 'post',
'capabilities' => [
'create_posts' => false,
],
'map_meta_cap' => true,
'menu_position' => 25,
'menu_icon' => 'dashicons-email-alt',
]);
}
add_action('init', 'hueman_register_feedback_post_type');
Теперь в админке появится раздел «Обратная связь», где можно просматривать обращения пользователей.
Дополнительные улучшения и интеграция с плагинами
Можно расширить функционал:
- Добавить уведомления на email администратора или ответственного сотрудника при новом сообщении.
- Использовать плагин Expert Review для расширения системы отзывов и обратной связи.
- Добавить CAPTCHA или интеграцию с сервисами антиспама.
- Реализовать в личном кабинете пользователя страницу с историей его обращений.
Для отправки email можно добавить в функцию hueman_handle_feedback следующий код:
$admin_email = get_option('admin_email');
wp_mail($admin_email, 'Новое сообщение от пользователя #' . $user_id, $message);
Таким образом вы получите простой, но эффективный механизм обратной связи, который удобно использовать на сайте с зарегистрированными пользователями.