Хлебные крошки в Speedbar + RDFa для DLE

Хлебные крошки в Speedbar + RDFa

Хлебные крошки в Speedbar + RDFa

Как известно, в DLE начиная с версии 10.0 в спидбар были добавлены так называемые хлебные хрошки для микроразметки.
Все успешно работает и поисковик их нормально читает, даже валидатор не показывает ни одной ошибки, но есть один нюанс, который немного меня смущает.
Обратим внимание на строку с параметром itemtype:
<span itemscope itemtype=\"http://data-vocabulary.org/Breadcrumb\">

По указанному адресу http://data-vocabulary.org/Breadcrumb гугл отвечает 404. That’s an error.
Не знаю как вам, а меня подобное не совсем устраивает. Поэтому я переделал спидбар в компактный вид согласно схемы http://schema.org/BreadcrumbList

Открыть файл engine/engine.php
Найти код:
if ($config['speedbar']
...
}
?>


Заменить на:
if ($config['speedbar'] AND !$view_template) {
    $speedbar_rdfa = 0; //Формат разметки: 1 - RDFa, 0 - обычная микроразметка
    $speedbar_prop = array(
        'li' => array(
            'itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"',
            'property="itemListElement" typeof="ListItem"',
        ),
        'a' => array(
            'itemscope itemtype="http://schema.org/Thing" itemprop="item"',
            'property="item" typeof="WebPage"',
        ),
        'ul' => array(
            'itemscope itemtype="http://schema.org/BreadcrumbList"',
            'vocab="http://schema.org/" typeof="BreadcrumbList"',
        ),
        'span' => array(
            'itemprop="name"',
            'property="name"',
        ),
    );
    
    function getBreadcrumbListCategories($id, $sec = false)
    {
        global $speedbar,$cat_info,$config,$dle_module;
        if (!$id) {
            return false;
        }
        if ($cat_info[$id]['parentid']) {
            getBreadcrumbListCategories( $cat_info[$id]['parentid'], true );
        }
        $speedbar[] = array( $config['http_home_url'] . get_url( $id ) . '/', $cat_info[$id]['name'], $cat_info[$id]['metatitle'] );
    }
    $config['speedbar_separator'] = $config['speedbar_separator'] ? trim($config['speedbar_separator']) : "&raquo";
    $speedbar = array( array( $config['http_home_url'], $config['short_title'], $config['home_title'] ) );
    if ($temp = intval($category_id)) {
        getBreadcrumbListCategories( $temp );
    } elseif ($do == 'tags') {
        $speedbar[] = array("/tags/", $lang['tag_cloud'] );
        $speedbar[] = array("/tags/" . urlencode($tag), $tag);
    } elseif ($nam_e) {
        $speedbar[] = $nam_e;
    }

    if ($mod_speedbar) {
        $speedbar = array_merge($speedbar, $mod_speedbar);
    }

    if ($titl_e) {
        $speedbar[] = $titl_e;
    } elseif (isset($_GET['cstart']) && intval($_GET['cstart']) > 1) {
        $speedbar[] = $lang['news_site']." ".intval($_GET['cstart']);
    }

    $tpl->load_template ( 'speedbar.tpl' );
    $last_item = array_pop($speedbar);
    $speedbar[] = is_array($last_item) ? $last_item[1] : $last_item;
    foreach ($speedbar as $k => $v) {
        $speedbar[$k] = "<li {$speedbar_prop['li'][$speedbar_rdfa]}>";
        $title_s = "<span {$speedbar_prop['span'][$speedbar_rdfa]}>".(is_array($v) ? $v[1] : $v)."</span>";
        $speedbar[$k] .= is_array($v) ? "<a {$speedbar_prop['a'][$speedbar_rdfa]} href=\"{$v[0]}\" title=\"".($v[2] ?: $v[1])."\">{$title_s}</a>" : $title_s;
        $speedbar[$k] .= "<meta itemprop=\"position\" content=\"".( $k+1 )."\" /></li>";
    }

    $tpl->set( "{speedbar}", "<ul {$speedbar_prop['ul'][$speedbar_rdfa]} class=\"speedbar\">" . join("<li class=\"speedbar_sep\">{$config['speedbar_separator']}</li>", $speedbar) . "</ul>" );
    $tpl->compile ( 'speedbar' );
    $tpl->clear();
    $tpl->result['speedbar'] = '<div id="dle-speedbar">'.$tpl->result['speedbar'].'</div>';
}


В стилях прописать:
.speedbar{
	margin: 0;
	padding: 10px;
	list-style: none;
}
.speedbar:after{
	content: "";
	display: block;
	clear: both;
}
.speedbar li{
	float: left;
	margin-right: 6px;
	color: #222;
}
.speedbar li.speedbar_sep{
	color: #999;
}


Пример работы можно видеть на моем сайте или на демо сайте.

Хлебные крошки в Speedbar + RDFa
Хлебные крошки в Speedbar + RDFa


В живую посмотреть можно на валидаторе.

С уважением,
Олег Александрович a.k.a. Sander
Комментарии: (40)
  1. foto
    VIP 5 января 2017 15:25 #
    вот это круто) тоже замечал, то что 404 ошибка идёт, но думал фиг знает, может так нужно ему))
    а тут решение хорошее и правильное, так как микроразметка schema.org удобная
    0
  2. foto
    Посетитель 11 января 2017 20:41 #
    Спасибо, подскажите как убрать тайтл публикации из кода, что бы в Speedbar осталось только : SanDev.pro › Datalife Engine
    0
    1. foto
      Администратор 11 января 2017 22:39 #
      Вместо
      if($titl_e) $speedbar[] = $titl_e;

      Использовать
      if($titl_e AND !$news_found) $speedbar[] = $titl_e;
      +3
      1. foto
        Посетитель 11 января 2017 23:09 #
        Спасибо большое.
        0
      2. foto
        VIP 13 января 2017 05:28 #
        вообще правильно ли я понимаю, то что title тут уже как бы можно использовать, а можно и не использовать, так сказать для фантазии и извращения вебмастера лишь.
        так как микроразметка складывается от данных itemprop="name"
        к чему я? ну если будет стоять title как у Вас на сайте, либо убрать его, как спросила Elena. в результате то, особо нечего не изменится, так как микроразметка строится из данных itemprop="name"
        верно?
        0
        1. foto
          Администратор 13 января 2017 12:43 #
          По большому счету верно, для поисковиков нет разницы есть в спидбаре заголовок или нет. Они все равно в первую очередь обращают внимание на metatitle и h1
          0
  3. foto
    VIP 13 января 2017 04:39 #
    вот появился такой вопрос, а если применить данную телегу, а как быть тем у кого модуль например dle-cart Ваш.
    там вставка кода немного другая какая то, ну и поле, например найти и перед вставить, уже изменяется...
    как правильно применить к этому хаку и ещё установку в спидбар dle-cart?
    0
    1. foto
      Администратор 13 января 2017 12:39 #
      	elseif( $do == 'cart' ){
      		if( $subaction ){
      			$speedbar[] = array( "/cart/", $cart_config['metatitle'] );
      			$speedbar[] = $cart_lang["cpage_".$subaction];
      		}else $speedbar[] = $cart_config['metatitle'];
      	}
      +1
      1. foto
        VIP 14 января 2017 08:01 #
        а тут, куда вставлять? ну чтобы не намутить)
        if ($config['speedbar'] AND !$view_template ) {
        	function get_breadcrumblistcategories($id,$sec = false){
        		global $speedbar,$cat_info,$config,$cstart,$dle_module;
        		if(!$id) return;
        		$parent_id = $cat_info[$id]['parentid'];
        		if($parent_id) get_breadcrumblistcategories( $parent_id, true );
        		if($sec OR $cstart>1 OR $dle_module!='cat') $speedbar[] = array( $config['http_home_url'] . get_url( $id ), $cat_info[$id]['name'], $cat_info[$id]['metatitle'] );
        		else $speedbar[] = $cat_info[$id]['name'];
        	}
        	$config['speedbar_separator'] = $config['speedbar_separator'] ? trim($config['speedbar_separator']) : "&raquo";
        	$speedbar = array( array( $config['http_home_url'], $config['short_title'], $config['home_title'] ) );
        	if (intval($category_id)) get_breadcrumblistcategories( intval($category_id) );
        	elseif( $do == 'tags' ){
        		$speedbar[] = array( "/tags/", $lang['tag_cloud'] );
        		$speedbar[] = $tag;
        	}elseif($nam_e) $speedbar[] = $nam_e;
        
        	if($titl_e) $speedbar[] = $titl_e;
        	elseif( isset($_GET['cstart']) AND intval($_GET['cstart']) > 1 ) $speedbar[] = $lang['news_site']." ".intval($_GET['cstart']);
        
        	foreach($speedbar as $k=>$v){
        		$speedbar[$k] = '<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">';
        		$title_s = "<span itemprop=\"name\">".(is_array($v) ? $v[1] : $v)."</span>";
        		$speedbar[$k] .= is_array($v) ? "<a itemprop=\"item\" href=\"{$v[0]}\" title=\"".($v[2] ?: $v[1])."\">{$title_s}</a>" : $title_s;
        		$speedbar[$k] .= "<meta itemprop=\"position\" content=\"".( $k+1 )."\" /></li>";
        	}
        	$tpl->load_template ( 'speedbar.tpl' );
        	$tpl->set ( "{speedbar}", "<ul itemscope itemtype=\"http://schema.org/BreadcrumbList\" class=\"speedbar\">".implode("<li class=\"speedbar_sep\">{$config['speedbar_separator']}</li>",$speedbar)."</ul>" );
        	$tpl->compile ( 'speedbar' );
        	$tpl->clear();
        	$tpl->result['speedbar'] = '<span id="dle-speedbar">'.$tpl->result['speedbar'].'</span>';
        }
        ?
        0
        1. foto
          Администратор 14 января 2017 12:13 #
          Так же, перед:
          elseif( $do == 'tags' ){
          +1
  4. foto
    Посетитель 14 января 2017 14:29 #
    А в engine/modules/functions.php ничего переделывать не нужно?
    И на что это повлияет если в engine.php переделать, а в functions.php так оставить?

    function get_breadcrumbcategories($id) {
    	
    	global $cat_info, $config, $PHP_SELF;
    	
    	if( ! $id ) return;
    	
    	$parent_id = $cat_info[$id]['parentid'];
    	
    	if( $config['allow_alt_url'] ) $list = "<span itemscope itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"" . $config['http_home_url'] . get_url( $id ) . "/\" itemprop=\"url\"><span itemprop=\"title\">{$cat_info[$id]['name']}</span></a></span>";
    	else $list = "<span itemscope itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"$PHP_SELF?do=cat&amp;category={$cat_info[$id]['alt_name']}\" itemprop=\"url\"><span itemprop=\"title\">{$cat_info[$id]['name']}</span></a></span>";
    	
    	while ( $parent_id ) {
    		
    		if( $config['allow_alt_url'] ) $list = "<span itemscope itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"" . $config['http_home_url'] . get_url( $parent_id ) . "/\" itemprop=\"url\"><span itemprop=\"title\">{$cat_info[$parent_id]['name']}</span></a></span>" . " &raquo; " . $list;
    		else $list = "<span itemscope itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"$PHP_SELF?do=cat&amp;category={$cat_info[$parent_id]['alt_name']}\" itemprop=\"url\"><span itemprop=\"title\">{$cat_info[$parent_id]['name']}</span></a></span>" . " &raquo; " . $list;
    		
    		$parent_id = $cat_info[$parent_id]['parentid'];
    		
    		if( $cat_info[$parent_id]['parentid'] == $cat_info[$parent_id]['id'] ) break;
    	
    	}
    	
    	return $list;
    }
    0
    1. foto
      Администратор 14 января 2017 14:51 #
      Эта функция более не используется. Вместо нее я написал свою get_breadcrumblistcategories
      Так проще установка, когда все в одном месте вставляется.
      +1
      1. foto
        Посетитель 14 января 2017 15:18 #
        Спасибо.
        0
  5. foto
    Посетитель 16 января 2017 15:41 #
    А как заменить между разделами оформление <li class="speedbar_sep">›</li>? Стрелочки не приметные, как ее заменить на стрелочку из fontawesome? Уже и стили прописал, а старая стрелочка пропала, а новая не появилась(((
    Вот класс для новой стрелочки
    .speedbar_sep {content:'\e600';font-family:'icomoon';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#b9b9b9;position:absolute;right:-22px;top:7px;font-size:25px;}
    

    Как произвести замену?
    0
    1. foto
      Администратор 16 января 2017 17:52 #
      Не проще ли в настройках движка просто указать в поле разделителя:
      <i class='icon-youricon'></i>
      +1
  6. foto
    Посетитель 17 января 2017 23:08 #
    Цитата: Sander
    Не проще ли в настройках движка просто указать в поле разделителя:
    <i class='icon-youricon'></i>

    А немного подробнее можно?))) Где именно эти настройки находятся?)
    +1
  7. foto
    Посетитель 18 января 2017 08:12 #
    Цитата: baseroad
    Цитата: Sander
    Не проще ли в настройках движка просто указать в поле разделителя:
    <i class='icon-youricon'></i>

    А немного подробнее можно?))) Где именно эти настройки находятся?)

    Нашел, спасибо)
    0
  8. foto
    Клиент 24 января 2017 12:44 #
    Отличное решение, спасибо! Не могли бы Вы только подсказать, как сделать так, чтобы
    <span id="dle-speedbar">
    шел уже после
    <div class="speedbar">
    , как было реализовано изначально? Поскольку в ином случае ругается валидатор
    0
    1. foto
      Администратор 24 января 2017 12:54 #
      Обновил инструкцию. Заменил span на div.
      +2
      1. foto
        Клиент 25 января 2017 19:22 #
        Благодарю! Заметил еще небольшой недочет с точки зрения SEO: ссылки на категории идут без слэша (Пример: http://site.ru/news). В результате данная ссылка будет иметь статус "301 Moved Permanently". Поэтому, желательно, чтобы ссылки шли изначально со слэшем.
        +2
        1. foto
          Администратор 25 января 2017 20:04 #
          Уф, точно. Как-то совсем не обратил на это внимание.
          Спасибо. Исправил код.
          0
  9. foto
    Посетитель 2 марта 2017 20:59 #
    Подскажите пожалуйста как сделать что бы на странице тега ссылка в спидбаре была кликабельна ? ( нарушала СЕО и сама на себя ссылалась) .

    И правильно ли подправила тоже самое для категорий: function get_breadcrumblistcategories($id,$sec = false){
    заменила на: function get_breadcrumblistcategories($id,$sec = "»"){
    0
    1. foto
      Посетитель 2 марта 2017 23:44 #
      заменила на: function get_breadcrumblistcategories($id,$sec = "& raquo ;"){
      0
    2. foto
      Администратор 3 марта 2017 02:24 #
      Для тегов:
      $speedbar[] = $tag;

      Заменить на
      $speedbar[] = array("/tags/".urlencode($tag), $tag);


      Для категорий:
      function get_breadcrumblistcategories($id,$sec = true){
      0
  10. foto
    Посетитель 3 марта 2017 02:49 #
    Спасибо огромное!
    0
  11. foto
    Посетитель 13 марта 2017 11:46 #
    А в чём отличия от RDFA Breadcrumb
    https://gameer.name/dle/43
    0
    1. foto
      Администратор 13 марта 2017 12:57 #
      Про разницу форматов RDFa и microdata вам лучше проконсультироваться у SEO специалистов.
      Подправил код, добавил возможность переключения типа разметки в параметре
      $speedbar_rdfa = true;
      0
  12. foto
    Клиент 21 октября 2017 00:14 #
    После обновления до DLE 12 (либо это вообще не связано с обновлением, однако до этого проблема не возникала) столкнулся со следующей ошибкой валидатора:
    The itemprop attribute was specified, but the element is not a property of any item.
    /span></a><meta itemprop="position" content="1" /></li><

    The itemprop attribute was specified, but the element is not a property of any item.
    /span></a><meta itemprop="position" content="2" /></li><
    0
    1. foto
      Администратор 23 октября 2017 14:50 #
      Был маленький недочет с этим itemprop. Для RDFa и микроразметки он по разному должен быть прописан.
      На гугловском валидаторе проверил, оба варианта работают исправно, ошибок нет.
      0
  13. foto
    VIP 15 ноября 2017 20:32 #
    А, что желательно указать в настройках системы в поле "Краткое название сайта" ? Урл домена без http или что? Или вообще не важно? А что лучше? )
    P.S. В инструкции написано:
    Найти код
    
    if ($config['speedbar']
    ...
    }
    ?>
    

    Заменить на... но уже без символов в конце:
    
    ?>
    
    0
    1. foto
      Администратор 15 ноября 2017 23:44 #
      Короткое название сайта - что угодно, но что-то что логически будет соответствовать главной странице сайта. Чтобы в гугле отображалось красиво и понятно.

      ?>

      в конце не обязателен и даже скорее вовсе не нужен.
      Желательно только чтобы последняя строка была просто пустая.
      +1
  14. foto
    Клиент 23 ноября 2017 23:31 #
    как вернуть отображения названия новости в speedbar? (как у вас на сайте )
    0
    1. foto
      Клиент 23 ноября 2017 23:34 #
      всё норм. просто сливалось с фоном и не было видно
      0
  15. foto
    Клиент 20 декабря 2017 09:54 #
    Подскажите, стоит MultiTags как сделать ссылки в speedbar как у вас на сайте KinoLem, то есть вместо "Site » Тег,Тег" сделать "Site » Тег + Тег". Интересует именно разделитель вместо запятой плюс, ссылку на облако тегов я уже убрал)))
    0
    1. foto
      Администратор 20 декабря 2017 13:21 #
      engine/engine.php
      Найти строку:
      	elseif ($do == 'tags') {

      После нее вставить:
      		$tag = str_replace(",", " + ", $tag);
      0
      1. foto
        Клиент 20 декабря 2017 14:54 #
        Спасибо!
        0
  16. foto
    VIP 17 января 2018 00:53 #
    У меня в шаблоне автор не предусмотрел в верстке тег speedbar. Отсутствие этого тега в шаблоне повлияет на микроразметку?
    P.S. На первом сайте все отлично получилось!
    0
    1. foto
      Администратор 17 января 2018 15:45 #
      speedbar - это и есть хлебные крошки.
      нет спидбира - нет крошек.
      нет крошек - нет разметки.
      +1
  17. foto
    VIP 17 января 2018 00:55 #
    На DLE 12.1 тоже нужно делать изменения?
    25. Добавлено использование микроразметки schema.org для вывода рейтинга с типом "Оценка". Использование данной микроразметки позволяет для полных новостей при выводе их в результатах поиска в Google выводить также и рейтинг публикации.
    0
    1. foto
      Администратор 17 января 2018 15:45 #
      Микроразметка для хлебных крошек и для рейтинга - это разные никак не связанные вещи.
      +1
Добавить комментарий
  • Логин
  • E-mail
Повторите рисунок:
antibot
© Sander-Development. 2009-2018.
При копировании, ссылка на источник обязательна.