Hallo,

Voor een website die ik ontwerp probeer ik een algemene review teller / gemiddelde in te voegen. Ik heb een script hiervoor gevonden op internet want ik ben zelf geen PHP held, maar nu probeer ik het getal te laten tonen met 2 decimalen maar dit lukt niet echt.

return '<p class="rating-average">'.round($average / $total_count, 2).' / 5 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';

De ,2 na de total_count zou toch eigenlijk betekenen dat de round functie wordt gebruikt met 2 decimalen? Iemand enig idee waarom dit niet werkt?

Mvg,

Raf Rasenberg
Waar staan je php tags? Geef eventueel wat meer code en zorg dat de round als allerlaatste gedaan wordt, dus na de /5
[code]
<?php
$average = 12345,678;
$total_count = 50;
echo round(($average / $total_count)/5,2);
?>

<?php
function get_total_reviews_count(){
    return get_comments(array(
        'status'   => 'approve',
        'post_status' => 'publish',
        'post_type'   => 'product',
        'count' => true
    ));
}

function get_products_ratings(){
    global $wpdb;

    return $wpdb->get_results("
        SELECT t.slug, tt.count
        FROM {$wpdb->prefix}terms as t
        JOIN {$wpdb->prefix}term_taxonomy as tt ON tt.term_id = t.term_id
        WHERE t.slug LIKE 'rated-%' AND tt.taxonomy LIKE 'product_visibility'
        ORDER BY t.slug
    ");
}

function products_count_by_rating_html(){
    $star = 1;
    $html = '';
    foreach( get_products_ratings() as $values ){
        $star_text = '<strong>'.$star.' '._n('Star', 'Stars', $star, 'woocommerce').'<strong>: ';
        $html .= '<li class="'.$values->slug.'">'.$star_text.$values->count.'</li>';
        $star++;
    }
    return '<ul class="products-rating">'.$html.'</ul>';
}

function products_rating_average_html(){
    $stars = 1;
    $average = 0;
    $total_count = 0;
    if( sizeof(get_products_ratings()) > 0 ) :
        foreach( get_products_ratings() as $values ){
            $average += $stars * $values->count;
            $total_count += $values->count;
            $stars++;
        }
        return '<p class="rating-average">'.round($average / $total_count, 2).' / 5 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}
?>




[size=xsmall]Toevoeging op 10/11/2018 11:37:44:[/size]

Het volledige script.

[size=xsmall]Toevoeging op 10/11/2018 11:39:43:[/size]

Waar zal ik nu deze ,2 moeten plaatsen?
Als het om de weergave gaat kun je beter number_format() gebruiken. Die rond ook af, maar zorgt ook meteen voor de juiste weergave ("5" wordt "5.00")

number_format($average / $total_count, 2)
@Rob dit heeft gewerkt. Bedankt voor de hulp!

[size=xsmall]Toevoeging op 10/11/2018 15:47:20:[/size]

Net even wat reviews toegevoegd, maar ik zie dat het nog steeds wordt afgerond. Terwijl ik round heb weggehaald. Hoe komt dit?

[size=xsmall]Toevoeging op 10/11/2018 19:13:17:[/size]

Ik wil het dus niet laten afronden, maar gewoon 1 decimaal tonen. Hoe doe ik dit?

[size=xsmall]Toevoeging op 10/11/2018 19:13:52:[/size]

Bump
number_format($average / $total_count, 1)

Hiermee wordt afgerond op 1 cijfer achter de komma. Als $average = 15 en $total_count = 4, dan zal er "3.8" uit komen.

Laat anders je aangepaste code eens zien.

function products_rating_average_html(){
    $stars = 1;
    $average = 0;
    $total_count = 0;
    if( sizeof(get_products_ratings()) > 0 ) :
        foreach( get_products_ratings() as $values ){
            $average += $stars * $values->count;
            $total_count += $values->count;
            $stars++;
        }
        return '<p class="rating-average">'.number_format($average / $total_count, 1).' / 5.0 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}


Dit is de code die ik nu gebruik, zoals jij zei heb ik de number_format gebruikt.

[size=xsmall]Toevoeging op 10/11/2018 19:29:26:[/size]



Een screenshot hoe ik het nu zie op de front-end.

[size=xsmall]Toevoeging op 10/11/2018 19:33:36:[/size]

Ik heb nu bijvoorbeeld 1 reactie weggehaald. Er zijn 3 reviews
5+4+2=11 /3 = 3.66

Maar ik zie nu 4.0 staan.
Die berekening die daar staat klopt niet. Met 5/4/2 als values->count krijg ik:
- $stars = 1; $values->count = 5 -> $average += 1*5 = 5; $total_count += 5 = 5;
- $stars = 2; $values->count = 4 -> $average += 2*4 = 13; $total_count += 4 = 9;
- $stars = 3; $values->count = 2 -> $average += 3*2 = 19; $total_count += 2 = 11;

number_format($average / $total_count, 1) = "1.7" (dus ook niet "4.0", misschien staan de ratings in een andere volgorde).

Wat het volgens mij moet zijn is:

function products_rating_average_html(){
    $total = 0;
    $total_count = 0;
    if( sizeof($ratings = get_products_ratings()) > 0 ) :
        //ik sla get_products_ratings() in $ratings om te voorkomen dat je alles dubbel doet (m.n. queries)
        foreach( $ratings as $values ) $total += $values->count; //totaal van de score
        $total_count = count($ratings); //totaal aantal ratings
        return '<p class="rating-average">'.number_format($total / $total_count, 1).' / 5.0 '. __('<i class="fa fa-star" style="font-size:25px;color:#0BBBEF"></i> STERREN').'</p>';
    else :
        return '<p class="rating-average">'. __('No reviews yet', 'woocommerce').'</p>';
    endif;
}
Misschien is de filosofie dat latere ratings (meer recent?) zwaarder wegen dan ratings in het verleden? Desalniettemin zou het inderdaad handig zijn als er in annotatie of documentatie wat toelichting kan worden gegeven over de betekenis van het eerder geplaatste codefragment. Is dit zo aangeleverd door een externe partij?

Het fragment van @Rob klinkt veel meer rechttoe rechtaan.

Reageren