A
Aad B
10-11-2018 11:31
gewijzigd op 10-11-2018 11:35
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);
?>
Link gekopieerd
<?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?
Link gekopieerd
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)
Link gekopieerd
@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
Link gekopieerd
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.
Link gekopieerd
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.
Link gekopieerd
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;
}
Link gekopieerd
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.
Link gekopieerd