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);