Домой Каталог: Дополнения WP-Recall Top user by rating как получить топ авторов в рубрике?
27ответ(ов) в теме
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
1
18:29
Версия WP-Recall: 16.23.2
Версия дополнения: 2.0.4

как получить топ авторов в рубрике?

0
groshin
не в сети 4 года
На сайте с 19.10.2019
Участник
Сообщения 6
2
18:51

через WP-Query

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
3
19:14

Через дополнение Top user by rating - никак, только если самим получать список нужных пользователей и подставлять в шорткод.

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
4
19:17

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 } ?>

Редакции сообщения
19.09.2020 19:18anriko.tacatti@gmail.comПричина: не указано
19.09.2020 19:20anriko.tacatti@gmail.comПричина: не указано
19.09.2020 19:21anriko.tacatti@gmail.comПричина: не указано
19.09.2020 19:24anriko.tacatti@gmail.comПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
5
19:26

кинул это в function php но получил пучтую разметку,не подскажите как правильно дополнить функционал

0
Вова (Otshelnik-Fm)
не в сети 18 часов
На сайте с 27.01.2013
Участник
Тем 43
Сообщения 18654
6
19:28

Для многострочного кода есть кнопка "Многострочный код"

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
7
19:29

Нет, не подскажу, это не сделать просто так. Вам нужен код, который будет строить топ юзеров по рейтингу их записей из определенных категорий. Дополнение такого не делает.

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
8
19:37

function getTopUser() у вас есть можно к вашему классу Tub_Rating добавить метод Tub_Rating->getTopUserByCategory()

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
9
19:38

и сделать проверку где получаем id автора на категорию, доработав существующий метод

Редакции сообщения
19.09.2020 19:39anriko.tacatti@gmail.comПричина: не указано
19.09.2020 19:39anriko.tacatti@gmail.comПричина: не указано
19.09.2020 19:39anriko.tacatti@gmail.comПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
10
19:40

узнаем популярные посты в категории ,и выводим их авторов

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
11
19:44

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

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
12
19:45

эта функция получает топ всех записей в ней добавит проверку на категорию ,получим топ записей в категории и узнаем их авторов

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
13
19:47

Вы копипастите код из другого дополнения, он выводит ТОП записей по категории, а вам нужно топ юзеров. У юзера может быть несколько записей, а значит тупо по топу записей выводить топ юзеров - не корректно.

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
14
19:51

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

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
15
19:53

а какая логика действий у меня должна быть

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
16
19:54

можно исключить тех пользователей которые не относятся к категории?

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
17
19:56

Я не понимаю что вам нужно. Вам нужен топ по общему рейтингу юзеров, у которых есть записи в категориях, или же вам нужен топ юзеров по суммарному рейтингу их записей в категории. В любом случае ничего этого с помощью дополнения не вывести, вам надо самим строить нужный запрос и получать ТОП.

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
18
19:59

лучшие авторы с постами в микроблоге (посты в микроблоге, получившие максимальный рейтинг)

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
19
20:00

нужен топ юзеров по суммарному рейтингу их записей в категории

Редакции сообщения
19.09.2020 20:00anriko.tacatti@gmail.comПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
20
20:02

а как логически правильно сформулировать его?

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
21
20:06

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

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
22
20:07

Ну видимо вам надо брать SUM рейтинга всех записей нужной категории из таблицы рейтинга, группировать по object_author (вроде так колонка называется) - должен получиться ТОП

Копировать сюда весь код дополнения не надо.

0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
23
20:10

у меня с запросами сложновато,как его доработать?

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

Редакции сообщения
19.09.2020 20:10anriko.tacatti@gmail.comПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
24
20:39

или тут просто поменять
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);

Редакции сообщения
19.09.2020 20:44anriko.tacatti@gmail.comПричина: не указано
19.09.2020 20:54anriko.tacatti@gmail.comПричина: не указано
19.09.2020 20:54anriko.tacatti@gmail.comПричина: не указано
19.09.2020 20:54anriko.tacatti@gmail.comПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
25
11:22

как я могу прицепиться к слассу class Tub_Rating в function.php и добавит свою функцию ?

0
Preci
не в сети 15 часов
На сайте с 11.11.2014
Участник
Тем 71
Сообщения 1646
26
14:23

anriko.tacatti@gmail.com сказал(а)
как я могу прицепиться к слассу class Tub_Rating в function.php и добавит свою функцию ?

Например

class Tub_Rating_Custon extends  Tub_Rating {

my_new_method(){

}

}

Редакции сообщения
21.09.2020 14:24PreciПричина: не указано
0
anriko.tacatti@gmail.com
не в сети 4 года
На сайте с 09.09.2020
Участник
Тем 29
Сообщения 111
27
14:24

ок,спасибо получилось

0
Вы не имеете права на публикацию сообщений в этой теме