私はentries
と呼ばれるカスタム投稿タイプを持っています。 5つ星評価関数があり、評価はentries
で保存されています。 ratings_average
、ratings_count
、ratings_sum
はWP_Query
で取得できます。
$args = array(
'post_type' => 'entry',
'orderby' => 'ratings_average',
'order' => 'DESC',
'posts_per_page' => 10,
'post_status' => 'publish'
);
$loop = new WP_Query($args);
今度は、ベイジアン平均、平均値、または推定値を計算する必要があります(これは、私が言うことができる限り同じことを表す異なる名前です)。これは、次の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;
SQLステートメントをWP_Query
と組み合わせる方法はありますか?
それともWP_Query
で作業できるSQLクエリで$wpdb
から得られるのと同じ結果を得るための最善の方法は何ですか?
entries
はWordPressによってwp_posts
entry
とともにpost_type
に格納され、ratings_count
、ratings_sum
、およびratings_average
はwp_postmeta
に格納されます。だから私はそれらを得るために結合を書いてそれから結果に対して上記の問い合わせをする必要があるでしょう。これはDBに重くはないでしょうか。これはダッシュボードウィジェットに表示されるので、誰かが/wp-admin/
を押すたびにクエリが実行されます。
これに取り組むための最善の(最も効率的な)方法は何ですか?
ベイズ評価/平均は、次のように計算されます。 http://fulmicoton.com/posts/bayesian_rating/
これは私が使っている(更新された)コードです。
$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;