Привіт, друзі. Сьогодні вирішив спалити чергову тему модифікації нашого улюбленого движка DLE – будемо робити мікророзмітку рейтингу новин для розширеного фрагменту Google Rich Snippets. Як ви пам’ятаєте, минулого разу ми робили мікророзмітку хлібних крихт, якщо ще не читали, зробіть це зараз.

На відміну від минулого посту, де ймовірність спрацьовування наших доробок була дорівнює 100%, то в цей раз наші доробки спрацюють з ймовірністю «пощастить — не пощастить». Догралися ми з вами, стали зловживати подібної микроразметкой, і Google відрубав для більшості сайтів розширені сніппети. Тим не менш, мізерна ймовірність включення для вашого сайту подібної краси все ж існує. Так що гріх не спробувати!

Дивіться, ось знайшов приклад у Гугла для свого блогу:

* — мій блог працює на WordPress, а розмітка фейковая, я наводжу його тут просто як приклад роботи розмітки.

Цю розмітку я впроваджував фіг знає як давно і взагалі про неї забув, але вона іноді зустрічається, як бачите. Як і за якими алгоритмами Google вибирає, де показати зірочки, я не знаю, т. к. розмічені всі пости, а гарний фрагмент показується лише для декількох постів і вони постійно змінюються.

До речі, прошу звернути увагу ще на той факт, що у мене в сніппеті є красиві хлібні крихти, але я їх ніяк не розмічав, Google їх сам визначив і вмонтував в сніппет для всього мого сайту. І що ще цікавіше, я бачив кілька прикладів сайтів, де не були розмічені рейтинги-зірочки, але Гугл все одно показував їх у сніппеті. Знаючи все це, стає зрозуміло, що особливо маніпулювати цими речами не вийде, пошуковик все одно зробить по-своєму.

Не дивлячись ні на що, ми будемо намагатися, кому-то так пощастить.

Модифікація рейтингу новин на DLE під мікророзмітку

Увага!!! Кілька умов, невиконання яких призводить до різних проблем і помилок:
— Дані інструкції застосовні для DLE версій 9.6 та 9.7. (Для більш ранніх версій є пара рішень в коментарях, але я за них не ручаюся).
— Обов’язкова налаштування рушія! Налаштування груп користувачів -> Гості -> Вкладка «Новини» -> Дозволити виставлення рейтингу новин: Так.
— Висновок рейтингу зі сторінок категорій рекомендується прибрати, тобто видалити згадування рейтингу з шаблону shortstory.tpl. Або можна виконати наступне — #comment-13374 — але я б не рекомендував.

Отже, нам доведеться допилити кілька файлів движка, щоб все запрацювало так, як ми цього хочемо, а так само можна застосувати декілька хитрощів, але про все по порядку…

Приступимо, відкриваємо файл /engine/modules/functions.php і знаходимо:

function ShowRating($id, $rating, $vote_num, $allow = true) {
global $lang;

return $rated;
}
function userrating($id) {

function ShowRating($id, $rating, $vote_num, $allow = true) {
global $lang;

return $rated;
}
function userrating($id) {

Там де у мене в коді стоїть три крапки, там знаходиться багато коду, я його вирізав, не лякайтеся, для нас важливіше знайти початок і кінець.

Виділяємо вказаний мною код та замінюємо його на наступний:

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 = <<

  • {$rating}
  • HTML;
    return $rated;
    }
    $rated = <<

  • {$AVERrating}
  • 1
  • 2
  • 3
  • 4
  • 5
  • HTML;
    return $rated;
    }
    function userrating($id) {

    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 = <<

  • {$rating}
  • HTML;
    return $rated;
    }
    $rated = <<

  • {$AVERrating}
  • 1
  • 2
  • 3
  • 4
  • 5
  • HTML;
    return $rated;
    }
    function userrating($id) {

    У цьому коді в потрібних місцях вже додані всі необхідні позначки, а так само застосована моя маленька «хитрість», про яку я розповім трохи нижче.

    З цим файлом закінчили – зберігаємо і заливаємо на сервер, замінюючи колишній.

    Відкриваємо файл /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}’, \”vote-num-id-“.$row[‘id’].\”>”.$row[‘vote_num’].);
    $tpl->set( ‘[rating]’, “” );
    $tpl->set( ‘[/rating]’, “” );
    } else {

    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}’, ““.$row[‘vote_num’].”” );
    $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}’, \”votes\” id=\”vote-num-id-“.$row[‘id’].\”>”.$row[‘vote_num’].);
    $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}’, ““.$row[‘vote_num’].”” );
    $tpl->set( ‘[rating]’, “” );
    $tpl->set( ‘[/rating]’, “” );
    } else {

    Зберігаємо файл, завантажуємо на сервер, замінюючи стару версію файлу.

    Прийшов час розповісти про «хитрощі» — вона полягає в наступному. Якщо, наприклад, зовсім свіжа новина, то для неї навряд чи є дані про рейтинг, ніхто просто не встиг проголосувати, і тоді кількість голосів буде дорівнює 0, а це помилка, ну, тобто Google скаже, що ми її обманюємо і ніякого рейтингу у нас поки немає. Так от, я модифікував код таким чином, що якщо у нас 0 голосів, то робиться «як ніби» є один голос, і це вирішує проблему з помилкою, рейтинг буде схвалений Гуглом.

    І ось, файли движка модифіковані, залишився останній штрих – додати рейтинг в шаблон нашої теми оформлення. Навіть якщо у вас вже рейтинг виводиться в шаблонах, то доведеться його серйозно доопрацювати. У будь-якому випадку, рекомендую мій варіант, він свідомо робочий.

    Відкриваємо файл /templates/*назва вашої теми*/fullstory.tpl і після {full-story} додаємо код:

    [rating]<div itemscope itemtype=“http://data-vocabulary.org/Review-aggregate”><div style=“float:left;width:100px;”>Рейтинг:</div>{rating}<div style=“float:left;width:120px;”>(голосів: {vote-num})</div></div>[/rating]

    [rating]
    Рейтинг:
    {rating}
    (голосів: {vote-num})
    [/rating]

    Якщо раптом це буде криво відображатися у вашому шаблоні, то, вибачте, не моя вина, вивчіть вже нарешті, що таке CSS. І не задавайте мені в коментарях питання, типу «допоможіть, все криво і з’їхало, я повний нуб». Рано чи пізно все одно доведеться вчити, а якщо ні, то так і залишитеся дебілами і повними нубами. Так що зробіть, будь ласка, ласку…

    Ось ніби і все 🙂 Як все просто робити по інструкції, чи не правда?

    Залишилося перевірити, що все зроблено правильно за допомогою інструменту перевірки структурованих даних Google.
    Повинні отримати щось подібне:

    Ще раз хочу нагадати, що ймовірність появи такого фрагменту, як показує нам інструмент перевірки, вкрай мала, але вона є!

    Більш докладно про цей варіант мікророзмітки можна прочитати в мануалах Гугла. Там же наведені всі три способи розмітки: микроданные, мікроформати і RDFa. У розглянутому випадку я вирішив використовувати микроданные, ніякої принципової різниці між цими варіантами немає, вони працюють однаково.

    Тепер схрестімо пальці і мріємо, щоб микроразметка рейтингу новин сподобалася Google і він її включив. А там і серйозне зростання CTR, хороший трафік, зростання позицій, гори бабла…ви такі лежите на гамаку, попиваєте коктейль і дивіться на пальми… Мріяти не шкідливо, правда?

    Спасибі за увагу, друзі, пишіть коментарі і задавайте питання.

    З повагою, Олександр Алаєв