Часто на сайтах, построенных на WordPress, возникает задача добавить функционал отзывов с возможностью оценивать товары, услуги или публикации. Многие сразу идут устанавливать плагины, но это не всегда оправдано: плагины могут замедлять сайт, создавать конфликты или содержать лишний функционал. В этой статье я расскажу, как реализовать отзывы с оценками собственными силами, используя стандартные средства WordPress и немного PHP-кода.
Почему стоит делать отзывы без плагинов
Встроенная система комментариев WordPress уже позволяет пользователям оставлять отзывы, но не предусматривает удобный механизм оценок. Плагины часто делают систему громоздкой и сложной для поддержки. Если вы хотите легковесное решение, которое можно адаптировать под свои нужды, то создание собственной системы – лучший вариант.
Плюсы собственного решения:
- Минимальная нагрузка на сайт.
- Полный контроль над функционалом.
- Возможность интеграции с темой и другими элементами сайта.
Минусы – потребуется немного времени на реализацию и поддержку, но это окупается гибкостью и скоростью.
Создаем структуру отзывов с оценками
Для начала нужно добавить в комментарии дополнительное поле для оценки и сохранить его. Обратимся к хукам WordPress.
Добавление поля оценки в форму комментариев
Чтобы добавить поле рейтинга, используем хук comment_form_after_fields для гостей и comment_form_logged_in_after для авторизованных пользователей.
function wordpresses_add_rating_field() {
echo '<p class="comment-form-rating"><label for="rating">Оценка: <span class="required">*</span></label>
<select name="rating" id="rating" required>
<option value="">Выберите оценку</option>
<option value="5">5 - Отлично</option>
<option value="4">4 - Хорошо</option>
<option value="3">3 - Удовлетворительно</option>
<option value="2">2 - Плохо</option>
<option value="1">1 - Очень плохо</option>
</select></p>';
}
add_action('comment_form_logged_in_after', 'wordpresses_add_rating_field');
add_action('comment_form_after_fields', 'wordpresses_add_rating_field');
Так мы добавили в форму комментария выпадающий список с оценками от 1 до 5.
Сохраняем рейтинг в метаданные комментария
Когда пользователь отправляет комментарий, необходимо сохранить его оценку в мета поля комментария. Для этого используем хук comment_post.
function wordpresses_save_comment_rating($comment_id) {
if (isset($_POST['rating']) && $_POST['rating'] !== '') {
$rating = intval($_POST['rating']);
if ($rating >= 1 && $rating <= 5) {
add_comment_meta($comment_id, 'wordpresses_rating', $rating);
}
}
}
add_action('comment_post', 'wordpresses_save_comment_rating');
Теперь у каждого комментария, где пользователь указал оценку, она будет сохранена в базе.
Отображение рейтинга в отзывах
Следующий шаг – показывать оценку рядом с комментарием. Для этого можно воспользоваться фильтром comment_text или изменить шаблон комментариев в вашей теме.
function wordpresses_display_rating_in_comment($comment_text, $comment) {
$rating = get_comment_meta($comment->comment_ID, 'wordpresses_rating', true);
if ($rating) {
$stars = str_repeat('★', $rating) . str_repeat('☆', 5 - $rating); // filled and empty stars
$comment_text = '<div class="wordpresses-rating" title="Оценка: ' . esc_attr($rating) . '">' . $stars . '</div>' . $comment_text;
}
return $comment_text;
}
add_filter('comment_text', 'wordpresses_display_rating_in_comment', 10, 2);
Этот код добавит звездный рейтинг перед текстом комментария. Можно стилизовать блок .wordpresses-rating в CSS для лучшего отображения.
Расчет и вывод средней оценки объекта
Чтобы показать средний рейтинг поста (товара, услуги и т.п.), нужно получить все оценки из комментариев и вычислить среднее.
function wordpresses_get_average_rating($post_id) {
global $wpdb;
$ratings = $wpdb->get_col($wpdb->prepare(
"SELECT meta_value FROM {$wpdb->commentmeta}
JOIN {$wpdb->comments} ON {$wpdb->commentmeta}.comment_id = {$wpdb->comments}.comment_ID
WHERE meta_key = 'wordpresses_rating' AND comment_post_ID = %d AND comment_approved = 1",
$post_id
));
if (empty($ratings)) return 0;
$ratings = array_map('intval', $ratings);
return round(array_sum($ratings) / count($ratings), 2);
}
Далее средний рейтинг можно вывести в шаблоне:
$avg_rating = wordpresses_get_average_rating(get_the_ID());
echo '<p>Средняя оценка: <strong>' . $avg_rating . '</strong></p>';
Возможности для улучшения и расширения
Такое базовое решение можно развивать:
- Добавить валидацию и защиту от повторного голосования.
- Добавить AJAX-отправку отзывов для удобства.
- Сделать систему модерации оценок.
- Интегрировать отображение рейтинга в микроразметку Schema.org для улучшения SEO.
- Использовать готовые компоненты из тем, например, темы Reboot, которые позволяют красиво выводить отзывы.
Если вы хотите усилить функционал отзывов, можно рассмотреть и плагины из коллекции WPShop, например, Expert Review – плагин для расширенных отзывов с рейтингами и экспертными оценками.
Выводы и рекомендации
Создание отзывов с оценками без плагинов – реально и достаточно просто. Такой подход позволяет избежать лишнего «мусора» и держать сайт легким и быстрым. Главное – корректно обрабатывать и валидировать данные, а также грамотно выводить рейтинг для пользователей.
Если в будущем функционал потребуется расширить, всегда можно подключить дополнительные инструменты или обновить код, ориентируясь на задачи сайта.