You need a custom query – this will join the posts, postmeta and usermeta table together and then count all communityposts
, post
and video
views, grouped by author:
function wpse_190303_get_popular_users( $number = 5 ) {
if ( ! $number = absint( $number ) )
return;
global $wpdb;
$query = "
SELECT
SUM( $wpdb->postmeta.meta_value+0 ) AS `post_views`,
$wpdb->usermeta.user_id AS `user_id`
FROM
$wpdb->posts
INNER JOIN
$wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id
INNER JOIN
$wpdb->usermeta ON $wpdb->posts.post_author = $wpdb->usermeta.user_id
WHERE
$wpdb->posts.post_type IN( 'communityposts', 'post', 'video' ) AND
$wpdb->posts.post_status="publish" AND
$wpdb->postmeta.meta_key = 'cv_post_views_count' AND
$wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND
$wpdb->usermeta.meta_value LIKE '%\\\"contributor\\\"%'
GROUP BY
$wpdb->usermeta.user_id
ORDER BY
post_views DESC
LIMIT
$number
";
if ( $result = $wpdb->get_results( $query ) )
cache_users( wp_list_pluck( $result, 'user_id' ) );
return $result;
}
To use:
if ( $data = wpse_190303_get_popular_users() ) {
foreach ( $data as $item ) {
$user_id = $item->user_id;
$views = $item->post_views;
// Your code to output the popular authors
}
}