Оценка публикаций — востребованная функция для сайтов на WordPress, особенно если у вас есть раздел с опросами или отзывами. В этой статье разберём, как реализовать систему оценки публикаций через пользовательские опросы с помощью кода, без использования тяжёлых плагинов. Это позволит гибко контролировать логику, а также интегрировать функционал с другими элементами сайта.
Почему стоит сделать оценку публикации через кастомный код
Многие плагина для опросов в WordPress предлагают базовый функционал, но часто он либо избыточный, либо не даёт нужной гибкости для оценки именно публикаций. К тому же внешние плагины могут замедлять сайт или конфликтовать с темами и другими расширениями.
Создавая решение самостоятельно, вы получите:
- Минимальный и оптимальный код, который не нагружает сайт.
- Возможность адаптировать систему под свои нужды (например, добавлять вес оценки, разные критерии и т.д.).
- Простоту интеграции с другими элементами — комментариями, рейтингами, выводом статистики.
Давайте рассмотрим, как сделать такую систему на примере простого рейтинга от 1 до 5 звёзд, добавленного к публикациям.
Добавление пользовательского поля для оценки публикации
Для начала нам нужно создать пользовательское поле, в котором будет храниться средняя оценка публикации и количество проголосовавших. Для этого используем мета-поля поста:
function wppolls_add_rating_meta($post_id, $rating) {
$current_rating = (float) get_post_meta($post_id, '_wppolls_rating_avg', true);
$votes = (int) get_post_meta($post_id, '_wppolls_rating_votes', true);
$new_votes = $votes + 1;
$new_rating = (($current_rating * $votes) + $rating) / $new_votes;
update_post_meta($post_id, '_wppolls_rating_avg', $new_rating);
update_post_meta($post_id, '_wppolls_rating_votes', $new_votes);
}Функция wppolls_add_rating_meta принимает ID публикации и оценку (от 1 до 5), затем пересчитывает средний рейтинг и обновляет мета-поля.
Обработка голосов пользователя
Чтобы избежать повторного голосования с одного IP или пользователя, можно использовать cookie или мета-поля пользователя. Вот пример с cookie:
function wppolls_user_can_vote($post_id) {
$cookie_name = 'wppolls_voted_' . $post_id;
return !isset($_COOKIE[$cookie_name]);
}
function wppolls_set_vote_cookie($post_id) {
$cookie_name = 'wppolls_voted_' . $post_id;
setcookie($cookie_name, '1', time() + 3600 * 24 * 365, '/');
}Проверяем наличие cookie перед добавлением оценки, и устанавливаем cookie после успешного голосования.
Вывод формы оценки на странице публикации
Создадим форму с выбором оценки от 1 до 5, которую можно вывести в шаблоне single.php или через шорткод:
function wppolls_rating_form() {
global $post;
if (!wppolls_user_can_vote($post->ID)) {
return '<p>Вы уже голосовали за эту публикацию.</p>';
}
$html = '<form method="post" id="wppolls-rating-form">';
$html .= '<label>Оцените публикацию:</label><br>';
for ($i = 1; $i <= 5; $i++) {
$html .= '<input type="radio" name="wppolls_rating" value="' . $i . '" id="wppolls_rating_' . $i . '" />';
$html .= '<label for="wppolls_rating_' . $i . '">' . $i . '</label> ';
}
$html .= '<br><input type="submit" name="wppolls_submit_rating" value="Оценить" />';
$html .= '</form>';
return $html;
}
add_shortcode('wppolls_rating_form', 'wppolls_rating_form');Вызов шорткода [wppolls_rating_form] выведет форму оценки. Далее обработаем отправку формы.
Обработка отправки формы и обновление рейтинга
Чтобы обработать отправку данных, добавим хук на init:
function wppolls_handle_rating_submission() {
if (isset($_POST['wppolls_submit_rating']) && isset($_POST['wppolls_rating'])) {
global $post;
if (!$post) return;
$post_id = $post->ID;
$rating = intval($_POST['wppolls_rating']);
if ($rating <= 0 || $rating > 5) return;
if (!wppolls_user_can_vote($post_id)) {
return;
}
wppolls_add_rating_meta($post_id, $rating);
wppolls_set_vote_cookie($post_id);
// Перенаправление на ту же страницу без POST
wp_redirect(get_permalink($post_id));
exit;
}
}
add_action('init', 'wppolls_handle_rating_submission');Теперь при отправке формы будет обновляться рейтинг публикации, а пользователь не сможет проголосовать повторно.
Вывод среднего рейтинга и количества голосов
Чтобы показать результаты оценки в шаблоне, создадим функцию вывода:
function wppolls_show_rating($post_id) {
$avg = get_post_meta($post_id, '_wppolls_rating_avg', true);
$votes = get_post_meta($post_id, '_wppolls_rating_votes', true);
if (!$avg) {
return '<p>Оценок пока нет.</p>';
}
$avg_rounded = round($avg, 1);
$html = '<div class="wppolls-rating-result">';
$html .= '<strong>Средняя оценка: </strong>' . $avg_rounded . ' / 5<br>';
$html .= '<small>Голосов: ' . intval($votes) . '</small>';
$html .= '</div>';
return $html;
}Выведите echo wppolls_show_rating(get_the_ID()); в нужном месте шаблона публикации.
Расширение функционала: интеграция с плагином Clearfy Pro для оптимизации
Если вы используете плагин Clearfy Pro, можно дополнительно оптимизировать работу с мета-полями и кешированием рейтинга. Clearfy позволяет отключать ненужные запросы и уменьшать нагрузку на базу данных, что особенно актуально при большом количестве голосов.
Также Clearfy помогает защитить сайт от спама, что актуально для формы голосования.
Итоги и рекомендации по внедрению оценки публикаций в опросах
Мы рассмотрели, как создать простую, но функциональную систему оценки публикаций в WordPress с помощью кастомного кода. Такой подход даёт полный контроль над процессом, позволяет избежать лишних зависимостей и сделать проект максимально лёгким и быстрым.
В будущем вы можете расширить функционал, добавив более сложные критерии оценки, графики по результатам, интеграцию с другими плагинами опросов и аналитики.
Если хотите быстро и удобно управлять рейтингами и опросами, обратите внимание на специализированные решения в каталоге WPSHOP.ru.