Артём Мáлков

Микроразметка второго и третьего типа рейтинга полной новости в DLE

3 окт79 комм

В одной из статей я подробно расписал, как сделать микроразметку рейтинга полной новости в CMS DataLife Engine для первого типа рейтинга.

Первый тип рейтинга, если вы не знаете, – это «оценка», то есть для оценки статьи используется рейтинг в пять звезд, где 1 звезда – минимальная оценка, 5 – максимальная.

Все бы ничего, но как быть в том случае, если материалы на вашем сайте оцениваются вторым типом рейтинга («мне нравится»), или третьим («нравится» / «не нравится»).

Этим вопросом задались читатели нашего сайта, и, немного подумав, я решил как это все можно организовать.

Микроразметка второго типа рейтинга («нравится») полной новости в DataLife Engine

Итак, что мы имеем во втором типе рейтинга? Отметку «нравится», то есть количество людей, которым понравилась та или иная новость. Это число мы возьмем за количество проголосовавших, а оценку мы зададим сами. Если число проголосовавших у нас равно 0, то оценка равняется 0, а если больше 0, то, например, 4.5.

1. Подключитесь к вашему сайту по FTP и откройте файл, отвечающий за вид полной новости (если вы ничего не меняли – это файл fullstory.tpl в папке вашей темы).

Микроразметка второго и третьего типа рейтинга полной новости в DLE

2. Далее в самый его верх вы вставляете:

<div itemscope itemtype="http://schema.org/Product">

После чего здесь же, в самый низ, вставляете:

<meta itemprop="name" content="{title}">

	<div itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">
	
		<meta itemprop="bestRating" content="5">
		<meta itemprop="ratingValue" content="{numb_rate}">
		<meta itemprop="ratingCount" content="{numb_vote}">

	</div>
	
</div>

Здесь «5» – это тип шкалы (в нашем случае – 5-балльная шкала), {numb_rate} – оценка рейтинга, а {numb_vote} – количество людей, оценивших материал.

Сохраните изменения и отправьте файл на сайт.

3. Далее откройте файл show.full.php в папке /engine/modules/, найдите строку:

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );

и сразу после нее вставьте:

if($row['vote_num'] == 0) { // Если оценок (количество) 0

	$numb_rate = 0; // Оценка
	$numb_vote = 0; // Количество оценок
	
} else { // Если оценок (количество) больше 0

	$numb_rate = 4.5; // Оценка
	$numb_vote = $row['vote_num']; // Количество оценок
	
}

$tpl->set('{numb_rate}', $numb_rate);
$tpl->set('{numb_vote}', $numb_vote);

Сохраните изменения и отправьте файл обратно на сайт.

4. Очистите кэш. Установка закончена.

Микроразметка третьего типа рейтинга («нравится» / «не нравится») полной новости в DataLife Engine

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

Поэтому при отрицательном общем балле рейтинга мы будем переводить оценку в 1, при нуле – в 0, а при более нуля – нужный нам рейтинг, например, тот же 4.5.

1. Подключитесь к вашему сайту по FTP и откройте файл, отвечающий за вид полной новости (если вы ничего не меняли – это файл fullstory.tpl в папке вашей темы).

Микроразметка второго и третьего типа рейтинга полной новости в DLE

2. Далее в самый его верх вы вставляете:

<div itemscope itemtype="http://schema.org/Product">

После чего здесь же, в самый низ, вставляете:

<meta itemprop="name" content="{title}">

	<div itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">
	
		<meta itemprop="bestRating" content="5">
		<meta itemprop="ratingValue" content="{numb_rate}">
		<meta itemprop="ratingCount" content="{numb_vote}">

	</div>
	
</div>

Здесь «5» – это тип шкалы (в нашем случае – 5-балльная шкала), {numb_rate} – оценка рейтинга, а {numb_vote} – количество людей, оценивших материал.

Сохраните изменения и отправьте файл обратно на сайт.

3. Далее откройте файл show.full.php в папке /engine/modules/, найдите строку:

$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );

и сразу после нее вставьте:

if($row['vote_num'] == 0) { // Если оценок (количество) 0

	$numb_rate = 0; // Оценка
	$numb_vote = 0; // Количество оценок
	
} else { // Если оценок (количество) больше 0

	if($row['rating'] < 0) { // Если оценка меньше 0
	
		$numb_rate = 1; // Оценка
		
	} elseif($row['rating'] > 0) { // Если оценка больше 0
	
		$numb_rate = 4.5; // Оценка
		
	} else { // Если оценка 0
	
		$numb_rate = 0; // Оценка
		
	}
	
	$numb_vote = $row['vote_num']; // Количество оценок
	
}

$tpl->set('{numb_rate}', $numb_rate);
$tpl->set('{numb_vote}', $numb_vote);

Сохраните изменения и отправьте файл обратно на сайт.

4. Очистите кэш. Установка закончена.

Время, после которого в поиске появится рейтинг у вашего сайта, в среднем – пара недель.

Если этого не произошло – пишите об этом в комментариях, постараюсь расширить разметку для исправления ошибок в рамках разумного.

Рекомендуем к просмотру
Рейтинг материалов в пять звезд на uCoz
Статьи и советы
Микроразметка рейтинга полной новости в DLE
Посты
Улучшаем рейтинг материалов DLE + выводим общую оценку в нужном месте
Хаки
79
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    1
      •  Пользователь
    4 фев в 01:37

    Здравствуйте!

    У меня есть уже знакомый вам здесь код:

    function wilson_score($up, $down) {
    
    if (!$up) return $down;
    $n = $up + $down;
    $z = 1.64485;
    $phat = $up / $n;
    
    return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);
    
    }
    
    if($row["vote_num"] == 0) { // Если оценок (количество) 0
    
    $numb_rate = 6; // Оценка
    $numb_vote = 1; // Количество оценок
    
    } else { // Если оценок (количество) больше 0
    
    $rm = ($row["vote_num"] - $row["rating"]) / 2;
    $rp = $row["rating"] + $rm;
    $numb_vote = $row["vote_num"]; // Количество оценок
    $numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка
    
    }
    
    $tpl->set("{numb_rate}", $numb_rate);
    $tpl->set("{numb_vote}", $numb_vote);

    Он работает, но не точно. К примеру, у меня есть новость с 11 проголосовавшими. Рейтинг у нее 10. Но {numb_rate} почему-то выводит 8.0. Почему так? Как исправить?

    У меня есть другой код, который выводит рейтинг в % (да, в AggregateRating можна выводить рейтинг и % в формате 80%/90% etc) в нем всегда точные результаты. Правда нет количества проголосовавших и если не выставлен рейтинг - возвращает NAN%

    $rm = ($row['vote_num'] - $row['rating'])/2;
    $rp = $row['rating'] + $rm;
    $rating_proc = $rp/(($rp+$rm)/100);
    $tpl->set( '{rating_proc}', round($rating_proc,0));

    Получается, что вроде все есть, но не до конца работает.

    Кто уже сделал себе? Помогите!

      • 1
      1067
        •  Команда Pandoge
      изменено 11 фев в 23:16

      Андрей, здравствуйте! Мне скрипт (при ваших параметрах) выдает значение равное 7.4 (это средняя оценка по 10-бальной шкале).

      Какое число вы хотите здесь увидеть? У вас новость оценили 11 человек, 10 из них - положительно, один - отрицательно, отсюда и среднее значение, если я ничего не попутал.

    • 1
    1
      •  Пользователь
    23 мар в 08:07

    Артем привет, в 14.1 при третьем рейтинге все равно пишет

    0 (Значение параметра ratingCount должно быть положительным.)

    cancel

    Ваша оценка вне пределов диапазона по умолчанию. Необходимо указать самое высокое и самое низкое значения.

    Как сделать пока 0 фейковые значиния?

      • 1
      1067
        •  Команда Pandoge
      изменено 26 мар в 00:49

      Yes, здравствуйте!

      В строках:

      $numb_rate = 0; // Оценка
      $numb_vote = 0; // Количество оценок

      меняете 0 на нужное вам значение.

    • 2
    8
      •  Проверенный
    5 мар в 10:07

    Сделал третий тип рейтинга, в гугл валидаторе выдаёт ошибку:

    В отзыве не указано название рецензируемого объекта.

    И это связано именно с рейтингом. Так думаю, что валидатор почему то считает, что это рейтинг отзыва.

    Может быть потому, что использую разметку SoftwareApplication ?

    Может быть нужно ещё указать какие то данные ?

      • 4
      8
        •  Проверенный
      6 мар в 13:57

      Всё, решил проблему, теперь валидатор выдаёт всё без ошибок с третьим рейтингом, и у яши и у гоши.

      Нужно было только добавить значение itemReviewed в рейтинг

    • 1
    8
      •  Проверенный
    23 фев в 06:49

    А то, что в dle уже есть разметка рейтинга, устанавливать ещё одну, это разве не вызовет конфликта в валидаторе ?

      • 1
      1067
        •  Команда Pandoge
      23 фев в 16:09

      Олег Lexxs, "есть" начиная с какой версии?

      • 1
      8
        •  Проверенный
      2 мар в 14:04

      Артём Мáлков, если не изменяет память, то с 13. Сейчас уже 14 версия установлена.

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

      • 1
      1067
        •  Команда Pandoge
      2 мар в 14:48

      Олег Lexxs, инструкция приоритетно для старых версий CMS.

    • 1
    8
      •  Проверенный
    12 фев в 13:16
    Здесь «5» – это тип шкалы (в нашем случае – 5-балльная шкала)

    Разве в третьем типе рейтинга пятибальная шкала ?

    Вроде как там суммируются плюсы и вычитаются минусы и значение может достигать разных величин, например 600

      • 1
      1067
        •  Команда Pandoge
      12 фев в 15:07

      Lexxs Lexxs7 Lego, внимательно ознакомьтесь с кодом для понимания принципов его работы.

    • 1
    4
      •  Проверенный
    11 фев в 15:09

    Здравствуйте Артем. Подскажите пожалуйста вот такие ошибки светятся при проверке:

    1. Недопустимый тип объекта в поле "itemReviewed"

    2. Для элемента данных "ratingCount" неверно задано значение, которое должно быть выражено целым числом.

    3. Не удалось определить оценочную шкалу.

    Тип рейтинга: Нравиться или Не нравиться

      • 1
      1067
        •  Команда Pandoge
      12 фев в 00:42

      Денис Денисов, здравствуйте!

      Покажите сайт, где наблюдается проблема.

      • 1
      8
        •  Проверенный
      12 фев в 13:17

      Денис Денисов, это в валидаторе гугла ?

      У него недавно что то поменялось, теперь ему нужен другой тип рейтинга, как я понял.

      • 1
      1067
        •  Команда Pandoge
      12 фев в 15:00

      Денис Денисов, у Вас неверно внедрена разметка.

      Внимательно повторите 2 шаг.

      • 1
      1067
        •  Команда Pandoge
      12 фев в 15:04

      Lexxs Lexxs7 Lego, не знаю, что именно поменялось, но проверил разметку сегодня - проблем ни каких нет.

      • 1
      4
        •  Проверенный
      12 фев в 17:03

      Артём Мáлков, повторил шаг 2.

      Недопустимый тип объекта в поле "itemReviewed"

      Для элемента данных "ratingCount" неверно задано значение, которое должно быть выражено целым числом.

      Не удалось определить оценочную шкалу.

      Все делал по инструкции.

      • 1
      4
        •  Проверенный
      12 фев в 17:07

      Артём Мáлков, cсорри не очистил кэш. Вот такое сейчас:

      Отсутствует поле "itemReviewed"

      • 1
      4
        •  Проверенный
      12 фев в 17:51

      Может такой код нужен?

      <div temprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">

      <meta itemprop="bestRating" content="5">

      <meta itemprop="ratingValue" content="{numb_rate}">

      <meta itemprop="ratingCount" content="{numb_vote}">

      <meta itemprop="itemReviewed" content="{title}">

      </div>

      • 1
      1067
        •  Команда Pandoge
      14 фев в 01:40

      Денис Денисов, у Вас ошибки в верстке сайта (не закрытые или лишние теги).

      Исправьте сначала их, а потом внедряйте разметку и проблем не будет.

    • 1
    6
      •  Пользователь
    22 янв в 02:28

    Артем Малков

    а как такое сделать для рейтинга № 3?

    https://prnt.sc/qr0akv

      • 1
      1067
        •  Команда Pandoge
      22 янв в 03:32

      Шаген, здравствуйте!

      if($row["vote_num"] == 0) { // Если оценок (количество) 0
      
      	$numb_rate = 0; // Оценка
      	$numb_vote = 0; // Количество оценок
      	
      }

      замените на:

      if($row["vote_num"] == 0) { // Если оценок (количество) 0
      
      	$numb_rate = 4; // Оценка
      	$numb_vote = 1; // Количество оценок
      	
      }
      • 1
      6
        •  Пользователь
      22 янв в 11:04

      Артём Мáлков,

      Спасибо)

      А как исправить такую ошибку? http://prntscr.com/qr4o3i

      • 1
      1067
        •  Команда Pandoge
      22 янв в 16:55

      Шаген, шаг 2 из статьи точно выполнили?

    • 1
    14
      •  Проверенный
    24 дек в 23:03

    Артем,здравствуйте.

    На вкладке категория имеются строки :

    Описание категории (текст который можно вывести на страницах сайта, допускаются BB теги и HTML)

    Иконка:

    Метатег Title:

    Метатег Description:

    Заполнять или нет?

      • 1
      1067
        •  Команда Pandoge
      25 дек в 16:42

      Степан Карахан, здравствуйте.

      Желательно да. Все, кроме иконки.

      • 2
      14
        •  Проверенный
      25 дек в 18:40

      Артем,спасибо!

    • 1
    14
      •  Проверенный
    23 дек в 23:32

    Артем,здравствуйту.Установил микроразметку второго типа рейтинга.Когда должен появится рейтинг в поиске ?

      • 1
      1067
        •  Команда Pandoge
      23 дек в 23:53

      Степан Карахан, здравствуйте.

      Цитата из статьи:

      Время, после которого в поиске появится рейтинг у вашего сайта, в среднем – пара недель.

    • 1
    7
      •  Проверенный
    11 дек в 19:20

    Почему тут отображает 9.0 https://imgur.com/a/AR9PTcx

    Когда на сайте общий рейтинг новости выводит 9.4?

    Нравится 134 не нравится 8

    Срочно!!!

      • 1
      1067
        •  Команда Pandoge
      12 дек в 01:57

      Иван Петров, не видя сайт не смогу Вам помочь.

      • 1
      7
        •  Проверенный
      12 дек в 16:54

      Артём Мáлков, https://imgur.com/a/IFGmsAg почему так?

      • 2
      1067
        •  Команда Pandoge
      12 дек в 18:54

      Иван Петров, а разве в DLE есть рейтинг в 10 баллов?

      Если нет, то какой хак устанавливали.

      • 1
      7
        •  Проверенный
      12 дек в 20:16

      Артём Мáлков, незнаю что как но у меня DLE 13.2, можно пожалуйста ваш телеграмм или вк?(аккаунт новый немогу увидеть ваши контакты) очень нужна помощь!

      • 1
      1067
        •  Команда Pandoge
      13 дек в 02:23

      Иван Петров, вся связь внизу сайта.

      А вообще - ниже есть решение для 10-балльной системы.

      • 1
      7
        •  Проверенный
      13 дек в 14:54

      Артём Мáлков, я попробовал вот так

      function wilson_score($up, $down) {
      
      	if(!$up) {
      	
      		return $down;
      		
      	}
      	
      	$n = $up + $down;
      	$z = 1.64485;
      	$phat = $up / $n;
      
      	return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);
      
      }
      
      if($row["vote_num"] == 0) { // Если оценок (количество) 0
      
      	$numb_rate = 0; // Оценка
      	$numb_vote = 0; // Количество оценок
      
      } else { // Если оценок (количество) больше 0
      
      	if($row["rating"] <= 0) { // Если рейтинг меньше 1
      	
      		$numb_rate = 0; // Оценка
      		$numb_vote = 0; // Количество оценок
      	
      	} else {
      
      		$rm = ($row["vote_num"] - $row["rating"]) / 2;
      		$rp = $row["rating"] + $rm;
      		$numb_vote = $row["vote_num"]; // Количество оценок
      		$numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка
      
      	}
      
      }
      
      $tpl->set("{numb_rate}", $numb_rate);
      $tpl->set("{numb_vote}", $numb_vote);

      Но толку нету никакого, если у новости 9.4 оценка, то гугл разметки выдает 9.0

      • 1
      1067
        •  Команда Pandoge
      13 дек в 15:08

      Иван Петров, в таком случае сообщите, что за хак/модуль используете для оценки в 10 баллов.

      • 1
      7
        •  Проверенный
      13 дек в 15:41

      Артём Мáлков, Я никаких хаков на рейтинг не ставил, я просто скачал еще давно DLE 13.2 nulled и поставил.

      Я нашел вот такой код из engine/modules/functions.php

      function ShowRating($id, $rating, $vote_num, $allow = true) {
      	global $lang, $config, $row, $dle_module;
      
      	if( !$config['rating_type'] ) {
      		
      		if( $rating AND $vote_num ) $rating = round( ($rating / $vote_num), 0 );
      		else $rating = 0;
      		
      		if ($rating < 0 ) $rating = 0;
      		
      		if ($vote_num AND $dle_module == "showfull") {
      			
      			$shema_title = " itemprop=\"aggregateRating\" itemscope itemtype=\"http://schema.org/AggregateRating\"";
      			$shema_ratig = $rating;
      			$shema_ratig_title = str_replace("&amp;", "&",  htmlspecialchars( strip_tags( stripslashes( $row['title'] ) ), ENT_QUOTES, $config['charset'] ) );
      			$shema = "<meta itemprop=\"itemReviewed\" content=\"{$shema_ratig_title}\"><meta itemprop=\"worstRating\" content=\"1\"><meta itemprop=\"ratingCount\" content=\"{$vote_num}\"><meta itemprop=\"ratingValue\" content=\"{$shema_ratig}\"><meta itemprop=\"bestRating\" content=\"5\">";
      
      		} else {
      			$shema_title = "";
      			$shema = "";
      		}
      		
      		$rating = $rating * 20;
      	
      		if( !$allow ) {
      		
      			$rated = <<<HTML
      <div class="rating"{$shema_title}>
      		<ul class="unit-rating">
      		<li class="current-rating" style="width:{$rating}%;">{$rating}</li>
      		</ul>{$shema}
      </div>
      HTML;
      		
      			return $rated;
      		}
      	
      		$rated = <<<HTML
      <div id='ratig-layer-{$id}'>
      	<div class="rating"{$shema_title}>
      		<ul class="unit-rating">
      		<li class="current-rating" style="width:{$rating}%;">{$rating}</li>
      		<li><a href="#" title="{$lang['useless']}" class="r1-unit" onclick="doRate('1', '{$id}'); return false;">1</a></li>
      		<li><a href="#" title="{$lang['poor']}" class="r2-unit" onclick="doRate('2', '{$id}'); return false;">2</a></li>
      		<li><a href="#" title="{$lang['fair']}" class="r3-unit" onclick="doRate('3', '{$id}'); return false;">3</a></li>
      		<li><a href="#" title="{$lang['good']}" class="r4-unit" onclick="doRate('4', '{$id}'); return false;">4</a></li>
      		<li><a href="#" title="{$lang['excellent']}" class="r5-unit" onclick="doRate('5', '{$id}'); return false;">5</a></li>
      		</ul>{$shema}
      	</div>
      </div>
      HTML;
      	
      		return $rated;
      
      	} elseif ($config['rating_type'] == "1") {
      		
      		if( $rating < 0 ) $rating = 0;
      		
      		if( $allow ) $rated = "<span id=\"ratig-layer-{$id}\" class=\"ignore-select\"><span class=\"ratingtypeplus ignore-select\" >{$rating}</span></span>";
      		else $rated = "<span class=\"ratingtypeplus ignore-select\" >{$rating}</span>";
      		
      		return $rated;
      	
      	} elseif ($config['rating_type'] == "2" OR $config['rating_type'] == "3") {
      		
      		$extraclass = "ratingzero";
      		
      		if( $rating < 0 ) {
      			$extraclass = "ratingminus";
      		}
      		
      		if( $rating > 0 ) {
      			$extraclass = "ratingplus";
      			$rating = "+".$rating;
      		}
      		
      		if( $allow ) $rated = "<span id=\"ratig-layer-{$id}\" class=\"ignore-select\"><span class=\"ratingtypeplusminus ignore-select {$extraclass}\" >{$rating}</span></span>";
      		else $rated = "
      • 1
      1067
        •  Команда Pandoge
      14 дек в 16:09

      Иван Петров, пришлите код рейтинга из шаблона (tpl) полной новости.

      • 1
      7
        •  Проверенный
      14 дек в 16:31

      Артём Мáлков, пожалуйста:

      [rating-type-3]
      							<div class="fx-row fx-middle fx-start">
      								<span class="rating-vgs">{rating}{vote-num}</span>
      								<div class="rate-full fx-row" id="rate-{news-id}" data-id="{news-id}">
      									<div class="ratefull-plus" onclick="doRateLD('plus', '{news-id}');"><span class="fa fa-thumbs-up"></span></div>
      									<div class="ratefull-minus" onclick="doRateLD('minus', '{news-id}');"><span class="fa fa-thumbs-down"></span></div>
      									<div class="ratefull-hide">{rating}{vote-num}</div>
      								</div>
      								<div class="rating-votenote"> Голосов: {vote-num}</div>
      							</div>
      							[/rating-type-3]
      • 1
      1067
        •  Команда Pandoge
      14 дек в 20:55

      Иван Петров, Не то.

      Код, который заключен в

      <div class="rate-count"></div>
      • 1
      7
        •  Проверенный
      14 дек в 21:23

      Артём Мáлков, Хмм незнаю зачем но этот рейтинг я прописываю сам через доп поле новости, он отношения к shema разметки ничего не имеет. Ну вот он

      <div class="rate-count">
      								<div class="kp-count">[xfgiven_reit] [xfvalue_reit] [/xfgiven_reit]<small>Рейтинг</small></div>
      							</div>
      • 1
      1067
        •  Команда Pandoge
      14 дек в 22:07

      Иван Петров, в таком случае, Вы сами ответили на свой вопрос. Рейтинг у Вас хранится в доп. поле reit. Откуда ему взяться в разметке?

    • 2
    4
      •  Пользователь
    13 окт в 17:30

    Огромное спасибо!! Всё работает, запросил индексирование, в Google отображается.

    • 1
    26
      •  Проверенный
    28 апр в 20:54

    а как сделать такую же вставку смайлов как у вас? angel

      • 1
      1067
        •  Команда Pandoge
      28 апр в 22:45

      Артём Ройзман, Вы про всплывающее окно со смайлами при наведении?

    • 2
    5
      •  Проверенный
    25 апр в 19:36

    Приветствую. Не могли бы вы помочь с разметкой данного рейтинга тип 3: http://webrambo.ru/100-reyting-dle-kak-na-youtube-razdelnye-layki-shkala.html

      • 1
      1067
        •  Команда Pandoge
      26 апр в 01:11

      Дмитрий, насколько я вижу, в предложенном виде не вносятся правки в файлы движка. Это значит, что вы можете самостоятельно сделать разметку на основании данной статьи или способа из комментариев.

      • 1
      5
        •  Проверенный
      27 апр в 02:18

      Я сделал по формуле выше:

      function wilson_score($up, $down) {

      if (!$up) return $down;

      $n = $up + $down;

      $z = 1.64485;

      $phat = $up / $n;

      return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);

      }

      if($row["vote_num"] == 0) { // Если оценок (количество) 0

      $numb_rate = 0; // Оценка

      $numb_vote = 0; // Количество оценок

      } else { // Если оценок (количество) больше 0

      $rm = ($row["vote_num"] - $row["rating"]) / 2;

      $rp = $row["rating"] + $rm;

      $numb_vote = $row["vote_num"]; // Количество оценок

      $numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка

      }

      $tpl->set("{numb_rate}", $numb_rate);

      $tpl->set("{numb_vote}", $numb_vote);

      Но проблема в том что когда рейтинг минус -1 то в <meta itemprop="ratingValue" content="{numb_rate}"> выводиться оценка 10.0

      У меня сейчас стоит http://webrambo.ru/100-reyting-dle-kak-na-youtube-razdelnye-layki-shkala.html второй вариант где зеленые и красные пальцы. Не могли бы вы подсказать как в это запихать процент % <meta itemprop="ratingValue" content="{numb_rate}"> Ну на пример если у новости рейтинг 47% то здесь {numb_rate} должно выводиться оценка 4.7, если к примеру 88% то будет выводиться 8.8 оценка? Возможно такое реализовать?

      • 1
      5
        •  Проверенный
      27 апр в 02:28

      Или хотя бы можете подсказать, что исправить в этой формуле, чтобы когда рейтинг 0 или минус то выводилось {numb_rate} 0 но не 10.0 ?

      function wilson_score($up, $down) {

      if (!$up) return $down;

      $n = $up + $down;

      $z = 1.64485;

      $phat = $up / $n;

      return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);

      }

      if($row["vote_num"] == 0) { // Если оценок (количество) 0

      $numb_rate = 0; // Оценка

      $numb_vote = 0; // Количество оценок

      } else { // Если оценок (количество) больше 0

      $rm = ($row["vote_num"] - $row["rating"]) / 2;

      $rp = $row["rating"] + $rm;

      $numb_vote = $row["vote_num"]; // Количество оценок

      $numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка

      }

      $tpl->set("{numb_rate}", $numb_rate);

      $tpl->set("{numb_vote}", $numb_vote);

      • 0
      1067
        •  Команда Pandoge
      27 апр в 03:28

      Дмитрий, попробуйте так:

      function wilson_score($up, $down) {
      
      	if(!$up) {
      	
      		return $down;
      		
      	}
      	
      	$n = $up + $down;
      	$z = 1.64485;
      	$phat = $up / $n;
      
      	return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);
      
      }
      
      if($row["vote_num"] == 0) { // Если оценок (количество) 0
      
      	$numb_rate = 0; // Оценка
      	$numb_vote = 0; // Количество оценок
      
      } else { // Если оценок (количество) больше 0
      
      	if($row["rating"] <= 0) { // Если рейтинг меньше 1
      	
      		$numb_rate = 0; // Оценка
      		$numb_vote = 0; // Количество оценок
      	
      	} else {
      
      		$rm = ($row["vote_num"] - $row["rating"]) / 2;
      		$rp = $row["rating"] + $rm;
      		$numb_vote = $row["vote_num"]; // Количество оценок
      		$numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка
      
      	}
      
      }
      
      $tpl->set("{numb_rate}", $numb_rate);
      $tpl->set("{numb_vote}", $numb_vote);
      • 0
      5
        •  Проверенный
      27 апр в 22:59

      Благодарю. Вроде работает, тока вот правильно нет, пока не знаю.

      • 1
      5
        •  Проверенный
      27 апр в 23:55

      Не получается. Сейчас если минусов больше чем плюсов оценка постоянно ноль. И пока плюсов не будет больше чем минусов она не меняется.

      • 0
      1067
        •  Команда Pandoge
      28 апр в 00:40

      Дмитрий, да, если оценка отрицательная (а по правилу разметки - это ошибка), все преобразовывается в 0.

    • 0
    2
      •  Пользователь
    17 мар в 23:01

    Извините, но какой-то бред.

    Почему я получаю в <meta itemprop="ratingValue" content="4.5"> 4.5? если поставлено 20 лайков и 0 дизлайков?

    Должно быть 5.0

    А еще лучше - 10. Т.е. оценка не 5, а 10

      • 0
      1067
        •  Команда Pandoge
      18 мар в 00:35

      Mark, внимательно прочитайте статью, там есть четкий ответ на Ваш вопрос.

      • 3
      2
        •  Пользователь
      19 мар в 08:11

      Статическое проставление значения в оценку? не самая лучшая реализация, мягко сказать.

      Нужен пересчет среднего значения рейтинга в 5 или 10 бальную шлаку.

      Вот что нужно http://zerocoolpro.biz/forum/threads/kak-vychislit-srednij-rejting-do-10-ballov.4272/#post-104243

      • 2
      1067
        •  Команда Pandoge
      20 мар в 01:01

      Mark, а по мне - очень даже хорошая, учитывая, что этот рейтинг только для сниппета.

      Но если Вы все же хотите динамики, то попробует так (вариант для третьего типа):

      function wilson_score($up, $down) {
      
          if (!$up) return $down;
          $n = $up + $down;
          $z = 1.64485;
          $phat = $up / $n;
      	
          return ($phat + $z * $z / (2 * $n) - $z * sqrt(($phat * (1 - $phat) + $z * $z / (4 * $n)) / $n)) / (1 + $z * $z / $n);
      	
      }
      
      if($row['vote_num'] == 0) { // Если оценок (количество) 0
      
      	$numb_rate = 0; // Оценка
      	$numb_vote = 0; // Количество оценок
      	
      } else { // Если оценок (количество) больше 0
      
      	$rm = ($row['vote_num'] - $row['rating']) / 2;
      	$rp = $row['rating'] + $rm;
      	$numb_vote = $row['vote_num']; // Количество оценок
      	$numb_rate = number_format(wilson_score($rp, $rm) * 10, 1); // Оценка
      	
      }
      
      $tpl->set('{numb_rate}', $numb_rate);
      $tpl->set('{numb_vote}', $numb_vote);
      • 1
      1067
        •  Команда Pandoge
      20 мар в 13:00

      При этом:

      <meta itemprop="bestRating" content="5">

      заменяете на:

      <meta itemprop="bestRating" content="10">
    • 1
    1067
      •  Команда Pandoge
    3 мар в 02:17

    Статья обновлена.

    Изменен принцип разметки (теперь нет ошибок при проверке валидатором) + прокомментированы участки кода, для лучшего понимая и тонкой настройки.

    • 1
    8
      •  Проверенный
    27 фев в 23:03

    Артём, здравствуйте. Вы в другом посте написали "Можно немного схитрить и присвоить рейтинг тем новостям, у которых текущий рейтинг 0.". Вы не подскажите, а как эту хитрость сделать для микроразметки третьего типа рейтинга, при этом чтоб рейтинг был такой:

    -1 - рейтинг 4;

    -2 - рейтинг 3;

    -3 - рейтинг 2;

    -4 и больше - рейтинг 1.

    ?

    Спасибо.

      • 2
      1067
        •  Команда Pandoge
      28 фев в 13:54

      Scorpion, Здравствуйте. Комментарий выше от меня вроде как решает эту проблему.

      • 1
      8
        •  Проверенный
      28 фев в 14:57

      Артём, Вы описали как сделать понижающий рейтинг при отрицательных показателях, но не описали как применить "хитрость" (чтоб все "пустые" посты были с определённым рейтингом в микроразметки) для рейтинга "Нравится \ не нравится".

      Проще говоря как применить код:

      $rating_numb = str_replace(",", ".", round($row['rating'] / max(1, $row['vote_num']), 1));

      if($rating_numb == 0) {

      $rating_numb = "4"; // У всех новостей без оценки будет 4

      }

      $tpl->set('{rating_nums}', $rating_numb);

      к коду:

      if($row['vote_num'] == 0) {

      $numb_rate = 0;

      $numb_vote = 0;

      } else {

      if($row['rating'] == "-1") {

      $numb_rate = 4;

      } elseif($row['rating'] == "-2") {

      $numb_rate = 3;

      } elseif($row['rating'] == "-3") {

      $numb_rate = 2;

      } elseif($row['rating'] <= "-4") {

      $numb_rate = 1;

      } elseif($row['rating'] > 0) {

      $numb_rate = 4.5;

      }

      $numb_vote = $row['vote_num'];

      }

      $tpl->set('{numb_rate}', $numb_rate);

      $tpl->set('{numb_vote}', $numb_vote);

      • 1
      1067
        •  Команда Pandoge
      28 фев в 15:54

      Scorpion,

      $numb_rate = 0; // Оценка

      $numb_vote = 0; // Количество оценок

      Меняйте на нужные Вам значения.

      • 1
      8
        •  Проверенный
      28 фев в 15:58

      Артём, хм.. спасибо большое. Не думал что всё настолько просто..

      Я поставил так:

      $numb_rate = 3;

      $numb_vote = 0;

      Как я понимаю в поисковике у всех постов с сайта, должна быть оценка 3.

      Через пару недель напишу сработало или нет))

      • 2
      1067
        •  Команда Pandoge
      28 фев в 16:13

      Scorpion, да. Только 0 лучше замените на 1, например, а то не логично - оценка 3, а количество человек, кто оставил оценку - 0.

    • 0
    766
      •  Гости
    18 сен в 08:48

    Жалко на dle 13.0 не работает, можно как то поправить?

    • 1
    766
      •  Гости
    16 мар в 12:32

    А можно ли здесь

    if($row['vote_num'] == 0) {

    $numb_rate = 0;

    $numb_vote = 0;

    } else {

    $numb_rate = 4.5;

    $numb_vote = $row['vote_num'];

    }

    $tpl->set('{numb_rate}', $numb_rate);

    $tpl->set('{numb_vote}', $numb_vote);

    Поставить вместо 4.5 например 4.4 или 4.8 ?

      • 8
      1067
        •  Команда Pandoge
      16 мар в 13:03

      Niki, да, конечно.

      • 1
      766
        •  Гости
      16 мар в 17:28

      Получается для всех новостей будет выводится оценка 4.5 независимо от количества голосов? Как Google к такому отнесется?

      • 7
      1067
        •  Команда Pandoge
      16 мар в 19:27

      Niki, он же не может проверить реальная эта оценка или нет. Есть разметка, есть данные в ней - значит будет их выводить.

      • 1
      766
        •  Гости
      17 мар в 11:45

      А можно ли сделать так:

      1 лайк - 1звезда

      2лайка - 2звезды

      3лайка - 3 звезды

      4лайка - 4звезды

      дальше с каждыми 100 оценившими + 0.1 (например 104 лайка 4.1, 204 лайка 4.2) А все что выше 4.7 так и остается??

    • 1
    766
      •  Гости
    11 ноя в 00:08

    Может стоило бы еще сделать, например:

    2 лайка - рейтинг 2;

    3 лайка - рейтинг 3;

    4 лайка - рейтинг 4;

    5 лайков и больше - рейтинг 5.

      • 9
      1067
        •  Команда Pandoge
      11 ноя в 03:05

      Gera, сделать можно, но нужно ли.

      Представим, что у вас не такая большая аудитория на сайте. 1 или 2 человека оценивают ваш материал и по вашей логике, оценка материала становиться 1/5 или 2/5 соответственно.

      Далее, страница индексируется поисковиками и люди, нашедшие там ваш сайт видят оценку - 1/5, что говорит о том, что люди не очень хорошо отзываются об этом материале и есть ли смысл тратить время на его изучение.

      Как то так. Если вы представляете все это по другому - я очень рад буду это услышать. glass

      • 2
      766
        •  Гости
      11 ноя в 10:08

      Артем Мáлков, может тогда наоборот?

      -1 - рейтинг 4;

      -2 - рейтинг 3;

      -3 - рейтинг 2;

      -4 и больше - рейтинг 1.

      • 6
      1067
        •  Команда Pandoge
      11 ноя в 15:52

      Gera, а вот это уже интересно. В вашем случае

      if($row['vote_num'] == 0) {
      
      	$numb_rate = 0;
      	$numb_vote = 0;
      	
      } else {
      
      	if($row['rating'] < 0) {
      	
      		$numb_rate = 1;
      		
      	} elseif($row['rating'] > 0) {
      	
      		$numb_rate = 4.5;
      		
      	} else {
      	
      		$numb_rate = 0;
      		
      	}
      	
      	$numb_vote = $row['vote_num'];
      	
      }
      
      $tpl->set('{numb_rate}', $numb_rate);
      $tpl->set('{numb_vote}', $numb_vote);

      Вы заменяете на

      if($row['vote_num'] == 0) {
      
      	$numb_rate = 0;
      	$numb_vote = 0;
      	
      } else {
      
      	if($row['rating'] == '-1') {
      	
      		$numb_rate = 4;
      		
      	} elseif($row['rating'] == '-2') {
      	
      		$numb_rate = 3;
      		
      	} elseif($row['rating'] == '-3') {
      	
      		$numb_rate = 2;
      		
      	} elseif($row['rating'] <= '-4') {
      	
      		$numb_rate = 1;
      		
      	} elseif($row['rating'] > 0) {
      	
      		$numb_rate = 4.5;
      		
      	}
      	
      	$numb_vote = $row['vote_num'];
      	
      }
      
      $tpl->set('{numb_rate}', $numb_rate);
      $tpl->set('{numb_vote}', $numb_vote);
    • 2
    766
      •  Гости
    28 окт в 18:44

    Ваши махинации для "Микроразметка третьего типа рейтинга" ничего не дают в сущности, уж лучше поставить вручную 4,5 и ничего не менять в файлах скрипта. Плохое решение!

      • 8
      1067
        •  Команда Pandoge
      28 окт в 20:17

      Seva, на мой взгляд решение хорошее (не считая конечно статистической общей оценки) - так как Вы получаете изменяемое число оценивших новость, а более здесь Вы ничего и не получите в этих типах рейтинга.

Подняться наверх
«Pandoge» - помощник вебмастера