Skip to content
Advertisement

Transition of Woocommerce Percentage Review Chart to Numeric

On my website’s homepage, I use a chart that counts all Woocommerce reviews. These reviews are shown as a percentage for each rating (1 star, 2 star etc …). I need to change functionality to the total number of ratings for each rating section instead of the percentage and display stars instead of labels.

Any advice?

Now:

enter image description here

Goal:
enter image description here

Code of the graph:

function display_all_product_review_histogram($minimum_rating, $maximum_rating){
    
    $all_product_review_average_rating = get_all_product_review_average_rating($minimum_rating, $maximum_rating);
    $total_ratings = $all_product_review_average_rating[0]["total_ratings"];

    $get_all_product_review_counts_by_ratings = get_all_product_review_counts_by_ratings($minimum_rating, $maximum_rating);

    if($get_all_product_review_counts_by_ratings){
        $output = '';
        $sum = 0;
        $total = 0;
        $raw_percentages_array = array();
        $percentages_array = array();

        //When working with rounded percentages, we must make sure the total percentages add up to 100%.
        //Creating array of rating values and its percentage
        foreach ($get_all_product_review_counts_by_ratings as $key => $rating) {
            $percentage = round($rating["amount"] / $total_ratings, 2) * 100;
            $raw_percentages_array[] = array("value" => $rating["value"], "percent_of_total" => $percentage);
        }
        //Counting the total of our percents
        foreach($raw_percentages_array as $key => $percent) {
            $total += $percent[ "percent_of_total" ];
        }
        //Creating an array that will have the actual percentages after the rounding has been applied to it.
        //This will help to see if we have 100% or we are not aligned
        foreach($raw_percentages_array as $key => $percent){
            $percentages_array[$percent["value"]] = round(($percent["percent_of_total"]/$total) * 100, 0);
        }
        $sum = array_sum($percentages_array); //Again counting the total of our new percents to see if it adds up to 100%

        if($sum != 100){ //If we do not have 100%, then we will alter the highest percentage value so that we get a total of 100%
            $highest_percentage_key = array_keys($percentages_array, max($percentages_array)); //Getting key of the highest percentage value
            $percentages_array[$highest_percentage_key[0]] = 100 - ($sum - max($percentages_array)); //Alterning the percentage
        }

        //Now we are ready to create the output that will give us 100% in total
        $output .= "<div class='product-review-histogram'>";
        foreach ($percentages_array as $key => $percentage) {
            $output .= "<div class='histogram-row star-rating-". $key ."'>";
            $output .= "<div class='histogram-col-1'>". $key ." star</div>";
            $output .= "<div class='histogram-col-2'><div class='histogram-meter-bar'><div class='histogram-bar-temperature' style='width: ". $percentage ."%'></div></div></div>";
            $output .= "<div class='histogram-col-3'>". $percentage ."%</div>";
            $output .= "</div>";
        }
        $output .= "</div>";

        return $output;
    }else{
        return;
    }
}

Advertisement

Answer

function display_all_product_review_histogram($minimum_rating, $maximum_rating){
    
    $all_product_review_average_rating = get_all_product_review_average_rating($minimum_rating, $maximum_rating);
    $total_ratings = $all_product_review_average_rating[0]["total_ratings"];

    $get_all_product_review_counts_by_ratings = get_all_product_review_counts_by_ratings($minimum_rating, $maximum_rating);

    if($get_all_product_review_counts_by_ratings){
        $output = '';
        $sum = 0;
        $total = 0;
        $raw_percentages_array = array();
        $percentages_array = array();

        //When working with rounded percentages, we must make sure the total percentages add up to 100%.
        //Creating array of rating values and its percentage
        foreach ($get_all_product_review_counts_by_ratings as $key => $rating) {
            $percentage = round($rating["amount"] / $total_ratings, 2) * 100;
            $raw_percentages_array[] = array("value" => $rating["value"], "percent_of_total" => $percentage, 'amount'=> $rating["amount"]);
        }
        //Counting the total of our percents
        foreach($raw_percentages_array as $key => $percent) {
            $total += $percent[ "percent_of_total" ];
        }
        //Creating an array that will have the actual percentages after the rounding has been applied to it.
        //This will help to see if we have 100% or we are not aligned
        foreach($raw_percentages_array as $key => $percent){
            $percentages_array[$percent["value"]] = round(($percent["percent_of_total"]/$total) * 100, 0);
        }
        $sum = array_sum($percentages_array); //Again counting the total of our new percents to see if it adds up to 100%

        if($sum != 100){ //If we do not have 100%, then we will alter the highest percentage value so that we get a total of 100%
            $highest_percentage_key = array_keys($percentages_array, max($percentages_array)); //Getting key of the highest percentage value
            $percentages_array[$highest_percentage_key[0]] = 100 - ($sum - max($percentages_array)); //Alterning the percentage
        }

        //Now we are ready to create the output that will give us 100% in total
        $r_count = 0;
        $output .= "<div class='product-review-histogram'>";
        foreach ($percentages_array as $key => $percentage) {
            $output .= "<div class='histogram-row star-rating-". $key ."'>";
            $output .= "<div class='histogram-col-1'>". $key ." star</div>";
            $output .= "<div class='histogram-col-2'><div class='histogram-meter-bar'><div class='histogram-bar-temperature' style='width: ". $percentage ."%'></div></div></div>";
            $output .= "<div class='histogram-col-3'>". $raw_percentages_array[$r_count]['amount'] ."</div>";
            $output .= "</div>";
            $r_count++;
        }
        $output .= "</div>";

        return $output;
    }else{
        return;
    }
}
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement