Skip to content

Instantly share code, notes, and snippets.

@nvourva
Last active October 16, 2022 04:42
Show Gist options
  • Select an option

  • Save nvourva/aa47735e9ac2241403066c756ae8f94a to your computer and use it in GitHub Desktop.

Select an option

Save nvourva/aa47735e9ac2241403066c756ae8f94a to your computer and use it in GitHub Desktop.
<?php
/*
Plugin Name: CI Comment Rating
Description: Adds a star rating system to WordPress comments
Version: 1.0.0
Author: The CSSIgniter Team
Author URI: https://cssigniter.com/
*/
//Enqueue the plugin's styles.
add_action( 'wp_enqueue_scripts', 'ci_comment_rating_styles' );
function ci_comment_rating_styles() {
wp_register_style( 'ci-comment-rating-styles', plugins_url( '/', __FILE__ ) . 'assets/style.css' );
wp_enqueue_style( 'dashicons' );
wp_enqueue_style( 'ci-comment-rating-styles' );
}
//Create the rating interface.
add_action( 'comment_form_logged_in_after', 'ci_comment_rating_rating_field' );
add_action( 'comment_form_after_fields', 'ci_comment_rating_rating_field' );
function ci_comment_rating_rating_field () {
?>
<label for="rating">Rating<span class="required">*</span></label>
<fieldset class="comments-rating">
<span class="rating-container">
<?php for ( $i = 5; $i >= 1; $i-- ) : ?>
<input type="radio" id="rating-<?php echo esc_attr( $i ); ?>" name="rating" value="<?php echo esc_attr( $i ); ?>" /><label for="rating-<?php echo esc_attr( $i ); ?>"><?php echo esc_html( $i ); ?></label>
<?php endfor; ?>
<input type="radio" id="rating-0" class="star-cb-clear" name="rating" value="0" /><label for="rating-0">0</label>
</span>
</fieldset>
<?php
}
//Save the rating submitted by the user.
add_action( 'comment_post', 'ci_comment_rating_save_comment_rating' );
function ci_comment_rating_save_comment_rating( $comment_id ) {
if ( ( isset( $_POST['rating'] ) ) && ( '' !== $_POST['rating'] ) )
$rating = intval( $_POST['rating'] );
add_comment_meta( $comment_id, 'rating', $rating );
}
//Make the rating required.
add_filter( 'preprocess_comment', 'ci_comment_rating_require_rating' );
function ci_comment_rating_require_rating( $commentdata ) {
if ( ! isset( $_POST['rating'] ) || 0 === intval( $_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;
}
//Display the rating on a submitted comment.
add_filter( 'comment_text', 'ci_comment_rating_display_rating');
function ci_comment_rating_display_rating( $comment_text ){
if ( $rating = get_comment_meta( get_comment_ID(), 'rating', true ) ) {
$stars = '<p class="stars">';
for ( $i = 1; $i <= $rating; $i++ ) {
$stars .= '<span class="dashicons dashicons-star-filled"></span>';
}
$stars .= '</p>';
$comment_text = $comment_text . $stars;
return $comment_text;
} else {
return $comment_text;
}
}
// Collect post dating data.
function ci_comment_rating_get_ratings_data( $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 );
if( isset( $rate ) && '' !== $rate ) {
$i++;
$total += $rate;
}
}
if ( 0 === $i ) {
return false;
} else {
return $rating_data = array(
'reviews' => $i,
'total' => $total,
);
}
} else {
return false;
}
}
//Display the average rating above the content.
add_filter( 'the_content', 'ci_comment_rating_display_average_rating' );
function ci_comment_rating_display_average_rating( $content ) {
global $post;
if ( false === ci_comment_rating_get_ratings_data( $post->ID ) ) {
return $content;
}
$stars = '';
$rating_data = ci_comment_rating_get_ratings_data( $post->ID );
$average = round( $rating_data['total'] / $rating_data['reviews'], 1 );;
for ( $i = 1; $i <= $average + 1; $i++ ) {
$width = intval( $i - $average > 0 ? 20 - ( ( $i - $average ) * 20 ) : 20 );
if ( 0 === $width ) {
continue;
}
$stars .= '<span style="overflow:hidden; width:' . $width . 'px" class="dashicons dashicons-star-filled"></span>';
if ( $i - $average > 0 ) {
$stars .= '<span style="overflow:hidden; position:relative; left:-' . $width .'px;" class="dashicons dashicons-star-empty"></span>';
}
}
$custom_content = '<p class="average-rating">This post\'s average rating is: ' . $average .' ' . $stars .' calculated from '. $rating_data['reviews'] .' reviews.</p>';
$custom_content .= $content;
return $custom_content;
}
@solihr

solihr commented Aug 20, 2021

Copy link
Copy Markdown

Hi.. i love this plugin, but I got an error when trying to submit a comment as a guest
Notice: Trying to get property 'comment_ID' of non-object in xxx/xxx/wp-includes/comment-template.php on line 677
Warning: Cannot modify header information - headers already sent by (output started at xxx/xxx/wp-includes/comment-template.php:677) in xxx/xxx/wp-includes/comment.php on line 577
Warning: Cannot modify header information - headers already sent by (output started at xxx/xxx/wp-includes/comment-template.php:677) in xxx/xxx/wp-includes/comment.php on line 578
Warning: Cannot modify header information - headers already sent by (output started at xxx/xxx/wp-includes/comment-template.php:677) in xxx/xxx/wp-includes/comment.php on line 579
Warning: Cannot modify header information - headers already sent by (output started at xxx/xxx/wp-includes/comment-template.php:677) in xxx/xxx/wp-includes/pluggable.php on line 1340
Warning: Cannot modify header information - headers already sent by (output started at xxx/xxx/wp-includes/comment-template.php:677) in xxx/xxx/wp-includes/pluggable.php on line 1343

Can you help?
Thanks

@kajiacharya

Copy link
Copy Markdown

How to display the average rating custom place.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment