Cómo obtener el promedio de los valores del meta del comentario

2

Utilicé el comentario meta para agregar un sistema simple de calificación . El usuario puede publicar una tasa desde el formulario de comentarios desde donde agregué 3 meta de comentarios desplegables.

La calificación está funcionando bien, reflejando las calificaciones junto con el comentario escrito por el usuario. Mi único problema ahora es el siguiente: ¿cómo puedo obtener el promedio de todas las calificaciones publicadas? Necesito el promedio para ser colocado en el contenido de la publicación.

Mi sistema de clasificación califica lo siguiente:

  • Precio,
  • Embalaje,
  • Calidad.

Quiero un promedio para cada tarifa:

  • Tarifa de precio promedio,
  • Tasa de empaquetado promedio, y
  • Índice de calidad promedio.

¡Muchas gracias!

    
pregunta user5233 09.05.2011 - 11:01

5 respuestas

4

Si necesita mostrar los promedios en el contenido, necesita calcularlos previamente (antes de mostrar los comentarios).

Mi enfoque sería tener un meta personalizado en la publicación con los promedios calculados y modificar esas metas cada vez que se guarde un nuevo comentario (calificación).

Algo como

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

    }
}
    
respondido por el MZAweb 09.05.2011 - 17:18
3

Tengo algo similar al usar una consulta personalizada para calcular el promedio sobre la marcha: según el comentario de Rabino, sería más eficiente almacenar el resultado de esta función como un valor meta, pero me gustaría que se activara cuando se aprueba un comentario, en lugar de cuando se guarda un comentario.

Aquí está tu función:

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';
    }
}

En mi contexto tengo una calificación de 1-5. ningún resultado de la consulta significa que no se proporcionaron calificaciones.

Suelta lo siguiente en el bucle y listo:

<?php echo average_rating(); ?>
    
respondido por el elleeott 08.12.2011 - 15:35
2
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' );

Similar a la respuesta de PaulIsLoud, pero calcula el promedio directamente en la consulta en lugar de iterar los resultados

    
respondido por el Alex 13.01.2015 - 06:37
1

Aquí está mi versión, basada en las dos respuestas anteriores. Se ejecuta en wp_set_comment_status cambiado a approve .

calc_avg_rating() cuenta los comentarios que tienen un campo de rating (si un comentario de partuclar no tiene rating , simplemente se mueve), y cuando se aprueba un nuevo comentario, se actualiza el valor meta posterior de avg_rating .

Luego, para mi plantilla, simplemente llamo a get_product_rating , que mira el campo meta del post de avg_rating , de esa manera no estamos calculando todo esto cada vez que se carga la página.

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;
    }

Espero que esto ayude a alguien!

    
respondido por el PaulIsLoud 03.08.2014 - 18:39
0

Esta es una solución que mostrará el promedio del después de el último comentario. Como solución alternativa, simplemente puede hacer dos bucles de comentarios have_comments() y calcular la calificación promedio con el primer bucle y mostrar los comentarios con el segundo bucle.

/**
 * 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;
}
}
    
respondido por el kaiser 09.05.2011 - 15:50

Lea otras preguntas en las etiquetas