Отзывы с оценками — важный элемент доверия на любом сайте, особенно если вы ведёте блог, магазин или сайт услуг на 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.