Origin commit
This commit is contained in:
169
inc/rating/class-opalestate-rating-helper.php
Executable file
169
inc/rating/class-opalestate-rating-helper.php
Executable file
@@ -0,0 +1,169 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Class Opalestate_Rating_Helper
|
||||
*/
|
||||
class Opalestate_Rating_Helper {
|
||||
public static function get_average_rating( $comment, $cpt_feature ) {
|
||||
$features = static::get_features( $cpt_feature );
|
||||
if ( $features ) {
|
||||
$sum = 0;
|
||||
foreach ( $features as $feature_slug => $feature_title ) {
|
||||
$sum += absint( get_comment_meta( $comment->comment_ID, $cpt_feature . '_' . $feature_slug, true ) );
|
||||
}
|
||||
|
||||
$average = number_format( $sum / count( $features ), 1 );
|
||||
} else {
|
||||
$average = absint( get_comment_meta( $comment->comment_ID, 'opalestate_rating', true ) );
|
||||
}
|
||||
|
||||
return $average;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get property rating for a property. Please note this is not cached.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public static function get_average_rating_for_post( $post_id, $cpt_feature ) {
|
||||
$comments = get_comments( [ 'post_id' => $post_id, 'status' => 'approve' ] );
|
||||
if ( ! $comments ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$sum = 0;
|
||||
foreach ( $comments as $comment ) {
|
||||
$sum += static::get_average_rating( $comment, $cpt_feature );
|
||||
}
|
||||
|
||||
return number_format( $sum / static::get_review_count_for_post( $post_id ), 2 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get property review count for a property (not replies). Please note this is not cached.
|
||||
*/
|
||||
public static function get_review_count_for_post( $post_id ) {
|
||||
global $wpdb;
|
||||
|
||||
$count = $wpdb->get_var(
|
||||
$wpdb->prepare(
|
||||
"
|
||||
SELECT COUNT(*) FROM $wpdb->comments
|
||||
WHERE comment_parent = 0
|
||||
AND comment_post_ID = %d
|
||||
AND comment_approved = '1'
|
||||
",
|
||||
$post_id
|
||||
)
|
||||
);
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get property rating count for a property. Please note this is not cached.
|
||||
*/
|
||||
public static function get_rating_counts_for_post( $post_id, $cpt_feature ) {
|
||||
$features = static::get_features( $cpt_feature );
|
||||
if ( $features ) {
|
||||
return static::get_review_count_for_post( $post_id ) * count( $features );
|
||||
}
|
||||
|
||||
return static::get_review_count_for_post( $post_id );
|
||||
}
|
||||
|
||||
public static function get_rating_count_stats_for_post( $post_id, $cpt_feature ) {
|
||||
$output = [
|
||||
5 => 0,
|
||||
4 => 0,
|
||||
3 => 0,
|
||||
2 => 0,
|
||||
1 => 0,
|
||||
];
|
||||
|
||||
$features = static::get_features( $cpt_feature );
|
||||
|
||||
for ( $i = 5; $i >= 1; $i-- ) {
|
||||
$args = [
|
||||
'post_id' => $post_id,
|
||||
'count' => true,
|
||||
'status' => 'approve',
|
||||
];
|
||||
|
||||
if ( $features ) {
|
||||
$features_query = [];
|
||||
foreach ( $features as $feature_slug => $feature_title ) {
|
||||
$features_query[] = [
|
||||
'key' => $cpt_feature . '_' . $feature_slug,
|
||||
'value' => $i,
|
||||
];
|
||||
}
|
||||
$args['meta_query'] = $features_query;
|
||||
$args['meta_query']['relation'] = 'OR';
|
||||
} else {
|
||||
$args['meta_query'] = [
|
||||
[
|
||||
'key' => 'opalestate_rating',
|
||||
'value' => $i,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$output[ $i ] = get_comments( $args );
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public static function get_rating_average_stats_by_features_for_post( $post_id, $cpt_feature, $meta_prefix ) {
|
||||
global $wpdb;
|
||||
|
||||
$output = [];
|
||||
$count = get_post_meta( $post_id, $meta_prefix . 'review_count', true );
|
||||
$features = static::get_features( $cpt_feature );
|
||||
|
||||
if ( ! $features || ! $count ) {
|
||||
return $output;
|
||||
}
|
||||
|
||||
foreach ( $features as $feature_slug => $feature_title ) {
|
||||
$meta_key = $cpt_feature . '_' . $feature_slug;
|
||||
|
||||
$ratings = $wpdb->get_var(
|
||||
$wpdb->prepare(
|
||||
"
|
||||
SELECT SUM(meta_value) FROM $wpdb->commentmeta
|
||||
LEFT JOIN $wpdb->comments ON $wpdb->commentmeta.comment_id = $wpdb->comments.comment_ID
|
||||
WHERE meta_key = %s
|
||||
AND comment_post_ID = %d
|
||||
AND comment_approved = '1'
|
||||
AND meta_value > 0
|
||||
",
|
||||
$meta_key,
|
||||
$post_id
|
||||
)
|
||||
);
|
||||
$average = number_format( $ratings / $count, 2, '.', '' );
|
||||
$output[ $feature_slug ] = $average;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public static function get_features( $cpt_feature, $posts_per_page = -1 ) {
|
||||
$args = [
|
||||
'post_type' => $cpt_feature,
|
||||
'post_status' => 'publish',
|
||||
'posts_per_page' => $posts_per_page,
|
||||
'order' => 'ASC',
|
||||
'orderby' => 'meta_value_num',
|
||||
'meta_key' => 'opalestate_feature_order',
|
||||
];
|
||||
|
||||
$features = get_posts( $args );
|
||||
|
||||
return wp_list_pluck( $features, 'post_title', 'post_name' );
|
||||
}
|
||||
}
|
||||
|
||||
new Opalestate_Rating_Helper();
|
||||
Reference in New Issue
Block a user