wphow.ru wordpress WPHow

Как создать виджет отзывов с оценками в WordPress

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

Почему стоит создавать собственный виджет отзывов?

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

  • Контролировать внешний вид и функциональность;
  • Оптимизировать производительность без лишних запросов и стилей;
  • Добавлять уникальные поля и логику;
  • Безопасно интегрировать отзывы в любую часть сайта.

Это особенно актуально для сайтов на Reboot, Root или других темах с минималистичным дизайном, где важна скорость и аккуратность кода.

Основы создания виджета отзывов в WordPress

В WordPress виджеты создаются через наследование класса WP_Widget. Создадим класс WPHow_Widget_Reviews, который будет содержать логику отображения отзывов и формы добавления нового отзыва (если нужно).

Регистрация виджета

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

class WPHow_Widget_Reviews extends WP_Widget {
    public function __construct() {
        parent::__construct(
            'wphow_reviews',
            'WPHow Отзывы с оценками',
            ['description' => 'Виджет для отображения отзывов с рейтингами']
        );
    }

    public function widget($args, $instance) {
        echo $args['before_widget'];

        $title = apply_filters('widget_title', $instance['title'] ?? 'Отзывы');
        if ($title) {
            echo $args['before_title'] . esc_html($title) . $args['after_title'];
        }

        // Получаем отзывы из мета-полей или отдельного типа записей
        $reviews = $this->wphow_get_reviews();

        echo '<ul class="wphow-reviews-list">';
        foreach ($reviews as $review) {
            echo '<li><strong>' . esc_html($review['author']) . '</strong>: ' . esc_html($review['text']) . ' ' . $this->wphow_render_rating($review['rating']) . '</li>';
        }
        echo '</ul>';

        echo $args['after_widget'];
    }

    public function form($instance) {
        $title = $instance['title'] ?? '';
        ?>
        <p><label for="<?php echo esc_attr($this->get_field_id('title')); ?>">Заголовок:</label>
        <input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
        <?php
    }

    public function update($new_instance, $old_instance) {
        $instance = [];
        $instance['title'] = sanitize_text_field($new_instance['title']);
        return $instance;
    }

    private function wphow_get_reviews() {
        // Здесь можно получать отзывы из базы, например, из кастомного типа записей 'review'
        $args = [
            'post_type' => 'review',
            'posts_per_page' => 5,
            'post_status' => 'publish',
        ];
        $query = new WP_Query($args);
        $reviews = [];
        if ($query->have_posts()) {
            while ($query->have_posts()) {
                $query->the_post();
                $reviews[] = [
                    'author' => get_the_title(),
                    'text' => get_the_content(),
                    'rating' => intval(get_post_meta(get_the_ID(), 'wphow_rating', true)),
                ];
            }
            wp_reset_postdata();
        }
        return $reviews;
    }

    private function wphow_render_rating($rating) {
        $output = '';
        for ($i = 1; $i <= 5; $i++) {
            $output .= $i <= $rating ? '★' : '☆';
        }
        return '<span class="wphow-rating">' . $output . '</span>';
    }
}

function wphow_register_widget_reviews() {
    register_widget('WPHow_Widget_Reviews');
}
add_action('widgets_init', 'wphow_register_widget_reviews');

Этот код создаёт простой виджет, который выводит последние 5 отзывов из кастомного типа записей review. Рейтинги берутся из мета-поля wphow_rating и отображаются звёздочками.

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

Для удобства создадим тип записи review, чтобы администратор мог добавлять отзывы через стандартный интерфейс WordPress.

function wphow_register_post_type_review() {
    $labels = [
        'name' => 'Отзывы',
        'singular_name' => 'Отзыв',
        'add_new' => 'Добавить отзыв',
        'add_new_item' => 'Добавить новый отзыв',
        'edit_item' => 'Редактировать отзыв',
        'new_item' => 'Новый отзыв',
        'view_item' => 'Просмотреть отзыв',
        'search_items' => 'Искать отзывы',
        'not_found' => 'Отзывы не найдены',
        'not_found_in_trash' => 'В корзине отзывы не найдены',
    ];

    $args = [
        'labels' => $labels,
        'public' => true,
        'has_archive' => false,
        'supports' => ['title', 'editor'],
        'menu_icon' => 'dashicons-testimonial',
    ];

    register_post_type('review', $args);
}
add_action('init', 'wphow_register_post_type_review');

После добавления этого кода в functions.php в админке появится новый раздел «Отзывы».

Добавление метаполя для оценки с помощью плагина Advanced Custom Fields (ACF)

Чтобы удобно добавлять рейтинг, можно использовать плагин Advanced Custom Fields (ACF). Создайте поле типа "Число" с именем wphow_rating и диапазоном от 1 до 5, прикреплённое к типу записи review.

Как вывести рейтинг в шаблоне отзыва вручную

Если не хотите использовать виджет, можно вывести отзывы в любом месте шаблона так:

<?php
$args = [
    'post_type' => 'review',
    'posts_per_page' => 5,
];
$query = new WP_Query($args);
if ($query->have_posts()) {
    echo '<div class="wphow-reviews">';
    while ($query->have_posts()) {
        $query->the_post();
        $rating = intval(get_post_meta(get_the_ID(), 'wphow_rating', true));
        echo '<div class="review-item">';
        echo '<h4>' . esc_html(get_the_title()) . '</h4>';
        echo '<div class="review-content">' . get_the_content() . '</div>';
        echo '<div class="review-rating">' . str_repeat('★', $rating) . str_repeat('☆', 5 - $rating) . '</div>';
        echo '</div>';
    }
    echo '</div>';
    wp_reset_postdata();
} else {
    echo '<p>Отзывов пока нет.</p>';
}
?>

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

Если хотите готовое решение с меньшими затратами времени, рекомендую посмотреть плагины:

  • Expert Review — для создания отзывов с кастомным рейтингом и красивым дизайном.
  • WPRemark — расширенные комментарии с возможностью оценки.

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

Оптимизация и безопасность виджета отзывов

При создании отзывов важно учитывать безопасность:

  • Используйте esc_html() и другие функции экранирования при выводе пользовательских данных.
  • Если добавляете форму для отправки отзывов, обязательно применяйте nonce и проверку прав пользователя.
  • Кешируйте вывод виджета для снижения нагрузки, особенно если отзывов много.

Для кеширования можно использовать Transients API:

public function widget($args, $instance) {
    echo $args['before_widget'];

    $title = apply_filters('widget_title', $instance['title'] ?? 'Отзывы');
    if ($title) {
        echo $args['before_title'] . esc_html($title) . $args['after_title'];
    }

    $cache_key = 'wphow_reviews_cache';
    $reviews_html = get_transient($cache_key);
    if ($reviews_html === false) {
        $reviews = $this->wphow_get_reviews();
        ob_start();
        echo '<ul class="wphow-reviews-list">';
        foreach ($reviews as $review) {
            echo '<li><strong>' . esc_html($review['author']) . '</strong>: ' . esc_html($review['text']) . ' ' . $this->wphow_render_rating($review['rating']) . '</li>';
        }
        echo '</ul>';
        $reviews_html = ob_get_clean();
        set_transient($cache_key, $reviews_html, HOUR_IN_SECONDS);
    }

    echo $reviews_html;

    echo $args['after_widget'];
}

Так вы уменьшите количество запросов к базе и ускорите загрузку.

Заключение

Создание собственного виджета отзывов с оценками в WordPress — отличное решение для тех, кто хочет гибко управлять отзывами и их отображением. Вы можете использовать кастомный тип записей, мета-поля и собственные функции для вывода рейтинга. Для упрощения задач можно подключить плагины Expert Review или WPRemark с удобным интерфейсом и дополнительными возможностями.

Если вы хотите расширить функциональность, например, добавить форму отправки отзывов с AJAX или интеграцию с WooCommerce, это тоже реализуется на базе описанных принципов и WordPress API.

×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙