Добавляем рейтинг записей к родной системе комментирования WordPress

Пишем плагин

Была поставлена задача, в которой требовалось в комментариях к постам пользователям проставлять рейтинг, затем этот рейтинг отображать в административной части, позволять его редактировать и рассчитывать средний рейтинг поста.

Для этого мы будем писать свой небольшой плагин.

Создаем в папке wp-content - plugin папку "extend-comment" в ней создаем файл extend-comment.php.

extend-comment.php

<?php
/*
Plugin Name: Расширенные комментарии
Version: 1.0
Plugin URI: 
Description: Плагин, добавляющий произвольные поля в форму комментариев.
Author: Udnlx
Author URI: https://udnlxportfolio.ru/
*/



// Добавляем поля для всех пользователей
add_action( 'comment_form_logged_in_after', 'extend_comment_custom_fields' );
add_action( 'comment_form_after_fields', 'extend_comment_custom_fields' );
function extend_comment_custom_fields() {

	echo '<p class="comment-form-rating">'.
			  '<label for="rating">'. __('Rating') . '<span class="required">*</span></label>
			  <span class="commentratingbox">';

	for( $i=1; $i <= 5; $i++ ){
		echo '
		<label class="commentrating" style="display:inline-block;">
			<input type="radio" name="rating" id="rating" value="'. $i .'"/> '. $i .'   
		</label>';
	}

	echo'</span></p>';
}



//Сохранение данных из полей во фронт-энде
add_action( 'comment_post', 'save_extend_comment_meta_data' );
function save_extend_comment_meta_data( $comment_id ){

	if( !empty( $_POST['rating'] ) ){
		$rating = intval($_POST['rating']);
		add_comment_meta( $comment_id, 'rating', $rating );
	}

}



// Проверяем, заполнено ли поле "Рейтинг"
add_filter( 'preprocess_comment', 'verify_extend_comment_meta_data' );
function verify_extend_comment_meta_data( $commentdata ) {

	// ничего не делаем если это ответ на комментарий
	if ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] === 'replyto-comment' ) {
		return $commentdata;
	}

	if ( empty( $_POST['rating'] ) || ! (int)$_POST['rating'] ) {
		wp_die( __( 'Error: You did not add a rating. Hit the Back button on your Web browser and resubmit your comment with a rating.' ) );
	}

	return $commentdata;
}



// Отображение содержимого метаполей во фронт-энде
add_filter( 'comment_text', 'modify_extend_comment');
function modify_extend_comment( $text ){

  $plugin_url_path = WP_PLUGIN_URL;

  if( $commenttitle = get_comment_meta( get_comment_ID(), 'title', true ) ) {
	$commenttitle = '<strong>' . esc_attr( $commenttitle ) . '</strong><br/>';
	$text = $commenttitle . $text;
  }

  if( $commentrating = get_comment_meta( get_comment_ID(), 'rating', true ) ) {
    if($commentrating == 1) {
        $commentrating = '<p class="comment-rating">★☆☆☆☆/p>';
    }
    if($commentrating == 2) {
        $commentrating = '<p class="comment-rating">★★☆☆☆</p>';
    }
    if($commentrating == 3) {
        $commentrating = '<p class="comment-rating">★★★☆☆</p>';
    }
    if($commentrating == 4) {
        $commentrating = '<p class="comment-rating">★★★★☆</p>';
    }
    if($commentrating == 5) {
        $commentrating = '<p class="comment-rating">★★★★★</p>';
    }
	$text = $text . $commentrating;
	return $text;
  } else {
	return $text;
  }
}



// Добавляем новый метабокс на страницу редактирования комментария
add_action( 'add_meta_boxes_comment', 'extend_comment_add_meta_box' );
function extend_comment_add_meta_box(){
	add_meta_box( 'title', __( 'Comment Metadata - Extend Comment' ), 'extend_comment_meta_box', 'comment', 'normal', 'high' );
}

// Отображаем наши поля
function extend_comment_meta_box( $comment ){
	$rating = get_comment_meta( $comment->comment_ID, 'rating', true );

	wp_nonce_field( 'extend_comment_update', 'extend_comment_update', false );
	?>
	<p>
		<label for="rating"><?php _e( 'Rating: ' ); ?></label>
		<span class="commentratingbox">
		<?php
		for( $i=1; $i <= 5; $i++ ){
		  echo '
		  <span class="commentrating">
			<input type="radio" name="rating" id="rating" value="'. $i .'" '. checked( $i, $rating, 0 ) .'/>
		  </span>';
		}
		?>
		</span>
	</p>
	<?php
}



//Сохранение метаполей в админке
add_action( 'edit_comment', 'extend_comment_edit_meta_data' );
function extend_comment_edit_meta_data( $comment_id ) {
	if( ! isset( $_POST['extend_comment_update'] ) || ! wp_verify_nonce( $_POST['extend_comment_update'], 'extend_comment_update' ) )
	return;

	if( !empty($_POST['rating']) ){
		$rating = intval($_POST['rating']);
		update_comment_meta( $comment_id, 'rating', $rating );
	}
	else
		delete_comment_meta( $comment_id, 'rating');

}

Создаем файл для его удаления uninstall.php.

uninstall.php

<?php
if( ! defined('WP_UNINSTALL_PLUGIN') ) exit;

global $wpdb;

$wpdb->query("DELETE FROM $wpdb->commentmeta WHERE meta_key IN ('rating')");

Далее переходим в админке в раздел плагины, где мы увидим наш плагин "Расширенные комментарии", активируем его. Это позволит уже пользователям в комментариях к посту проставлять рейтинг, а администратору при одобрении править как текст комментария, так и рейтинг.

Стилизацию и правку шаблонов формы комментария опишу в другой шпаргалке.

Для вывода коментариев на страницу воспользуемся шорт-кодом - <?php comments_template(); ?>

 

Выводим средний рейтинг поста

Для этого в нужном нам месте шаблона вывода поста вставляем такой код:

PHP

<?php
				echo ("Средний рейтинг");
				$id = get_the_id();
				$comments = get_approved_comments( $id );
				
				if ( $comments ) {
				$i = 0;
				$total = 0;
				foreach( $comments as $comment ){
					$rate = get_comment_meta( $comment->comment_ID, 'rating', true );
					//echo $rate;
					$total = $total + $rate;
					$i++;
				}
				//echo $total;
				//echo $i;
				$totalrating = round($total/$i,0);
				//echo $totalrating;
				
				if($totalrating == 1) {
				$dispaleystar = '<p class="comment-rating">★☆☆☆☆/p>';
				}
				if($totalrating == 2) {
				$dispaleystar = '<p class="comment-rating">★★☆☆☆/p>';
				}
				if($totalrating == 3) {
				$dispaleystar = '<p class="comment-rating">★★★☆☆</p>';
				}
				if($totalrating == 4) {
				$dispaleystar = '<p class="comment-rating">★★★★☆</p>';
				}
				if($totalrating == 5) {
				$dispaleystar = '<p class="comment-rating">★★★★★</p>';
				}
					  
				} else {
					$dispaleystar = '<p class="comment-rating">☆☆☆☆☆</p>';
				}
				
				echo $dispaleystar;
				
				//echo '<pre>';
				//print_r($comments);
				//echo '</pre>';
				?>

Этот код выведет средний рейтинг от всех рейтингов в комментариях если они есть.

Для того что бы вместо radioburron были звездочки немного модернизируем наши стили, код и скрипты. Здесь. 

Так же с моим портфолио можно ознакомиться на любой из представленной социальной сети, на своих страницах я публикую посты о своих работах, заданиях и целях.

Для связи со мной можно воспользоваться любой социальной сетью,
или написать на почту:

С моим резюме можно ознакомиться по ссылке:

© 2020-2024 Портфолио Юдина Александра г.Пенза. Все права защищены