Добавление отзывов с оценками в WordPress без плагинов

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

Почему стоит добавить отзывы с оценками без плагина

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

Кроме того, вы сможете минимизировать нагрузку на базу данных и избежать лишних скриптов, которые подключают некоторые плагины.

В этой статье я покажу, как добавить отзывы с оценками в WordPress, используя пользовательские типы записей, метаполя и AJAX для динамического добавления отзывов без перезагрузки страницы.

Создание пользовательского типа записи для отзывов

Первым шагом создадим собственный тип записи — wpstudy_review. Это позволит отделить отзывы от стандартных записей и страниц, а также упростит фильтрацию и вывод.

Добавим следующий код в файл functions.php вашей темы или в кастомный плагин:

function wpstudy_register_review_post_type() {
    $labels = array(
        'name' => 'Отзывы',
        'singular_name' => 'Отзыв',
        'add_new' => 'Добавить отзыв',
        'add_new_item' => 'Добавить новый отзыв',
        'edit_item' => 'Редактировать отзыв',
        'new_item' => 'Новый отзыв',
        'view_item' => 'Просмотреть отзыв',
        'search_items' => 'Поиск отзывов',
        'not_found' => 'Отзывы не найдены',
        'not_found_in_trash' => 'В корзине отзывов не найдено',
        'menu_name' => 'Отзывы'
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor', 'author'),
        'menu_position' => 20,
        'menu_icon' => 'dashicons-testimonial',
        'rewrite' => array('slug' => 'otzyvy'),
    );
    register_post_type('wpstudy_review', $args);
}
add_action('init', 'wpstudy_register_review_post_type');

После добавления и обновления страницы админки вы увидите новый пункт меню — «Отзывы».

Добавление метаполя для оценки

Теперь добавим к отзывах поле с оценкой от 1 до 5. Для этого используем метабоксы.

В functions.php добавим следующий код:

function wpstudy_add_review_rating_metabox() {
    add_meta_box(
        'wpstudy_review_rating',
        'Оценка отзыва',
        'wpstudy_review_rating_metabox_callback',
        'wpstudy_review',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpstudy_add_review_rating_metabox');

function wpstudy_review_rating_metabox_callback($post) {
    wp_nonce_field('wpstudy_save_review_rating', 'wpstudy_review_rating_nonce');
    $value = get_post_meta($post->ID, '_wpstudy_review_rating', true);
    ?>
    <label for="wpstudy_review_rating_field">Выберите оценку (1-5):</label>
    <select name="wpstudy_review_rating_field" id="wpstudy_review_rating_field">
        <?php for ($i = 1; $i <= 5; $i++) : ?>
            <option value="<?php echo $i; ?>" <?php selected($value, $i); ?>><?php echo $i; ?></option>
        <?php endfor; ?>
    </select>
    <?php
}

function wpstudy_save_review_rating($post_id) {
    if (!isset($_POST['wpstudy_review_rating_nonce']) || !wp_verify_nonce($_POST['wpstudy_review_rating_nonce'], 'wpstudy_save_review_rating')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (isset($_POST['wpstudy_review_rating_field'])) {
        $rating = intval($_POST['wpstudy_review_rating_field']);
        if ($rating >= 1 && $rating <= 5) {
            update_post_meta($post_id, '_wpstudy_review_rating', $rating);
        }
    }
}
add_action('save_post', 'wpstudy_save_review_rating');

Теперь при добавлении или редактировании отзыва можно выбрать оценку.

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

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

Пример запроса и вывода:

$args = array(
    'post_type' => 'wpstudy_review',
    'posts_per_page' => 5,
    'orderby' => 'date',
    'order' => 'DESC',
);
$reviews = new WP_Query($args);
if ($reviews->have_posts()) {
    echo '<div class="wpstudy-reviews">';
    while ($reviews->have_posts()) {
        $reviews->the_post();
        $rating = get_post_meta(get_the_ID(), '_wpstudy_review_rating', true);
        echo '<div class="review-item">';
        echo '<h3>' . get_the_title() . '</h3>';
        echo '<div class="review-rating">' . wpstudy_render_stars($rating) . '</div>';
        echo '<div class="review-content">' . get_the_content() . '</div>';
        echo '</div>';
    }
    echo '</div>';
    wp_reset_postdata();
} else {
    echo '<p>Отзывов пока нет.</p>';
}

function wpstudy_render_stars($rating) {
    $output = '';
    for ($i = 1; $i <= 5; $i++) {
        if ($i <= $rating) {
            $output .= '⭐';
        } else {
            $output .= '☆';
        }
    }
    return $output;
}

Добавление формы для отправки отзывов с оценками через AJAX

Чтобы пользователи могли оставлять отзывы без доступа к панели администратора, добавим фронтенд-форму с оценкой и динамической отправкой через AJAX.

HTML формы можно вывести так:

<form id="wpstudy-review-form">
    <label for="review_title">Заголовок отзыва:</label>
    <input type="text" id="review_title" name="review_title" required>

    <label for="review_content">Текст отзыва:</label>
    <textarea id="review_content" name="review_content" required></textarea>

    <label for="review_rating">Оценка:</label>
    <select id="review_rating" name="review_rating" required>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>

    <button type="submit">Отправить отзыв</button>
</form>
<div id="wpstudy-review-message"></div>

JavaScript для отправки данных AJAX (подключите в теме):

jQuery(document).ready(function($) {
    $('#wpstudy-review-form').on('submit', function(e) {
        e.preventDefault();
        var data = {
            action: 'wpstudy_add_review',
            review_title: $('#review_title').val(),
            review_content: $('#review_content').val(),
            review_rating: $('#review_rating').val(),
            security: wpstudy_vars.nonce
        };
        $.post(wpstudy_vars.ajax_url, data, function(response) {
            $('#wpstudy-review-message').html(response.data.message);
            if (response.success) {
                $('#wpstudy-review-form')[0].reset();
            }
        });
    });
});

В functions.php добавим обработчик AJAX:

function wpstudy_enqueue_scripts() {
    wp_enqueue_script('jquery');
    wp_enqueue_script('wpstudy-review-js', get_template_directory_uri() . '/js/wpstudy-review.js', array('jquery'), null, true);
    wp_localize_script('wpstudy-review-js', 'wpstudy_vars', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpstudy_review_nonce')
    ));
}
add_action('wp_enqueue_scripts', 'wpstudy_enqueue_scripts');

function wpstudy_handle_add_review() {
    check_ajax_referer('wpstudy_review_nonce', 'security');

    $title = sanitize_text_field($_POST['review_title']);
    $content = sanitize_textarea_field($_POST['review_content']);
    $rating = intval($_POST['review_rating']);

    if (empty($title) || empty($content) || $rating < 1 || $rating > 5) {
        wp_send_json_error(array('message' => 'Пожалуйста, заполните все поля корректно.'));
    }

    $new_review = array(
        'post_title' => $title,
        'post_content' => $content,
        'post_status' => 'pending', // чтобы админ проверил отзыв
        'post_type' => 'wpstudy_review',
        'post_author' => 0
    );

    $post_id = wp_insert_post($new_review);

    if (is_wp_error($post_id)) {
        wp_send_json_error(array('message' => 'Ошибка при добавлении отзыва. Попробуйте позже.'));
    }

    update_post_meta($post_id, '_wpstudy_review_rating', $rating);

    wp_send_json_success(array('message' => 'Спасибо за ваш отзыв! После проверки он появится на сайте.'));
}
add_action('wp_ajax_nopriv_wpstudy_add_review', 'wpstudy_handle_add_review');
add_action('wp_ajax_wpstudy_add_review', 'wpstudy_handle_add_review');

Как улучшить и расширить систему отзывов

Для улучшения можно добавить:

  • Возможность редактирования и удаления своих отзывов через личный кабинет.
  • Отображение средней оценки по всем отзывам.
  • Фильтры отзывов по рейтингу, дате и автору.
  • Капчу или защиту от спама.
  • Использование пользовательских таксономий для привязки отзывов к товарам или услугам.

Если нужна более сложная функциональность, можно рассмотреть плагины, например, Clearfy Pro для оптимизации и защиты, или WPCommunity для организации взаимодействия пользователей.

Реализовав систему самостоятельно, вы избежите многих проблем с производительностью и совместимостью, а также сможете адаптировать её под любые требования проекта.

Как использовать AJAX в WordPress для форм и отзывов
17.02.2026
Изменение и удаление названия пользовательской роли в WordPress
30.12.2025
Как автоматизировать создание бэкапов в WordPress
14.11.2025
Как создать автоматические уведомления о обновлениях в WordPress
03.01.2026
Как использовать WooCommerce хуки для настройки страницы товара
17.04.2026