add_shortcode('top_user_rating2', 'rcl_top_user_by_rating2');
function rcl_top_user_by_rating2() {
/*
$user_id - id пользователя
$rating - рейтинг пользователя за промежуток
$user_info - инфа о пользователе (get_userdata())
*/
//Записываем id юзера для удобства
$user_id = $top_user["object_author"];
//Записываем суммарный рейтинг за промежуток для удобства
$rating = $top_user["total_rating"];
//Берем инфо юзера
$user_info = get_userdata($user_id);
?>
<?php
//Текущий пользователь (не в рейтинге, а кто его смотрит)
global $user_ID;
//Если текущий пользователь равен пользователю в рейтинге - значит он видит себя
//Выделим его в рейтинге
if ($user_id == $user_ID) {
$your = 'style="font-weight:bold;"';
} else {
$your = false;
}
//Выведем 1 раз заголовок рейтинга, что-то типо заголовка таблицы
if ($firstCheck== 1) {
?>
<div class="tubr-user-title">
<div class="tubr-user-position">Место</div>
<div class="tubr-user-name">Пользователь</div>
<div class="tubr-user-rating">Получено рейтинга</div>
</div>
<?php } ?>
<div class="tubr-user" data-user-id="<?php echo $user_id ;?>" <?php echo $your; ?>>
---------
<div class="tubr-user-position"><?php echo $position; ?></div>
<div class="tubr-user-name">
<a href="/author/<?php echo $user_info->user_login; ?>/" target="_blank">
<?php echo $user_info->display_name; ?>
</a>
</div>
<div class="tubr-user-rating">
<div class="tubr-user-value"><?php echo $rating; ?>
</div>
</div>
</div>
<?php } ?>
function rcl_top_object_by_rating($atts = false) { //Параметры шорткода if (defined('DOING_AJAX') && DOING_AJAX) { $atts = json_decode(base64_decode($_POST['params']), true); } else { $atts = shortcode_atts(array( 'templates' => 'block', 'sorting' => '1', 'limit' => '10', 'day' => '30', 'exclude' => '', 'type' => 'post', 'cache_time' => '86400', 'cat' => '', 'paged' => '' ), $atts); } //определяем объект кеширования $rcl_cache = new Rcl_Cache($atts["cache_time"]); //проверяем следует ли использовать кеширование if ($rcl_cache->is_cache) { //указываем уникальный ключ для кеш-файла $string = 'top_rating_object' . $atts["templates"] . $atts["limit"] . $atts["day"] . $atts["exclude"] . $atts["type"] . $atts["cat"]; //получаем данные кеш-файла по указанному ключу $file = $rcl_cache->get_file($string); //проверяем актуальность кеш-файла if (!$file->need_update) { //возвращаем содержимое кеш-файла return $rcl_cache->get_cache(); } } $result = ''; //Если включена сортировка if ($atts["sorting"] == 1) { $args = array( 1 => 'За сутки', 7 => 'За неделю', 30 => 'За месяц', 90 => 'За 3 месяца', 180 => 'За 6 месяцев', 365 => 'За год', 'all' => 'За все время' ); if (!$args[$atts['day']]) { $args[$atts['day']] = 'За ' . $atts['day'] . ' дней'; } $args = apply_filters('tobr_select', $args); $result .= rcl_tobr_get_select($args, $atts); } $result .= '<div class="tobr-content ' . $atts["type"] . '-' . $atts["templates"] . '">'; $result .= rcl_top_object_by_rating_data($atts); $result .= '</div>'; //проверяем используется ли кеш if ($rcl_cache->is_cache) { //создаем или обновляем кеш-файл с сформированным контентом $rcl_cache->update_cache($result); } if (defined('DOING_AJAX') && DOING_AJAX) { wp_send_json(array('content' => $result)); } return $result; }
function getTopUser() { global $wpdb; //Если промежуток 0 значит за все время if ($this->period) { $where = $this->getPeriodData(); } else { if (($this->day == 0 AND ! $this->type AND ! $this->period)) { $where = "WHERE ratingusers.user_id != 0"; } else if ($this->day == 0) { $where = "WHERE ratingusers.object_author != '0'"; } else { $where = "WHERE rating_date > NOW() - INTERVAL $this->day DAY AND object_author != '0'"; } } // Если лимит юзеров 0 значит выводим всех if ($this->limit == 0) { $limit = false; } else { $limit = $this->limit; } if ($this->exclude) { //Если убираем юзеров if (($this->day == 0 AND ! $this->type AND ! $this->period)) { $where .= " AND ratingusers.user_id NOT IN ($this->exclude)"; } else { $where .= " AND ratingusers.object_author NOT IN ($this->exclude)"; } } if ($this->type) { $where .= " AND rating_type = '$this->type'"; } $page = $this->page; //Если строим ТОП за все время, то берем из таблицы rating_users if (($this->day == 0 AND ! $this->type AND ! $this->period)) { if (!is_numeric($this->role)) { $left_join = false; } else { $left_join = " INNER JOIN $wpdb->usermeta as usermeta ON usermeta.user_id = ratingusers.user_id AND usermeta.meta_value = '$this->role' AND usermeta.meta_key = 'wp_user_level' "; } $total_users = $wpdb->get_var(" SELECT COUNT(ratingusers.user_id) FROM " . RCL_PREF . "rating_users as ratingusers $left_join $where "); $this->total_users = $total_users; if ($limit) { $offset = ($page - 1) * $limit; $limit = "LIMIT $offset, $limit"; } $top_users = $wpdb->get_results(" SELECT ratingusers.user_id as object_author, rating_total as total_rating FROM " . RCL_PREF . "rating_users as ratingusers $left_join $where GROUP BY ratingusers.user_id ORDER BY CAST(total_rating as DECIMAL) DESC $limit ", ARRAY_A); } else { if (!is_numeric($this->role)) { $left_join = false; } else { $left_join = " INNER JOIN $wpdb->usermeta as usermeta ON usermeta.user_id = ratingusers.object_author AND usermeta.meta_value = '$this->role' AND usermeta.meta_key = 'wp_user_level' "; } $total_users = $wpdb->get_var(" SELECT COUNT(DISTINCT object_author) FROM " . RCL_PREF . "rating_values as ratingusers $left_join $where "); $this->total_users = $total_users; if ($limit) { $offset = ($page - 1) * $limit; $limit = "LIMIT $offset, $limit"; } $top_users = $wpdb->get_results(" SELECT object_author, SUM(rating_value) as total_rating FROM " . RCL_PREF . "rating_values as ratingusers $left_join $where GROUP BY object_author ORDER BY total_rating DESC $limit ", ARRAY_A); } return $top_users; }
Я не понимаю что вам нужно. Вам нужен топ по общему рейтингу юзеров, у которых есть записи в категориях, или же вам нужен топ юзеров по суммарному рейтингу их записей в категории. В любом случае ничего этого с помощью дополнения не вывести, вам надо самим строить нужный запрос и получать ТОП.
function rcl_top_object_by_rating_data($atts = false) { global $wpdb; //Если ajax if (defined('DOING_AJAX') && DOING_AJAX) { $atts = json_decode(base64_decode($_POST['params']), true); if (!$atts) { wp_send_json(array('error' => 'Ошибка, не все параметры переданы')); } if($_POST['day']) { $atts['day'] = $_POST['day']; } } $WHERE = array('WHERE object_author != 0'); //Если промежуток 0 значит за все время if ($atts['day'] != 'all') { $WHERE[] = 'rating_date > NOW() - INTERVAL ' . $atts['day'] . ' DAY'; } // Если лимит объектов 0 значит выводим всех if ($atts['limit'] == 0) { $LIMIT = false; } else { $LIMIT = 'LIMIT ' . $atts['limit']; } //Если убираем объекты if ($atts['exclude']) { $WHERE[] = 'object_id NOT IN (' . $atts['exclude'] . ')'; } $WHERE[] = "rating_type = '" . $atts['type'] . "'"; //Если категория if ($atts['cat']) { $post_ids = get_posts(array( 'numberposts' => -1, // get all posts. 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => $atts['cat'], ), ), 'fields' => 'ids', // Only get post IDs )); $post_ids = implode(',', $post_ids); $WHERE[] = 'object_id IN (' . $post_ids . ')'; } //Если включена пагинация if ($atts['paged']) { //Постов на странице $tobr_per_page = $atts['limit']; //текущая страница $tobr_page_curr = (int) $_POST["page"]; //Если текущей нет, значит первая if (!$tobr_page_curr) $tobr_page_curr = 1; //Если не первая то делаем отступ if ($tobr_page_curr != 1) { $OFFSET = "OFFSET " . $tobr_per_page * ($tobr_page_curr - 1); } else { $OFFSET = false; } } else { $OFFSET = false; } $WHERE = implode(' AND ', $WHERE); //Если строим ТОП за все время, то берем из таблицы rating_totals if ($atts['day'] == 'all') { $top_objects = $wpdb->get_results(" SELECT object_id, object_author, SUM(rating_total) as total_rating FROM " . RCL_PREF . "rating_totals $WHERE GROUP BY object_id ORDER BY total_rating DESC, object_id $LIMIT $OFFSET ", ARRAY_A); $total_post = $wpdb->get_var(" SELECT COUNT(object_id) FROM " . RCL_PREF . "rating_totals $WHERE "); } else { //запрос в базу $top_objects = $wpdb->get_results(" SELECT object_id, object_author, SUM(rating_value) as total_rating FROM " . RCL_PREF . "rating_values $WHERE GROUP BY object_id ORDER BY total_rating DESC, object_id $LIMIT $OFFSET ", ARRAY_A); $total_post = $wpdb->get_results(" SELECT object_id FROM " . RCL_PREF . "rating_values $WHERE GROUP BY object_id "); $total_post = count($total_post); } global $top_object, $position; //Выводим объекты foreach ($top_objects as $top_object) { $i++; //Если не указана страница значит первая if (!$tobr_page_curr) { $position = $i; } else { $position = ($tobr_page_curr - 1) * $tobr_per_page + $i; } //Подключаем файл с шаблоном вывода $result .= rcl_get_include_template($atts['type'] . '-tobr-' . $atts['templates'] . '.php', __FILE__); } //Если включена пагинация выведем её if ($atts['paged']) { $result .= tobr_get_nav($total_post, $atts['limit']); } $position = 0; //Если Ajax if (defined('DOING_AJAX') && DOING_AJAX) { if (!$result) { wp_send_json(array('error' => 'Ошибка получения записей')); } wp_send_json(array('content' => $result)); } return $result; }
у меня с запросами сложновато,как его доработать?
$top_objects = $wpdb->get_results(" SELECT object_id, object_author, SUM(rating_total) as total_rating FROM " . RCL_PREF . "rating_totals $WHERE GROUP BY object_id ORDER BY total_rating DESC, object_id $LIMIT $OFFSET ", ARRAY_A); $total_post = $wpdb->get_var(" SELECT COUNT(object_id) FROM " . RCL_PREF . "rating_totals $WHERE ");
или тут просто поменять
GROUP BY object_id на object_author и object_id убрать после слова select, в запросе выше?
то есть так мы получаем самого рейтингово автора в категории?
$top_objects = $wpdb->get_results(" SELECT object_author, SUM(rating_value) as total_rating FROM " . RCL_PREF . "rating_values $WHERE GROUP BY object_author ORDER BY total_rating DESC, object_author $LIMIT $OFFSET ", ARRAY_A);