Как создать функционал обратной связи с оценкой в WordPress

Обратная связь — один из ключевых элементов взаимодействия с пользователями на сайте. Особенно ценно, когда помимо обычного сообщения посетитель может оставить оценку или рейтинг, что помогает лучше понять качество продукта или услуги. В этой статье мы подробно разберём, как реализовать функционал обратной связи с оценкой в WordPress: от простого контактного формата до расширенного решения с сохранением данных и уведомлениями.

Почему важно добавить оценку в форму обратной связи

Добавление поля оценки в форму обратной связи позволяет получить не только текстовый отзыв, но и количественную характеристику впечатлений пользователя. Это помогает:

  • Анализировать качество сервиса или контента.
  • Отслеживать динамику изменения мнений клиентов.
  • Повысить вовлечённость за счёт упрощённого способа оставить отзыв.

Кроме того, оценочные данные можно использовать для построения графиков и отчётов, улучшая управление сайтом.

Выбор подхода: плагин или кастомная реализация

Для реализации обратной связи с оценкой в WordPress есть два основных пути:

Использование готовых плагинов

Существует множество плагинов, которые добавляют формы с рейтингом. Например, популярный WPRemark позволяет легко создавать формы обратной связи с рейтингом и отзывами. Его преимущества:

  • Простая настройка через админку.
  • Встроенный функционал уведомлений и аналитики.
  • Интеграция с WPExpertReview для расширенных отчётов.

Однако, если нужны уникальные функции или глубокая интеграция, стоит рассмотреть кастомную реализацию.

Кастомная реализация с помощью кода

Создадим простой пример формы обратной связи с оценкой, которая сохраняет данные в базу и отправляет уведомление администратору.

Создание кастомной формы обратной связи с оценкой

Для начала добавим шорткод, который выведет форму на страницу или в записи. В functions.php вашей темы добавьте следующий код:

function wpvip_feedback_form() {
  if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['wpvip_feedback_nonce']) && wp_verify_nonce($_POST['wpvip_feedback_nonce'], 'wpvip_feedback_form')) {
    $name = sanitize_text_field($_POST['wpvip_name']);
    $email = sanitize_email($_POST['wpvip_email']);
    $message = sanitize_textarea_field($_POST['wpvip_message']);
    $rating = intval($_POST['wpvip_rating']);

    if ($name && $email && $message && $rating >=1 && $rating <=5) {
      global $wpdb;
      $table = $wpdb->prefix . 'wpvip_feedback';
      $wpdb->insert($table, [
        'name' => $name,
        'email' => $email,
        'message' => $message,
        'rating' => $rating,
        'date' => current_time('mysql')
      ]);

      // Отправляем уведомление админу
      wp_mail(get_option('admin_email'), 'Новая обратная связь с оценкой', "Имя: $name\nEmail: $email\nОценка: $rating\nСообщение: $message");

      return '<p>Спасибо за ваш отзыв и оценку!</p>';
    } else {
      return '<p>Пожалуйста, заполните все поля корректно.</p>' . wpvip_render_form($name, $email, $message, $rating);
    }
  }
  return wpvip_render_form();
}

function wpvip_render_form($name = '', $email = '', $message = '', $rating = 0) {
  ob_start();
  ?>
  <form method="post">
    <?php wp_nonce_field('wpvip_feedback_form', 'wpvip_feedback_nonce'); ?>
    <p><label>Имя:<br><input type="text" name="wpvip_name" value="<?php echo esc_attr($name); ?>" required></label></p>
    <p><label>Email:<br><input type="email" name="wpvip_email" value="<?php echo esc_attr($email); ?>" required></label></p>
    <p><label>Сообщение:<br><textarea name="wpvip_message" required><?php echo esc_textarea($message); ?></textarea></label></p>
    <p><label>Оценка:<br>
      <select name="wpvip_rating" required>
        <option value="">Выберите</option>
        <?php for ($i=1; $i <= 5; $i++): ?>
          <option value="<?php echo $i; ?>" <?php selected($rating, $i); ?>><?php echo $i; ?></option>
        <?php endfor; ?>
      </select>
    </label></p>
    <p><button type="submit">Отправить</button></p>
  </form>
  <?php
  return ob_get_clean();
}

add_shortcode('wpvip_feedback', 'wpvip_feedback_form');

Этот код создаёт шорткод [wpvip_feedback], который можно вставить в любую страницу. Форма проверяет данные, сохраняет их в отдельную таблицу и отправляет уведомление администратору.

Создание таблицы для хранения отзывов и оценок

Для сохранения данных нужно создать новую таблицу в базе. Лучше сделать это при активации темы или плагина. Пример функции для создания таблицы:

function wpvip_create_feedback_table() {
  global $wpdb;
  $table_name = $wpdb->prefix . 'wpvip_feedback';
  $charset_collate = $wpdb->get_charset_collate();
  
  $sql = "CREATE TABLE IF NOT EXISTS $table_name (
    id mediumint(9) NOT NULL AUTO_INCREMENT,
    name tinytext NOT NULL,
    email varchar(100) NOT NULL,
    message text NOT NULL,
    rating tinyint NOT NULL,
    date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY  (id)
  ) $charset_collate;";

  require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
  dbDelta($sql);
}

register_activation_hook(__FILE__, 'wpvip_create_feedback_table');

Если добавляете в тему, вызовите эту функцию один раз вручную или через admin_init.

Улучшение функционала: AJAX отправка и вывод отзывов

Реализация AJAX отправки формы

Чтобы улучшить UX, можно отправлять форму без перезагрузки страницы. Для этого добавим AJAX обработчик и JavaScript:

function wpvip_enqueue_scripts() {
  wp_enqueue_script('wpvip-feedback', get_template_directory_uri() . '/js/wpvip-feedback.js', ['jquery'], null, true);
  wp_localize_script('wpvip-feedback', 'wpvip_ajax', [
    'ajax_url' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('wpvip_feedback_nonce')
  ]);
}
add_action('wp_enqueue_scripts', 'wpvip_enqueue_scripts');

function wpvip_handle_ajax_feedback() {
  check_ajax_referer('wpvip_feedback_nonce', 'nonce');

  $name = sanitize_text_field($_POST['name']);
  $email = sanitize_email($_POST['email']);
  $message = sanitize_textarea_field($_POST['message']);
  $rating = intval($_POST['rating']);

  if (!$name || !$email || !$message || $rating < 1 || $rating > 5) {
    wp_send_json_error('Заполните все поля корректно');
  }

  global $wpdb;
  $table = $wpdb->prefix . 'wpvip_feedback';
  $inserted = $wpdb->insert($table, [
    'name' => $name,
    'email' => $email,
    'message' => $message,
    'rating' => $rating,
    'date' => current_time('mysql')
  ]);

  if ($inserted) {
    wp_mail(get_option('admin_email'), 'Новая обратная связь с оценкой', "Имя: $name\nEmail: $email\nОценка: $rating\nСообщение: $message");
    wp_send_json_success('Спасибо за отзыв!');
  } else {
    wp_send_json_error('Ошибка при сохранении');
  }
}
add_action('wp_ajax_nopriv_wpvip_feedback', 'wpvip_handle_ajax_feedback');
add_action('wp_ajax_wpvip_feedback', 'wpvip_handle_ajax_feedback');

JavaScript-файл wpvip-feedback.js:

jQuery(document).ready(function($) {
  $('form.wpvip-feedback-form').on('submit', function(e) {
    e.preventDefault();
    let data = {
      action: 'wpvip_feedback',
      nonce: wpvip_ajax.nonce,
      name: $(this).find('input[name="wpvip_name"]').val(),
      email: $(this).find('input[name="wpvip_email"]').val(),
      message: $(this).find('textarea[name="wpvip_message"]').val(),
      rating: $(this).find('select[name="wpvip_rating"]').val()
    };
    $.post(wpvip_ajax.ajax_url, data, function(response) {
      if (response.success) {
        alert(response.data);
        $('form.wpvip-feedback-form')[0].reset();
      } else {
        alert('Ошибка: ' + response.data);
      }
    });
  });
});

И измените функцию wpvip_render_form, добавив класс форме:

<form method="post" class="wpvip-feedback-form">

Вывод списка отзывов с оценками

Для отображения отзывов с оценками создадим шорткод:

function wpvip_display_feedbacks() {
  global $wpdb;
  $table = $wpdb->prefix . 'wpvip_feedback';
  $feedbacks = $wpdb->get_results("SELECT * FROM $table ORDER BY date DESC LIMIT 10");

  if (!$feedbacks) {
    return '<p>Пока отзывов нет.</p>';
  }

  $output = '<div class="wpvip-feedback-list">';
  foreach ($feedbacks as $fb) {
    $stars = str_repeat('★', $fb->rating) . str_repeat('☆', 5 - $fb->rating);
    $output .= "<div class=\"feedback-item\"><strong>" . esc_html($fb->name) . "</strong> <span>($stars)</span><br>" . esc_html($fb->message) . "<br><em>" . esc_html($fb->date) . "</em></div>";
  }
  $output .= '</div>';
  return $output;
}
add_shortcode('wpvip_feedbacks_list', 'wpvip_display_feedbacks');

Теперь вы можете вставить [wpvip_feedbacks_list] на любую страницу для отображения последних отзывов с оценками.

Заключение

Функционал обратной связи с оценкой в WordPress — мощный инструмент для сбора обратной информации и анализа пользовательского опыта. Вы можете начать с простого решения на кастомном коде, а затем расширить его с помощью AJAX, уведомлений и аналитики. Если хотите сэкономить время и получить готовое решение с широким функционалом, рекомендуем обратить внимание на WPRemark — плагин обратной связи с рейтингом и отзывами, который отлично интегрируется с экосистемой WPSHOP.

WooCommerce: настройка строгой синхронизации остатков товара при массовых изменениях
24.04.2026
WooCommerce: почему не отправляется письмо подтверждения заказа и как это исправить
21.04.2026
WooCommerce: автоматическая синхронизация остатков товара при массовых изменениях
02.05.2026
Создание динамического фильтрованного списка постов в WordPress
28.02.2026
WooCommerce: автоматическая удалённая отгрузка и синхронизация остатков товаров
16.05.2026