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_type
entry
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/
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;