web-dev-qa-db-fra.com

Calcul de la moyenne bayésienne pour le type de message personnalisé

J'ai un type de message personnalisé appelé entries, qui contient les candidats à un concours. Il existe une fonction de classement par 5 étoiles. Les classements sont enregistrés avec la variable entries. Je peux donc obtenir les ratings_average, ratings_count et ratings_sum avec 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);

Maintenant, je dois calculer la moyenne ou la moyenne bayésienne ou une estimation (qui sont juste des noms différents pour la même chose, autant que je sache), ce qui devrait être possible avec cette requête 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;

Est-il possible de combiner des instructions SQL avec WP_Query?

Ou quel est le meilleur moyen d'obtenir les mêmes résultats que ceux obtenus avec WP_Query dans une requête SQL avec laquelle je peux travailler dans $wpdb?

Les entries sont stockés par WordPress dans le wp_posts avec post_typeentry et les ratings_count, ratings_sum et ratings_average sont stockés dans wp_postmeta. Donc, je devrais écrire une jointure pour obtenir ceux-ci et ensuite faire la requête ci-dessus sur le résultat. Ne serait-ce pas lourd sur la DB? Ceci est affiché dans un widget de tableau de bord, de sorte que la requête s'exécute chaque fois que quelqu'un clique sur /wp-admin/.

Quel est le meilleur moyen (comme le plus efficace) de s’y attaquer?

La note/moyenne bayésienne est calculée comme suit: http://fulmicoton.com/posts/bayesian_rating/

2
dhuyvetter

C'est le code (mis à jour) que j'utilise, qui donne les résultats attendus:

    $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;
0
dhuyvetter