Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы » Как пофиксить сортировку 5 звездного рейтинга?

Как пофиксить сортировку 5 звездного рейтинга?


     13.02.2019    сортировка, рейтинг    Общие вопросы, Хаки, Ламерские вопросы    238

вопрос
Здравствуйте! Возник вопрос по сортировке новостей по рейтингу. На сайте используется "звездный" рейтинг. Новости сортируются не по количеству выставленных звезд пользователями, а по количеству проголосовавших. Получается, если 1000 пользователей поставит новости только 1 звезду из 5 (потому-что эта новость плохая), то сайт воспримет эту новость как лучшую и выведет ее в топе. Это же не правильно. В чем может быть проблема?

p.s. На скриншоте под картинками выводятся числа - это количество проголосовавших.

Как пофиксить сортировку 5 звездного рейтинга?

Ответил: LazyDev


Для тега {custom}
1. Открыть /engine/modules/functions.php найти
if ($match[1] == "rand" ) { $fixed = ""; $news_msort = ""; }
Ниже вставить
if ($match[1] == 'rating') {
    $news_sort = 'CEIL(e.rating / e.vote_num)';
}

Теперь все будет как нужно сортировать в теге {custom}.

Для тега {content}
1. Открыть /engine/engine.php найти
$news_sort_by = ($config['news_sort']) ? $config['news_sort'] : "date";
Ниже вставить
if ($news_sort_by == 'rating') {
    $news_sort_by = 'CEIL(e.rating / e.vote_num)';
}

Теперь все будет как нужно сортировать в теге {content}.

На кофе: R118095764291

15 комментариев

websyndicate18
Юзер

websyndicate18 - 13 февраля 2019 20:36 -


Сортирует он правильно как оказалось. Но как возможен рейтинг 7 по 5-бальной шкале? А на сайте он отображается как 2 звезды из 5

LazyDev
php-developer

LazyDev - 13 февраля 2019 21:02 -

websyndicate18, нет, сортирует он не правильно.

Мой блог: LazyDev.pro
Если мне не интересен вопрос, не помогаю, и за этим по контактам прошу не писать.

websyndicate18
Юзер

websyndicate18 - 13 февраля 2019 21:36 -


Не помог Ваш способ. Он в базу данных записывает не среднюю оценку (которая должна быть в интервале от 0 до 5), а сумму всех оценок и сортирует по этим цифрам

LazyDev
php-developer

LazyDev - 13 февраля 2019 21:43 -

websyndicate18, мое решение для custom, как раз решает проблему с тем что сейчас он сортирует не по 5 ,бальному значению а по общей оценке новости.
То есть, 10 людей проголосовали за новость 1 будет выше чем один человек за новость с оценкой в 5.
А мой вариант как раз устраняет это.

Мой блог: LazyDev.pro
Если мне не интересен вопрос, не помогаю, и за этим по контактам прошу не писать.

websyndicate18
Юзер

websyndicate18 - 13 февраля 2019 22:02 -

Только для custom работает? У меня через content выводит на главной

LazyDev
php-developer

LazyDev - 13 февраля 2019 22:27 -

websyndicate18, вы используете сортировку через тег {sort} ?

Мой блог: LazyDev.pro
Если мне не интересен вопрос, не помогаю, и за этим по контактам прошу не писать.

websyndicate18
Юзер

websyndicate18 - 13 февраля 2019 22:29 -

В настройках скрипта просто выставил сортировку по рейтингу

websyndicate18
Юзер

websyndicate18 - 13 февраля 2019 23:46 -

Дело в кеше было. Если выводить с помощью {custom cache="no"}, то нормально работает. Но мне надо через {content} вывести. Можно как то отключить его кеширование?

LazyDev
php-developer

LazyDev - 13 февраля 2019 23:55 -

websyndicate18, кэш не влияет на это, скорее всего у вас старые результаты были в кэше.
Для тега {content} напишу позже.

Мой блог: LazyDev.pro
Если мне не интересен вопрос, не помогаю, и за этим по контактам прошу не писать.

LazyDev
php-developer

LazyDev - 14 февраля 2019 12:24 -

Дополнил ответ, для тега {content}

Мой блог: LazyDev.pro
Если мне не интересен вопрос, не помогаю, и за этим по контактам прошу не писать.

websyndicate18
Юзер

websyndicate18 - 21 марта 2019 10:04 -


Вернулся к этому вопросу. Все сделал по вашей инструкции, итог такой (скриншот).
Среднюю оценку вывожу так:
$tpl->set( '{rate}', str_replace(",",".",round($row['rating']/max(1,$row['vote_num']),1)));

websyndicate18
Юзер

websyndicate18 - 21 марта 2019 10:20 -

Средний рейтинг вывожу так: $tpl->set( '{rate}', str_replace(",",".",round($row['rating']/max(1,$row['vote_num']),1)));

websyndicate18
Юзер

websyndicate18 - 21 марта 2019 10:33 -

По базе данных сверил, средняя оценка корректно выводится

websyndicate18
Юзер

websyndicate18 - 21 марта 2019 13:55 -

Проблема решена:
if ($match[1] == 'rating') {
$news_sort = 'round((e.rating / e.vote_num), 1)';
}
Спасибо!

Mau
Юзер

Mau - 21 марта 2019 22:52 -

Для тега {content}
1. Открыть /engine/engine.php найти
$news_sort_by = ($config['news_sort']) ? $config['news_sort'] : "date";

Ниже вставить
if ($news_sort_by == 'rating') {
    $news_sort_by = 'CEIL(e.rating / e.vote_num)';
}

Ни в какую не хочет правильно сортировать. Кеш чистил, dle 13.1. При сортировке "По популярности" все равно фильтрует по сумме голосов, а не по среднему рейтингу.((

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

 30.08.2014 mozart_dima  Общие вопросы
наверх