Семантически правильныe Breadcrumbs на pdoCrumbs
Верстая очередной проект для замороченных на SEO клиентов, столкнулся с тем, что pdoCrumbs конечно хорош в своей программной логике, но приведенные в документации примеры не совсем верно построены с точки зрения SEO и архитектуры HTML.
Под катом сам код, мои заметки и несколько полезных комментариев.

на FENOM
Вот два нюанса, которые я добавил.
Под катом сам код, мои заметки и несколько полезных комментариев.

[[pdoCrumbs?
&showHome=`1`
&outputSeparator=`<li> / </li>`
&tplWrapper=`@INLINE <ul itemscope="" itemtype="http://schema.org/BreadcrumbList" id="breadcrumbs">{$output}</ul>`
&tpl=`@INLINE
<li><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
<a title="{$menutitle}" itemprop="item" href="{$link}"><span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}"></a>
</span></li>`
&tplCurrent=`@INLINE
<li><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
<span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}">
</span></li>`
]]на FENOM
{'pdoCrumbs' | snippet : [
'showHome' => 1,
'outputSeparator' => '<li> / </li>',
'tplWrapper' => '@INLINE <ul itemscope="" itemtype="http://schema.org/BreadcrumbList" id="breadcrumbs">{$output}</ul>',
'tpl' => '@INLINE
<li><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
<a title="{$menutitle}" itemprop="item" href="{$link}"><span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}"></a>
</span></li>',
'tplCurrent' => '@INLINE
<li><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem">
<span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}">
</span></li>'
]}Вот два нюанса, которые я добавил.
- В разметку кода я добавил семантическую разметку schema.org для хлебных крошек. Здесь думаю комментарии излишни. Поисковики будут счастливы.
- Также проходя валидацию стандартного кода из инструкции к pdoCrumbs на validator.w3.org/ я с удивлением заметил ошибку, которая в общем то логична, но почему то я не задумывался. Суть ошибки в том, что разделитесь тоже нужно оформлять как элемент списка (если мы конечно используем списки). Разделитель по умолчанию — это просто \n
Комментарии: 31
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
из коробки компонент имеет верстку под бутстрап, и там разделитель встроен.
Я сделал как указал выше, т.е. разметка для навигации и скрытая в CSS подсказка
Но валидатор видит так
Смущают попадающие в микроразметку «Предыдущая/Следующая»
Единственное, мне на глаза попалось, что ты несколько раз используешь тэг nav. Это неверно.
Тэг Nav как и h1 должен быть один на странице. Валидатор по моему даже ругается на дубли.
PS Собственно, вот: «Тег nav задает навигацию по сайту. Если на странице несколько блоков ссылок, то в nav обычно помещают приоритетные ссылки. Также допустимо использовать несколько тегов nav в документе. Запрещается вкладывать nav внутрь address.»
Есть такая вещь как циклические ссылки, очень часто встречаются в меню. Можно ли от них избавиться, прописав в tplHere атрибут rel=«nofollow»? Или это не поможет?
вот ссылка на документацию по чанкам для хлебных крошек docs.modx.pro/components/pdotools/snippets/pdocrumbs#Параметры
P.S. tplHere не встерчается в доках и на текущей страницы, вы путаете со сниппетом из pdoMenu
P.S.S Ни разу не встречал чтобы убирали ссылку из текущего меню. но что мешает взять чанк tplHere, туда прописать обыкновенный инлайновый код и дописать уже все необходимое
[[pdoCrumbs? &showHome=`1` &showAtHome=`0` &tplWrapper=`@INLINE <ol class="breadcrumb" itemscope="" itemtype="http://schema.org/BreadcrumbList">[[+output]]</ol>` &tplHome=`@INLINE <li class="breadcrumb-item"><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem"> <a title="{$menutitle}" itemprop="item" href="{$link}"><span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}"></a> </span></li>` &tpl=`@INLINE <li class="breadcrumb-item"><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem"><a href="[[+link]]" itemprop="item"><span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}"></a></li>` &tplCurrent=`@INLINE <li class="breadcrumb-item active"><span itemscope="" itemprop="itemListElement" itemtype="http://schema.org/ListItem"> <a style="pointer-events: none;cursor: default;" title="{$menutitle}" itemprop="item" href="{$link}"><span itemprop="name">{$menutitle}</span><meta itemprop="position" content="{$idx}"></a> </span></li>` ]]Вот пример с самого Яндекса: yandex.ru/support/webmaster/controlling-robot/robots-txt.xml — там в левом меню выделен пункт меню с текущей страницей, но он является ссылкой! То есть Яндекс сам активно использует сквозняки и понимает где они.
Возьми другой сервис Яндекса, например Яндекс.Вебмастер.
Вот сколько ни нажимаю на логотип Вебмастера joxi.ru/krD9XYbuEGnLkm — меня посылает на список сайтов, и это всегда, даже когда я нахожусь на этой самой страничке списка.
Вот вызов на который ни яндекс ни гугл не ругаются
Схема:
schema.org/BreadcrumbList
В коде оно есть, но он его не видит из того, что парсер добавлет в код =""
и на выходе имеем Как избавиться от этих назойливых ="" нужно что бы было так
тогда валидация проходит
webinmind.ru/modx/packages-extras/pdotools/snippets/pdocrumbs#Вариант-без-пункта-текущей-страницы
Я просто убрал неактивный пункт меню. В schema.org, в Google и вроде даже в Яндексе, все примеры крошек без неактивного элемента. По всей видимости так модно.
В предложенном @iWatchYouFromAfar варианте, валидатор микроразметки выдавал предупреждение, что у первого элемента хлебной крошки («Номе») в коде нет атрибута itemprop=«item». Ошибка пропала при замене в 'tplHome' на Возможно, «костыль», но рабочий)
Я в комментариях и на своем сайте привел аж два варианта генерации ХК сниппетом pdoCrumbs. Просто кто-то читает не внимательно.
Вы заменили генерацию урла для первого элемента ХК, это не костыль даже, это просто бесполезное действие, оно ни на что не влияет. Разве что в один чудный день, главная страница вашего сайта вдруг сменит идентификатор и вот тут костыль ваш всплывет. Костыли со скрипом но решают задачи, а вы просто заменили геренацию урла для первого элемента ХК. Это вообще не относится к itemprop=«item…
Если уж хочется говнокостылить, то делайте это хоть чуть-чуть правильно:
Рекомендую вам вернуть все как было и еще раз прогнать разметку через валидатор schema.org. После внимательно посмотреть, где ошибка.
Ошибка «Отсутствует поле „item“» возникает на элементе текущей страницы ХК при генерации ХК этим вариантом сниппета, но на всех нормальных сайтах в ХК просто напросто нет текущего элемента.
Именно по этой причине я и написал на своем сайте:
"Наиболее правильный вариант, который устраивает поисковых роботов и Google и Yandex:"
Тем не менее, предложенный вами вариант формирования ХК на одном сайте «не сработал» (повторно перепроверял … ни в какую… ). Спасибо за предложенный вами вариант замены на но в этом случае получаю ошибку Буду благодарен за совет, как от нее избавится.
2. По поводу того, что «на всех нормальных сайтах в ХК просто напросто нет текущего элемента» — не соглашусь. Например, на многих «нормальных» сайтах установлен SeoFilter, в котором «стандартный функционал заточен под чанк tpl.SeoFilter.crumbs.current, который идёт в комплекте. Для тех, кто использует pdoCrumbs, достаточно указать параметр в вызове сниппета: &tplCurrent=`tpl.SeoFilter.crumbs.current`»
Не стоит забывать, что уровень технических знаний у нас всех разный и кто-то (как, например, я) воспользуется документацией SeoFilter. Правда, чтобы добиться семантически правильных ХК, мне пришлось изменить tpl.SeoFilter.crumbs.current
Возможно @Евгений Шеронов или кто-то из «старших товарищей» исправит и этот «говнокод» — к сожалению, других «правильных» вариантов мне найти не удалось.
Главное что вы решили вашу проблему. А как, и чем это аукнеться, это уже вопрос для более глубоких тем и обсуждений.
Подскажите пожалуйста, а как мне сделать? в шаблоне вывод вот так