Wie erhält man den Durchschnitt der Werte aus dem Kommentarmeta?

Ich habe den Kommentar Meta verwendet , um ein einfaches Bewertungssystem hinzuzufügen. Der Benutzer kann eine Rate aus dem Kommentarformular posten, von der ich 3 Dropdown-Kommentar-Meta hinzugefügt habe.

Das Rating funktioniert gut und spiegelt die Bewertungen zusammen mit dem Kommentar des Nutzers wider. Mein einziges Problem ist jetzt: Wie kann ich den Durchschnitt aller abgegebenen Bewertungen erhalten? Ich brauche den Durchschnittswert für den Post-Inhalt.

Mein Bewertungssystem bewertet Folgendes:

  • Preis,
  • Verpackung,
  • Qualität.

Ich möchte einen Durchschnitt für jede Rate:

  • Durchschnittspreis,
  • Durchschnittliche Verpackungsrate und
  • Durchschnittliche Qualitätsrate

Ich danke dir sehr!

Solutions Collecting From Web of "Wie erhält man den Durchschnitt der Werte aus dem Kommentarmeta?"

Wenn Sie die Durchschnittswerte im Inhalt anzeigen müssen, müssen Sie sie vorberechnen (bevor Sie die Kommentare anzeigen).

Mein Ansatz wäre eine benutzerdefinierte Meta in der Post mit den berechneten Durchschnittswerte und ändern Sie diese Metas jedes Mal, wenn ein neuer Kommentar (Bewertung) gespeichert wird.

Etwas wie

add_action("comment_post", "wpse16733_updateAVGs"); function wpse16733_updateAVGs($comment_ID, $approved){ if ($approved){ $commentdata=get_comment($comment_ID, ARRAY_A); $parent_post=get_post($commentdata['comment_post_ID']); (... get your rating, get post meta, calc and save ...) } } 

Ich habe etwas Ähnliches mit einer benutzerdefinierten Abfrage, um den Durchschnitt im laufenden Betrieb zu berechnen – nach Rabinos Kommentar wäre es effizienter, das Ergebnis dieser function als Meta-Wert zu speichern, aber ich möchte, dass es ausgetriggers wird, wenn ein Kommentar ist genehmigt, anstatt wenn ein Kommentar gespeichert wird.

Hier ist deine function:

 function average_rating() { global $wpdb; $post_id = get_the_ID(); $ratings = $wpdb->get_results(" SELECT $wpdb->commentmeta.meta_value FROM $wpdb->commentmeta INNER JOIN $wpdb->comments on $wpdb->comments.comment_id=$wpdb->commentmeta.comment_id WHERE $wpdb->commentmeta.meta_key='rating' AND $wpdb->comments.comment_post_id=$post_id AND $wpdb->comments.comment_approved =1 "); $counter = 0; $average_rating = 0; if ($ratings) { foreach ($ratings as $rating) { $average_rating = $average_rating + $rating->meta_value; $counter++; } //round the average to the nearast 1/2 point return (round(($average_rating/$counter)*2,0)/2); } else { //no ratings return 'no rating'; } } 

In meinem Zusammenhang habe ich eine Bewertung von 1-5. keine Ergebnisse der Abfrage bedeutet keine Bewertungen zur Verfügung gestellt.

Lass das folgende in die Schleife fallen und du kannst loslegen:

 < ?php echo average_rating(); ?> 
 function set_average_rating( $comment_id ) { $comment = get_comment( $comment_id ); global $wpdb; $rating = $wpdb->get_var(" SELECT AVG(meta_value) AS avg_rating FROM wp_commentmeta WHERE meta_key = 'rating' AND comment_id IN ( SELECT comment_id FROM wp_comments WHERE comment_post_ID = $comment->comment_post_ID AND comment_approved = 1 ) "); update_post_meta( $comment->comment_post_ID, 'avg_rating', round( $rating, 2 ) ); } add_action( 'comment_post', 'set_average_rating' ); 

Ähnlich der Antwort von PaulIsLoud, aber berechnet den Durchschnitt direkt in der Abfrage, anstatt die Ergebnisse zu wiederholen

Hier ist meine Version, basierend auf den beiden obigen Antworten. Es läuft auf wp_set_comment_status geändert, um zu approve .

calc_avg_rating() zählt Kommentare mit einem rating Feld (wenn ein Partuclar-Kommentar keine rating , geht es einfach weiter), und wenn ein neuer Kommentar genehmigt wird, aktualisiert er den Post-Meta-Wert von avg_rating .

Dann, für meine Vorlage, rufe ich einfach get_product_rating , was das Post-Meta-Feld von avg_rating , auf diese Weise berechnen wir nicht all dies jedes Mal, wenn die Seite geladen wird.

 add_action("wp_set_comment_status", "calc_average_rating"); function calc_average_rating($comment_ID, $approved) { if ($approved = 'approve'){ $commentdata=get_comment($comment_ID, ARRAY_A); $parent_post=get_post($commentdata['comment_post_ID']); global $wpdb; $post_id = $parent_post->ID; $ratings = $wpdb->get_results(" SELECT $wpdb->commentmeta.meta_value FROM $wpdb->commentmeta INNER JOIN $wpdb->comments on $wpdb->comments.comment_id=$wpdb->commentmeta.comment_id WHERE $wpdb->commentmeta.meta_key='rating' AND $wpdb->comments.comment_post_id=$post_id AND $wpdb->comments.comment_approved =1 "); $counter = 0; $average_rating = 0; if ($ratings) { foreach ($ratings as $rating) { $average_rating = $average_rating + $rating->meta_value; $counter++; } //round the average to the nearast 1/2 point $rating = (round(($average_rating/$counter)*2,0)/2); } else { //no ratings $rating = ''; } update_post_meta($post_id, 'avg_rating', $rating); } } function get_product_rating() { $post_id = get_the_ID(); $value = get_post_meta($post_id, 'avg_rating', true); return $value; } 

Hoffe das hilft jemandem!

Dies ist eine Lösung, die den Durchschnitt nach dem letzten Kommentar anzeigt. have_comments() Sie einfach zwei have_comments() Kommentare have_comments() und die durchschnittliche Bewertung mit der ersten Schleife berechnen und die Kommentare mit der zweiten Schleife anzeigen.

 /** * You need to place this function inside your comments callback function, so it get's * triggered with every displayed comment inside the have_comments() loop. */ function wpse16733_get_comment_meta_avrg() { $divider = (int) $GLOBALS['wp_query']->comment_count; // initial static values - these get counted up everytime the function get's triggered static $price = 0; static $packaging = 0; static $quality = 0; static $current_comment = 0; $current_comment = (int) $current_comment++; // receive all comment meta data $all_meta = get_comment_meta( get_comment_ID(), '' ); // Now get the ratings (it could also be `$avrg_xy = $all_meta->rating` if an object) $price = (int) $price + (int) $all_meta['price']; $packaging = (int) $packaging + (int) $all_meta['packaging']; $quality = (int) $quality + (int) $all_meta['quality']; // calculate within the last comment if ( $current_comment == $divider ) { $average['price'] = $price / $divider; $average['packaging'] = $packaging / $divider; $average['quality'] = $quality / $divider; } // now do stuff with the $average array foreach ( $average as $rating ) { echo 'This is the average rating: '.$rating; } }