Отзывы с оценкой — один из важных элементов для многих сайтов на WordPress, особенно если речь идет о товарах, услугах или контенте, где важно мнение пользователей. В этой статье расскажу, как самостоятельно создать на сайте функционал для сбора отзывов с оценкой, без использования громоздких плагинов, а также с примерами кода и рекомендациями по расширениям.
Почему стоит создавать отзывы с оценкой самостоятельно?
Готовые плагины могут быть удобны, но не всегда подходят по функционалу и дизайну, часто добавляют лишний код и замедляют сайт. К тому же, создание собственного решения даст полный контроль и позволит интегрировать отзывы в любые части сайта — от карточек товаров до страниц блога.
Кроме того, это полезно для понимания работы с метаполями, AJAX и безопасностью в WordPress.
Создаем пользовательский тип записей для отзывов
Для удобства и структурированности создадим отдельный тип записей "Отзывы". Это позволит легко управлять ими через админку и выводить в любом месте сайта.
function wpkpi_register_reviews_cpt() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Искать отзывы',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'author'),
'show_in_rest' => true,
);
register_post_type('wpkpi_review', $args);
}
add_action('init', 'wpkpi_register_reviews_cpt');Этот код нужно добавить в functions.php вашей темы или в отдельный плагин. Тип записи wpkpi_review станет основой для хранения отзывов.
Добавляем метаполе для оценки (рейтинг)
Для каждого отзыва нужна оценка — число от 1 до 5. Создадим метабокс в админке для ввода оценки.
function wpkpi_add_rating_metabox() {
add_meta_box(
'wpkpi_rating_meta',
'Оценка',
'wpkpi_rating_metabox_callback',
'wpkpi_review',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpkpi_add_rating_metabox');
function wpkpi_rating_metabox_callback($post) {
wp_nonce_field('wpkpi_save_rating_meta', 'wpkpi_rating_nonce');
$value = get_post_meta($post->ID, '_wpkpi_rating', true);
echo '<label for="wpkpi_rating_field">Оценка (1-5): </label>';
echo '<input type="number" id="wpkpi_rating_field" name="wpkpi_rating_field" min="1" max="5" value="'.esc_attr($value).'" style="width:50px;">';
}
function wpkpi_save_rating_meta($post_id) {
if (!isset($_POST['wpkpi_rating_nonce']) || !wp_verify_nonce($_POST['wpkpi_rating_nonce'], 'wpkpi_save_rating_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpkpi_rating_field'])) {
$rating = intval($_POST['wpkpi_rating_field']);
if ($rating < 1) $rating = 1;
if ($rating > 5) $rating = 5;
update_post_meta($post_id, '_wpkpi_rating', $rating);
}
}
add_action('save_post', 'wpkpi_save_rating_meta');Этот код добавляет поле для рейтинга при редактировании отзыва и сохраняет его корректно.
Вывод отзывов с рейтингом на фронтенде
Теперь нужно вывести отзывы с оценкой на сайте. Сделаем простой шаблон вывода с HTML и звездочками.
function wpkpi_display_reviews() {
$args = array(
'post_type' => 'wpkpi_review',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC'
);
$reviews = new WP_Query($args);
if ($reviews->have_posts()) {
echo '<div class="wpkpi-reviews">';
while ($reviews->have_posts()) {
$reviews->the_post();
$rating = get_post_meta(get_the_ID(), '_wpkpi_rating', true);
echo '<div class="wpkpi-review-item">';
echo '<h3>'.get_the_title().'</h3>';
echo '<div class="wpkpi-rating">'.wpkpi_get_rating_stars($rating).'</div>';
echo '<div class="wpkpi-review-content">'.get_the_content().''.'</div>';
echo '</div>';
}
echo '</div>';
} else {
echo 'Отзывы пока отсутствуют.';
}
wp_reset_postdata();
}
function wpkpi_get_rating_stars($rating) {
$rating = intval($rating);
$output = '';
for ($i = 1; $i <= 5; $i++) {
if ($i <= $rating) {
$output .= '<span style="color:#f5a623;">★</span>'; // звезда заполненная
} else {
$output .= '<span style="color:#ccc;">★</span>'; // пустая звезда
}
}
return $output;
}Вызвать wpkpi_display_reviews() можно в любом шаблоне, где нужно показать отзывы.
Добавляем форму отправки отзывов с AJAX
Чтобы пользователи могли оставлять отзывы прямо на сайте без перезагрузки, добавим форму с AJAX.
HTML формы:
<form id="wpkpi_review_form">
<label>Заголовок отзыва:</label><br>
<input type="text" name="title" required><br>
<label>Текст отзыва:</label><br>
<textarea name="content" required></textarea><br>
<label>Оценка (1-5):</label><br>
<input type="number" name="rating" min="1" max="5" required><br>
<button type="submit">Отправить</button>
</form>
<div id="wpkpi_review_message"></div>JavaScript для AJAX (лучше добавить в отдельный файл и подключить через wp_enqueue_script):
jQuery(document).ready(function($){
$('#wpkpi_review_form').on('submit', function(e){
e.preventDefault();
var data = {
action: 'wpkpi_submit_review',
title: $(this).find('input[name="title"]').val(),
content: $(this).find('textarea[name="content"]').val(),
rating: $(this).find('input[name="rating"]').val(),
security: wpkpi_ajax_object.nonce
};
$.post(wpkpi_ajax_object.ajax_url, data, function(response) {
$('#wpkpi_review_message').html(response.data.message);
if(response.success){
$('#wpkpi_review_form')[0].reset();
}
});
});
});PHP обработчик AJAX:
function wpkpi_ajax_submit_review() {
check_ajax_referer('wpkpi_ajax_nonce', 'security');
$title = sanitize_text_field($_POST['title']);
$content = sanitize_textarea_field($_POST['content']);
$rating = intval($_POST['rating']);
if (empty($title) || empty($content) || $rating < 1 || $rating > 5) {
wp_send_json_error(array('message' => 'Некорректные данные.'));
}
$new_review = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'pending', // чтобы админ проверил
'post_type' => 'wpkpi_review'
);
$post_id = wp_insert_post($new_review);
if (is_wp_error($post_id)) {
wp_send_json_error(array('message' => 'Ошибка при добавлении отзыва.'));
}
update_post_meta($post_id, '_wpkpi_rating', $rating);
wp_send_json_success(array('message' => 'Спасибо за отзыв! Он будет опубликован после проверки.'));
}
add_action('wp_ajax_wpkpi_submit_review', 'wpkpi_ajax_submit_review');
add_action('wp_ajax_nopriv_wpkpi_submit_review', 'wpkpi_ajax_submit_review');Не забудьте локализовать скрипт, передав ajax_url и nonce:
function wpkpi_enqueue_scripts() {
wp_enqueue_script('wpkpi-review-script', get_template_directory_uri() . '/js/wpkpi-review.js', array('jquery'), null, true);
wp_localize_script('wpkpi-review-script', 'wpkpi_ajax_object', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpkpi_ajax_nonce')
));
}
add_action('wp_enqueue_scripts', 'wpkpi_enqueue_scripts');Рекомендации по плагинам для расширения функционала
Если хочется более продвинутого функционала без написания собственного кода, рекомендую обратить внимание на следующие плагины:
- Expert Review — мощный плагин для отзывов с рейтингом и кастомной разметкой.
- Clearfy Pro — включает инструменты оптимизации и безопасности, полезно для защиты отзывов от спама.
Использование таких плагинов подойдет, если нужно быстро запустить отзывы с минимальными усилиями и получить готовые стили и функционал.
Заключение
Создание отзывов с оценкой на WordPress — задача, которую можно решить и самостоятельно, и с помощью плагинов. Если нужно гибкое, легковесное и кастомное решение, лучше писать функционал с нуля, как в примерах выше. Это даст свободу и понимание, как все устроено.
Если же хочется быстро и с расширенным функционалом, Expert Review — отличный выбор.
Главное — обеспечить удобство для пользователей и простоту управления отзывами в админке.