Calculando a média bayesiana para o tipo de postagem personalizado

3

Eu tenho um tipo de post personalizado chamado entries , que detém os participantes de uma competição. Há uma função de classificação de 5 estrelas, as classificações são armazenadas com entries . Assim, posso obter os ratings_average , ratings_count e ratings_sum com WP_Query :

    $args = array(
        'post_type' => 'entry',
        'orderby' => 'ratings_average',
        'order' => 'DESC',
        'posts_per_page' => 10,
        'post_status' => 'publish'
    );
    $loop = new WP_Query($args);

Agora eu preciso calcular a média Bayesiana ou média ou estimativa (que são apenas nomes diferentes para a mesma coisa, tanto quanto eu posso dizer), que deve ser possível com esta consulta SQL:

SELECT

( SELECT COUNT(*) FROM 'bayesian_test' ) AS total_entrants,
( SELECT SUM( vote_count ) FROM 'bayesian_test' ) AS total_votes,
( (SELECT total_votes) / (SELECT total_entrants) ) AS average_votes,
( SELECT SUM( rating_count ) FROM 'bayesian_test' ) AS total_ratings, 
( (SELECT total_ratings) / (SELECT total_entrants) ) AS average_rating,
post_title,

( ( (SELECT average_votes) * (SELECT average_rating) ) + (vote_count * rating_average) ) / ( (SELECT average_votes) + vote_count) AS mean

FROM 
    bayesian_test
ORDER BY 
    mean ASC;

Existe uma maneira de combinar instruções SQL com WP_Query ?

Ou qual é a melhor maneira de obter os mesmos resultados que obtenho de WP_Query em uma consulta SQL com a qual posso trabalhar em $wpdb ?

Os entries são armazenados pelo WordPress em wp_posts com post_type entry e ratings_count , ratings_sum e ratings_average são armazenados em wp_postmeta . Então, eu teria que escrever uma associação para obtê-los e fazer a consulta acima no resultado. Isso não seria pesado no DB? Isso é mostrado em um widget de painel, portanto, a consulta seria executada toda vez que alguém acessasse /wp-admin/ .

Qual é a melhor maneira (como é mais eficiente) de lidar com isso?

A avaliação / média bayesiana é calculada assim: enlace

    
por dhuyvetter 10.03.2017 / 10:52

1 resposta

0

Este é o código (atualizado) que estou usando, que fornece resultados como eu esperaria:

    $args = array(
        'post_type' => 'entry',
        'orderby' => 'bayesian_average',
        'order' => 'DESC',
        'post_status' => 'publish'
    );
    $loop = new WP_Query($args);
    $number_of_entrants = $loop->post_count;
    $total_ratings = $total_num_votes = 0;
    foreach ($loop->posts as $query_post) {
        $count = $query_post->ratings_count;
        $average = $query_post->ratings_average;
        $total_num_votes += $count;
        $total_ratings += $average;
    }
    $average_rating = $total_ratings / $number_of_entrants;
    $avg_num_votes = $total_num_votes / $number_of_entrants;
    if ($loop>have_posts()):
        ?>
        <table class="wp-list-table widefat fixed striped pages">
        <thead>
        <tr>
            <th scope="col" id="entry"><?php _e('Entry', 'textdomain'); ?></th>
            <th scope="col" id="rating-average"><?php _e('Rating average', 'textdomain'); ?></th>
            <th scope="col" id="rating-count"><?php _e('Rating count', 'textdomain'); ?></th>
            <th scope="col" id="beyesian-rating"><?php _e('Bayesian Rating', 'textdomain'); ?></th>
        </tr>
        </thead>
        <tbody><?php
        global $post;
        while ($loop->have_posts()) :
            $loop->the_post();
            $title = get_the_title();
            $this_num_votes = $post->ratings_count;
            $this_avg_rating = $post->ratings_average;
            $bayesian_average =  (($avg_num_votes * $average_rating) + ($this_num_votes * $this_avg_rating)) / ($avg_num_votes + $this_num_votes);
            update_post_meta(get_the_ID(), 'bayesian_average', $bayesian_average); ?>
            <tr>
            <td><a href="<?php echo get_permalink(); ?>" target="_blank"
                   title="<?php echo $title; ?>"><?php echo $title; ?>
                </a></td>
            <td>
                <?php echo $post->ratings_average; ?>
            </td>
            <td>
                <?php echo $post->ratings_count; ?>
            </td>
            <td>
                <?php echo round($bayesian_average, 3); ?>
            </td>
            </tr><?php
        endwhile; ?>
        </tbody>
        </table><?php
    else:
        _e('No Entries', 'textdomain');
    endif;
    
por dhuyvetter 10.03.2017 / 14:08