Berechnung des Bayes-Durchschnitts für den benutzerdefinierten Posttyp

Ich habe einen benutzerdefinierten Beitragstyp namens entries , der Teilnehmer für einen Wettbewerb enthält. Es gibt eine 5-Sterne-Bewertungsfunktion, die Bewertungen werden mit den entries gespeichert. So kann ich die ratings_average , ratings_count und ratings_sum mit einem WP_Query :

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

Jetzt muss ich den Bayes’schen Durchschnitt oder Mittelwert oder Schätzung berechnen (was soweit ich weiß, sind das nur verschiedene Namen für die gleiche Sache), was mit dieser SQL-Abfrage möglich sein sollte:

 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; 

Gibt es eine Möglichkeit, SQL-statementen mit WP_Query zu kombinieren?

Oder was ist der beste Weg, um die gleichen Ergebnisse zu erhalten, die ich von WP_Query in einer SQL-Abfrage bekomme, mit der ich in $wpdb ?

Die entries werden von WordPress in den wp_posts mit post_type entry gespeichert und die ratings_count , ratings_sum und ratings_average werden in wp_postmeta gespeichert. Also würde ich einen Join schreiben müssen, um diese zu bekommen und dann die obige Abfrage nach dem Ergebnis machen. Wäre das nicht schwer für die DB? Dies wird in einem Dashboard-Widget angezeigt, sodass die Abfrage jedes Mal ausgeführt wird, wenn jemand /wp-admin/ trifft.

Was ist der beste (wie am effizientesten) Weg dies anzugehen?

Das Bayes’sche Rating / Durchschnitt wird wie folgt berechnet: http://fulmicoton.com/posts/bayesian_rating/

Solutions Collecting From Web of "Berechnung des Bayes-Durchschnitts für den benutzerdefinierten Posttyp"

Dies ist der (aktualisierte) Code, den ich verwende, der Ergebnisse gibt, wie ich es erwarten würde:

  $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()): ?> < ?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); ?> < ?php endwhile; ?> 
< ?php _e('Entry', 'textdomain'); ?> < ?php _e('Rating average', 'textdomain'); ?> < ?php _e('Rating count', 'textdomain'); ?> < ?php _e('Bayesian Rating', 'textdomain'); ?>
< ?php echo $title; ?> < ?php echo $post->ratings_average; ?> < ?php echo $post->ratings_count; ?> < ?php echo round($bayesian_average, 3); ?>
< ?php else: _e('No Entries', 'textdomain'); endif;