Last active
October 16, 2022 04:42
-
-
Save nvourva/aa47735e9ac2241403066c756ae8f94a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} |
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
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