Como obter a média dos valores do comentário meta

2

Eu usei o metar comentário para adicionar um sistema simples rating . O usuário pode postar uma taxa do formulário de comentários de onde eu adicionei 3 meta de comentário suspenso.

A classificação está funcionando bem, refletindo as classificações junto com o comentário escrito pelo usuário. Meu único problema agora é: como posso obter a média de todas as classificações publicadas? Preciso que a média seja colocada no conteúdo da postagem.

O meu sistema de classificação classifica o seguinte:

  • Preço,
  • Embalagem,
  • Qualidade.

Eu quero uma média para cada taxa:

  • Taxa de preço médio,
  • Taxa Média de Embalagem e
  • Taxa média de qualidade.

Muito obrigado!

    
por user5233 09.05.2011 / 11:01

5 respostas

4

Se você precisar mostrar as médias no conteúdo, precisará pré-calculá-las (antes de exibir os comentários).

Minha abordagem seria ter uma meta personalizada no post com as médias calculadas e modificar essas metas toda vez que um novo comentário (rating) for salvo.

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

    }
}
    
por MZAweb 09.05.2011 / 17:18
3

Eu tenho algo semelhante usando uma consulta personalizada para calcular a média na hora - por comentário de Rabino, seria mais eficiente armazenar o resultado dessa função como um meta valor, mas eu gostaria que ela fosse acionada quando um comentário é aprovado, em vez de quando um comentário é salvo.

aqui está sua função:

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

No meu contexto, tenho uma classificação de 1 a 5. nenhum resultado da consulta significa que não foram fornecidas classificações.

Solte o seguinte no loop e pronto:

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

Semelhante à resposta do PaulIsLoud, mas calcula a média diretamente na consulta, em vez de repetir os resultados

    
por Alex 13.01.2015 / 06:37
1

Aqui está minha versão, com base nas duas respostas acima. Ele é executado em wp_set_comment_status alterado para approve .

calc_avg_rating() conta os comentários com um campo rating (se um comentário parcial não tiver rating , simplesmente continua) e, quando um novo comentário for aprovado, ele atualizará o valor pós meta de avg_rating .

Em seguida, para o meu modelo, simplesmente chamo get_product_rating , que examina o meta-campo de avg_rating , assim, não estamos calculando tudo isso toda vez que a página é carregada.

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 isso ajude alguém!

    
por PaulIsLoud 03.08.2014 / 18:39
0

Esta é uma solução que exibirá a média após o último comentário. Como solução alternativa, você poderia simplesmente fazer dois have_comments() comentários e calcular a média com o primeiro loop e exibir os comentários com o segundo loop.

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