Cálculo del promedio bayesiano para el tipo de publicación personalizada

3

Tengo un tipo de publicación personalizada llamada entries , que contiene concursantes para una competencia. Hay una función de calificación de 5 estrellas, las calificaciones se almacenan con el entries . Entonces puedo obtener ratings_average , ratings_count y ratings_sum con un WP_Query :

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

Ahora necesito calcular el promedio o la estimación bayesiana (que son solo nombres diferentes para la misma cosa que yo sepa), lo que debería ser posible con 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;

¿Hay alguna forma de combinar sentencias de SQL con WP_Query ?

¿O cuál es la mejor manera de obtener los mismos resultados que obtengo de WP_Query en una consulta SQL con la que puedo trabajar en $wpdb ?

WordPress almacena entries en wp_posts con post_type entry y ratings_count , ratings_sum y ratings_average se almacenan en wp_postmeta . Así que tendría que escribir una combinación para obtener esos y luego hacer la consulta anterior sobre el resultado. ¿No sería esto pesado en el DB? Esto se muestra en un widget de Dashboard, por lo que la consulta se ejecutaría cada vez que alguien golpea /wp-admin/ .

¿Cuál es la mejor manera (como en la forma más eficiente) de abordar esto?

La calificación / promedio bayesiano se calcula así: enlace

    
pregunta dhuyvetter 10.03.2017 - 10:52

1 respuesta

0

Este es el código (actualizado) que estoy usando, que da resultados como los que esperaría:

    $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;
    
respondido por el dhuyvetter 10.03.2017 - 14:08

Lea otras preguntas en las etiquetas