it-swarm.com.de

So ermitteln Sie den Durchschnitt der Werte aus dem Kommentar-Meta

Ich habe das Kommentar-Meta verwendet, um ein einfaches Bewertungssystem hinzuzufügen. Der Benutzer kann eine Bewertung über das Kommentarformular veröffentlichen, von dem aus ich 3 Dropdown-Kommentar-Meta hinzugefügt habe.

Die Bewertung funktioniert gut und spiegelt die Bewertungen zusammen mit dem Kommentar des Benutzers wider. Mein einziges Problem ist jetzt folgendes: Wie kann ich den Durchschnitt aller abgegebenen Bewertungen ermitteln? Ich brauche den Durchschnitt, um auf den Beitragsinhalt gesetzt zu werden.

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!

2
user5233

Wenn Sie die Durchschnittswerte im Inhalt anzeigen möchten, müssen Sie sie vorab berechnen (bevor Sie die Kommentare anzeigen).

Mein Ansatz wäre, ein benutzerdefiniertes Meta mit den berechneten Durchschnittswerten im Beitrag zu haben und diese Metas jedes Mal zu ändern, wenn ein neuer Kommentar (eine neue Bewertung) gespeichert wird.

So 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 ...)

    }
}
4
MZAweb

Ich habe etwas Ähnliches mit einer benutzerdefinierten Abfrage, um den Durchschnitt im Handumdrehen zu berechnen. Gemäß Rabinos Kommentar wäre es effizienter, das Ergebnis dieser Funktion als Metawert zu speichern, aber ich möchte, dass es ausgelöst wird, wenn ein Kommentar erstellt wird genehmigt, anstatt wenn ein Kommentar gespeichert wird.

hier ist deine Funktion:

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 Kontext habe ich eine 1-5 Bewertung. Keine Ergebnisse der Abfrage bedeuten, dass keine Bewertungen bereitgestellt wurden.

Lass das Folgende in der Schleife und du kannst loslegen:

<?php echo average_rating(); ?>
3
elleeott
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' );

Entspricht der Antwort von PaulIsLoud, berechnet jedoch den Durchschnitt direkt in der Abfrage, anstatt die Ergebnisse zu iterieren

2
Alex

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

calc_avg_rating() zählt Kommentare mit einem Feld von rating (wenn ein einzelner Kommentar keine rating enthält, wird er einfach fortgesetzt), und wenn ein neuer Kommentar genehmigt wird, wird der Post-Meta-Wert von avg_rating aktualisiert.

Dann rufe ich für meine Vorlage einfach get_product_rating auf, wobei das Post-Meta-Feld von avg_rating angezeigt wird. Auf diese Weise wird dies nicht jedes Mal berechnet, 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!

1
PaulIsLoud

Dies ist eine Lösung, bei der der Durchschnitt nach dem letzten Kommentar angezeigt wird. Um dieses Problem zu umgehen, können Sie einfach zwei have_comments() comments-Schleifen ausführen 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;
}
}
0
kaiser