Была поставлена задача, в которой требовалось в комментариях к постам пользователям проставлять рейтинг, затем этот рейтинг отображать в административной части, позволять его редактировать и рассчитывать средний рейтинг поста.
Для этого мы будем писать свой небольшой плагин.
Создаем в папке 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 были звездочки немного модернизируем наши стили, код и скрипты. Здесь.