В этой статье разберём, как реализовать на сайте WordPress собственную систему отзывов с оценками без установки дополнительных плагинов. Такой подход позволит избежать излишних нагрузок и конфликтов, а также получить полностью кастомизированный функционал под ваши нужды.
Почему стоит сделать отзывы с оценками без плагинов
Многие популярные плагины отзывов часто перегружают сайт, создают ненужные таблицы в базе и могут конфликтовать с другими компонентами. Создавая свою систему, вы получаете:
- Минимум зависимостей и лишнего кода.
- Лёгкую кастомизацию под уникальный дизайн.
- Понимание каждого шага работы системы.
Это особенно удобно для сайтов с нестандартными требованиями или когда хочется максимально контролировать процесс.
Создание таблицы для хранения отзывов и оценок в базе данных WordPress
Для начала создадим таблицу в базе данных, куда будем сохранять отзывы. Используем функцию активации темы или плагина для создания таблицы с префиксом WordPress.
function wordpressa_create_reviews_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wordpressa_reviews';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id bigint(20) NOT NULL,
user_name varchar(100) NOT NULL,
user_email varchar(100) NOT NULL,
review_text text NOT NULL,
rating tinyint(1) NOT NULL,
review_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( __FILE__, 'wordpressa_create_reviews_table' );Здесь мы создаём таблицу с полями для ID отзыва, ID поста, имени и email пользователя, текстом отзыва, рейтингом (от 1 до 5) и датой.
Вывод формы для добавления отзыва с оценкой на странице записи
Добавим форму в шаблон single.php или через шорткод, чтобы пользователи могли оставить отзыв.
function wordpressa_display_review_form( $post_id ) {
if ( ! is_user_logged_in() ) {
echo '<p>Пожалуйста, войдите, чтобы оставить отзыв.</p>';
return;
}
?>
<form method="post" class="wordpressa-review-form">
<input type="hidden" name="post_id" value="<?php echo esc_attr($post_id); ?>" />
<p><label>Ваше имя:</label><br />
<input type="text" name="user_name" required /></p>
<p><label>Ваш email:</label><br />
<input type="email" name="user_email" required /></p>
<p><label>Оценка (1-5):</label><br />
<select name="rating" required>
<option value="">-- выберите --</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select></p>
<p><label>Отзыв:</label><br />
<textarea name="review_text" rows="5" required></textarea></p>
<p><input type="submit" name="wordpressa_submit_review" value="Отправить отзыв" /></p>
</form>
<?php
}Форма содержит поля для имени, email, рейтинга и текста отзыва. Проверка авторизации нужна, чтобы избежать спама.
Обработка и сохранение отзывов в базе данных
Добавим обработчик, который сохранит данные после отправки формы.
function wordpressa_handle_review_submission() {
if ( isset($_POST['wordpressa_submit_review']) ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wordpressa_reviews';
$post_id = intval($_POST['post_id']);
$user_name = sanitize_text_field($_POST['user_name']);
$user_email = sanitize_email($_POST['user_email']);
$review_text = sanitize_textarea_field($_POST['review_text']);
$rating = intval($_POST['rating']);
if ( $post_id && $user_name && $user_email && $review_text && $rating >= 1 && $rating <= 5 ) {
$wpdb->insert(
$table_name,
[
'post_id' => $post_id,
'user_name' => $user_name,
'user_email' => $user_email,
'review_text' => $review_text,
'rating' => $rating,
'review_date' => current_time('mysql')
],
[ '%d', '%s', '%s', '%s', '%d', '%s' ]
);
echo '<p>Спасибо за ваш отзыв!</p>';
} else {
echo '<p>Пожалуйста, заполните все поля корректно.</p>';
}
}
}
add_action('wp', 'wordpressa_handle_review_submission');Обратите внимание на очистку и валидацию данных. Это минимальный уровень безопасности.
Вывод отзывов и средней оценки на странице записи
Теперь выведем все отзывы для текущего поста и посчитаем средний рейтинг.
function wordpressa_display_reviews( $post_id ) {
global $wpdb;
$table_name = $wpdb->prefix . 'wordpressa_reviews';
$reviews = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $table_name WHERE post_id = %d ORDER BY review_date DESC", $post_id) );
if ( ! $reviews ) {
echo '<p>Отзывов пока нет.</p>';
return;
}
$total_rating = 0;
$count = count($reviews);
echo '<div class="wordpressa-reviews">';
echo '<h3>Отзывы (' . $count . ')</h3>';
foreach ( $reviews as $review ) {
$total_rating += $review->rating;
echo '<div class="wordpressa-review-item">';
echo '<strong>' . esc_html( $review->user_name ) . '</strong> — <em>' . esc_html( date('d.m.Y', strtotime($review->review_date)) ) . '</em><br/>';
echo '<span>Оценка: ' . intval($review->rating) . '/5</span><br/>';
echo '<p>' . esc_html( $review->review_text ) . '</p>';
echo '</div>';
}
$average = round($total_rating / $count, 2);
echo '<p><strong>Средняя оценка: ' . $average . ' / 5</strong></p>';
echo '</div>';
}Выводите вызов wordpressa_display_reviews(get_the_ID()); под контентом записи.
Дополнительные советы и улучшения
1. Добавьте проверку nonce и капчу для защиты от спама.
2. Сделайте AJAX-отправку формы для улучшения UX.
3. Добавьте пагинацию для отзывов при большом их количестве.
4. Добавьте возможность модерации отзывов через админку WordPress.
5. Используйте пользовательские роли и права для ограничения доступа.
Если хотите расширить функционал, можно посмотреть на плагины как Clearfy Pro, который частично оптимизирует работу и безопасность сайта.
Таким образом, вы получите лёгкую, удобную и кастомную систему отзывов с рейтингом, полностью контролируемую вами, без лишних плагинов.