Системы оценок и рейтингов — важный инструмент для взаимодействия с пользователями и повышения доверия к сайту. В WordPress можно реализовать уникальные системы оценок, которые будут адаптированы под конкретные задачи и типы контента. В этой статье мы подробно разберём, как создать такие системы с нуля, а также рассмотрим популярные плагины и примеры кода для реализации.
Зачем нужны уникальные системы оценок в WordPress
Стандартные рейтинги часто бывают слишком примитивными или не соответствуют специфике сайта. Например, для сайта обзоров техники нужна возможность оценивать по нескольким параметрам, а для блога — простое голосование «нравится/не нравится». Создание кастомных систем оценок позволяет:
- Гибко настраивать критерии оценки;
- Интегрировать оценки с пользовательскими ролями и правами;
- Отображать сводные рейтинги в удобном формате;
- Использовать данные для сортировки и фильтрации контента;
- Улучшить UX и вовлечённость посетителей.
Рассмотрим несколько подходов и примеров реализации.
Использование популярных плагинов для систем оценок
Если хотите быстро внедрить систему оценок, есть несколько проверенных плагинов:
- Expert Review — отличный инструмент для создания экспертных оценок с возможностью добавлять несколько критериев и весов. Поддерживает вывод в виде звёзд, баллов и процентов. Идеален для сайтов с обзорами.
- WPRemark — подходит для автоматизации отзывов и рейтингов пользователей. Позволяет собирать оценки из комментариев и выводить агрегированные результаты.
- Quizle — больше ориентирован на оценки в формате тестов, но можно адаптировать под рейтинги с вопросами и вариантами оценок.
Все эти плагины доступны на WPSHOP.RU с удобной установкой и поддержкой.
Создание базовой системы оценок с помощью кода
Если нужен полный контроль и кастомизация, можно создать систему оценок вручную. Рассмотрим пример создания системы оценки постов по трёхбалльной шкале с сохранением данных в метаполях.
Добавление интерфейса оценки в шаблон поста
Для начала выведем форму оценки в конце поста. Добавим следующий код в файл functions.php вашей темы или в отдельный плагин:
function yelly_add_rating_form($content) {
if (is_single() && is_main_query()) {
$post_id = get_the_ID();
$rating = get_post_meta($post_id, '_yelly_rating', true);
$rating = $rating ? intval($rating) : 0;
$form = '<form method="post" class="yelly-rating-form">'
. '<label>Оцените статью: </label>'
. '<select name="yelly_rating" required>'
. '<option value="">--Выберите--</option>'
. '<option value="1"' . selected($rating,1,false) . '>1</option>'
. '<option value="2"' . selected($rating,2,false) . '>2</option>'
. '<option value="3"' . selected($rating,3,false) . '>3</option>'
. '</select>'
. wp_nonce_field('yelly_rating_nonce', 'yelly_rating_nonce_field', true, false)
. '<input type="hidden" name="post_id" value="' . esc_attr($post_id) . '" />'
. '<input type="submit" value="Оценить" />'
. '</form>';
return $content . $form;
}
return $content;
}
add_filter('the_content', 'yelly_add_rating_form');
Этот код добавит форму с выбором оценки 1, 2 или 3 после контента поста.
Обработка и сохранение оценки
Далее нужно сохранить выбранную оценку при отправке формы:
function yelly_handle_rating_submission() {
if (
isset($_POST['yelly_rating']) &&
isset($_POST['post_id']) &&
isset($_POST['yelly_rating_nonce_field']) &&
wp_verify_nonce($_POST['yelly_rating_nonce_field'], 'yelly_rating_nonce')
) {
$post_id = intval($_POST['post_id']);
$rating = intval($_POST['yelly_rating']);
if ($post_id && $rating >= 1 && $rating <= 3) {
update_post_meta($post_id, '_yelly_rating', $rating);
wp_safe_redirect(get_permalink($post_id));
exit;
}
}
}
add_action('template_redirect', 'yelly_handle_rating_submission');
Этот код проверяет nonce для безопасности, сохраняет рейтинг в метаполе и перенаправляет пользователя обратно на пост.
Вывод средней оценки для поста
Допустим, вы хотите показывать средний рейтинг поста. Для этого можно хранить количество голосов и сумму оценок в метаполях, а затем рассчитывать среднее.
function yelly_add_rating_form($content) {
if (is_single() && is_main_query()) {
$post_id = get_the_ID();
$votes = intval(get_post_meta($post_id, '_yelly_rating_votes', true));
$sum = intval(get_post_meta($post_id, '_yelly_rating_sum', true));
$average = $votes ? round($sum / $votes, 2) : '—';
$rating_display = '<div class="yelly-rating-average">'
. 'Средняя оценка: <strong>' . $average . '</strong> (' . $votes . ' голосов)</div>';
$form = '<form method="post" class="yelly-rating-form">'
. '<label>Оцените статью: </label>'
. '<select name="yelly_rating" required>'
. '<option value="">--Выберите--</option>'
. '<option value="1">1</option>'
. '<option value="2">2</option>'
. '<option value="3">3</option>'
. '</select>'
. wp_nonce_field('yelly_rating_nonce', 'yelly_rating_nonce_field', true, false)
. '<input type="hidden" name="post_id" value="' . esc_attr($post_id) . '" />'
. '<input type="submit" value="Оценить" />'
. '</form>';
return $content . $rating_display . $form;
}
return $content;
}
add_filter('the_content', 'yelly_add_rating_form');
function yelly_handle_rating_submission() {
if (
isset($_POST['yelly_rating']) &&
isset($_POST['post_id']) &&
isset($_POST['yelly_rating_nonce_field']) &&
wp_verify_nonce($_POST['yelly_rating_nonce_field'], 'yelly_rating_nonce')
) {
$post_id = intval($_POST['post_id']);
$rating = intval($_POST['yelly_rating']);
if ($post_id && $rating >= 1 && $rating <= 3) {
$votes = intval(get_post_meta($post_id, '_yelly_rating_votes', true));
$sum = intval(get_post_meta($post_id, '_yelly_rating_sum', true));
$votes++;
$sum += $rating;
update_post_meta($post_id, '_yelly_rating_votes', $votes);
update_post_meta($post_id, '_yelly_rating_sum', $sum);
wp_safe_redirect(get_permalink($post_id));
exit;
}
}
}
add_action('template_redirect', 'yelly_handle_rating_submission');
Таким образом, вы реализуете накопительную систему голосования с подсчётом среднего рейтинга.
Расширение функционала: мультикритериальные оценки
Для более сложных сайтов часто нужна оценка по нескольким параметрам, например, дизайн, функциональность, поддержка. Реализовать это можно, расширив форму и сохраняя данные в сериализованном метаполе или отдельных метаполях.
Пример формы с оценкой по трём критериям:
<form method="post" class="yelly-multi-rating-form">
<label>Дизайн:</label>
<select name="yelly_rating_design" required>
<option value="">--Выберите--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<label>Функциональность:</label>
<select name="yelly_rating_functionality" required>
<option value="">--Выберите--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<label>Поддержка:</label>
<select name="yelly_rating_support" required>
<option value="">--Выберите--</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<input type="hidden" name="post_id" value="<?php echo esc_attr(get_the_ID()); ?>" />
<input type="submit" value="Оценить" />
</form>
Обработка такого рейтинга требует сохранения всех трёх параметров, подсчёта средних значений по каждому и вывод агрегированных данных. Такой подход позволит построить более информативный рейтинг.
Оптимизация и безопасность системы оценок
При реализации рейтингов важно учитывать:
- Защиту от повторного голосования с одного IP или пользователя (можно использовать куки, сессии или user ID для авторизованных);
- Валидацию и проверку данных на сервере;
- Оптимизацию запросов к базе, особенно если количество голосов большое;
- Кэширование результатов для снижения нагрузки.
Для защиты от повторных голосов можно расширить пример, добавив проверку и сохранение уникальных идентификаторов голосующих.
Вывод рейтингов в списках и виджетах
Для повышения юзабилити можно выводить рейтинг не только в постах, но и в архивах, виджетах или в блоках товаров. Пример простого вывода среднего рейтинга в цикле:
while (have_posts()) : the_post();
$votes = intval(get_post_meta(get_the_ID(), '_yelly_rating_votes', true));
$sum = intval(get_post_meta(get_the_ID(), '_yelly_rating_sum', true));
$average = $votes ? round($sum / $votes, 2) : '—';
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>Средний рейтинг: ' . $average . '</div>';
endwhile;
Такой вывод поможет пользователям ориентироваться в качестве контента прямо на странице с перечнем.
Заключение
Создание уникальных систем оценок в WordPress — задача, которую можно решить как с помощью готовых плагинов, так и собственных решений на PHP. Важно продумать структуру данных, удобство интерфейса и безопасность. Используйте описанные примеры и адаптируйте под свои задачи, чтобы повысить вовлечённость пользователей и качество сайта.