22.02.15, 18:25
0 комментарий
  DLE Хаки

Микроразметка рейтинга DLE 9-10x

Данный способ микроразметки полностью работает.
Звёзды появились в выдаче google где-то через пол года, может и больше.
В инструментах веб-мастеров google данные о микроразметке вообще отсутствуют,
Размечать, будем стандартный рейтинг в 5 звезд.

Семантическая микроразметка рейтинга в 5 звезд

Как всегда, перед началом внесения изменений в код движка, хочу вас предупредить, о возможных непредвиденных казусах, потому, всегда, делайте резервные копии редактируемых файлов. Сегодня, будем модифицировать такие файлы:

- /engine/modules/functions.php
- /engine/modules/show.full.php
- /engine/modules/show.short.php
- /templates/*Имя Темы*/shortstory.tpl
- /templates/*Имя Темы*/fullstory.tpl


Предлагаю немного модифицировать наш functions.php

Открываем /engine/modules/functions.php и находим:

function ShowRating($id, $rating, $vote_num, $allow = true) {
	global $lang;
	
	if( $rating AND $vote_num ) $rating = round( ($rating / $vote_num), 0 );
	else $rating = 0;
	$rating = $rating * 20;
	
	if( !$allow ) {
		
		$rated = <<<HTML
<div class="rating">
		<ul class="unit-rating">
		<li class="current-rating" style="width:{$rating}%;">{$rating}</li>
		</ul>
</div>
HTML;
		
		return $rated;
	}
	
	$rated = <<<HTML
<div id='ratig-layer-{$id}'><div class="rating">
		<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>
</div></div>
HTML;
	
	return $rated;
}


Весь выделенный выше код, заменяем на:

function ShowRating($id, $rating, $vote_num, $allow = true) {
    global $lang;
 
    if( $rating AND $vote_num ) $rating = round( ($rating / $vote_num), 0 );
    else $rating = 4;
    $AVERrating = $rating;
    $rating = $rating * 17;
 
    if( !$allow ) {
 
        $rated = <<<HTML
<div class="rating">
        <ul class="unit-rating">
        <li class="current-rating" style="width:{$rating}px;">{$rating}</li>
        </ul>
</div>
HTML;
 
        return $rated;
    }
 
    $rated = <<<HTML
<div id='ratig-layer-{$id}'><div class="rating">
        <ul class="unit-rating">
        <li itemprop="ratingValue" class="current-rating" style="width:{$rating}px;">{$AVERrating}</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>
</div></div>
HTML;
 
    return $rated;
}



Разбираем изменения:
Итак мы заменили значение else $rating = 0; на else $rating = 4;(теперь дефолтный рейтинг у новой статьи будет не 0 а 4), указали, что переменная $AVERrating = $rating;, соответственно подправили переменную результата вывода рейтинга в массиве с {$rating} на {$AVERrating}, ну и естественно разметили код вывода рейтинга itemprop="ratingValue" - все для того, что бы наша только, что опубликованная статья не была с 0 рейтингом, так как поисковики, не выведут красивый сниппет для статьи с рейтингом 0.
Разобрались, да? Едем дальше.

Открываем /engine/modules/show.full.php и находим:
if( $row['allow_rate'] ) { 

			$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );
			$tpl->set( '{vote-num}', "<span id=\"vote-num-id-".$row['id']."\">".$row['vote_num']."</span>" );
			$tpl->set( '[rating]', "" );
			$tpl->set( '[/rating]', "" );

		} else { 


Все выше выделенное, заменяем на:
if ( $row['vote_num'] == 0 ) $row['vote_num'] = 1;
if( $row['allow_rate'] ) {
$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );
$tpl->set( '{vote-num}', "<span itemprop=\"reviewCount\" id=\"vote-num-id-".$row['id']."\">".$row['vote_num']."</span>" );
$tpl->set( '[rating]', "" );
$tpl->set( '[/rating]', "" );
} else {


Открываем engine/modules/show.short.php и находим:

if( $row['allow_rate'] ) { 
                        $tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );
                        $tpl->set( '{vote-num}', "<span itemprop=\"ratingCount\" id=\"vote-num-id-".$row['id']."\">".$row['vote_num']."</span>" );
                        $tpl->set( '[rating]', "" );
                        $tpl->set( '[/rating]', "" );
            
                    } else {


Заменяем на:
if ( $row['vote_num'] == 0 ) $row['vote_num'] = 1;
if ( $row['vote_num'] == 0 ) $row['vote_num'] = 1;
if( $row['allow_rate'] ) {
$tpl->set( '{rating}', ShowRating( $row['id'], $row['rating'], $row['vote_num'], $user_group[$member_id['user_group']]['allow_rating'] ) );
$tpl->set( '{vote-num}', "<span itemprop=\"ratingCount\" id=\"vote-num-id-".$row['id']."\">".$row['vote_num']."</span>" );
$tpl->set( '[rating]', "" );   
$tpl->set( '[/rating]', "" );
} else {


Сохраняем изменения и закидываем на хостинг с заменой!

Итак, мы подготовили и модифицировали стандартный рейтинг.
Осталось, вывести его на страницы, краткой и полной новости.

Открываем /templates/*Имя Темы*/fullstory.tpl (shortstory.tpl) и в месте вывода рейтинга вставляем:
[rating]<span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">{rating}<span style="display:none;">{vote-num}</span></span>[/rating]




Здесь стоит заменить что в размешиваемом теге (в этом случае тег span) должен присутствовать тег {vote-num}, я его скрыл с помощью стилей, если вам нужно - можете открыть (убрав style="display:none;"), но убирать нельзя, так ка не будет размечен reviewcount.

Ищем тег {title} и заменяем на:
<span itemprop="name">{title}</span>


В начало файла вставляем:
<div itemscope itemtype="http://schema.org/Product">


В конце файла ставим:
</div>


Ищем тег {full-story} и заменяем на:
<span itemprop="description">{full-story}</span>


Это разметка description, что бы не было ошибки Валидатора Яндекс:
ПРЕДУПРЕЖДЕНИЕ: не выполнено обязательное условие для острова "Статья" - обязательное поле description отсутствует

Сохраняем изменения и закидываем на хостинг с заменой!

Автор: ???

Напишите своё мнение