Вам могут пригодится следующие ресурсы:
Микроразметка, которую чаще всего используют https://schema.org/
Неофициальный русский перевод https://ruschema.org/
Валидатор Yandex https://webmaster.yandex.ru/tools/microtest/
Валидатор Google https://developers.google.com/search/docs/advanced/structured-data
Проверка расширенных результатов https://search.google.com/test/rich-results?hl=ru
Документация Open Graph https://www.ogp.me/
Рекомендую проверять страницу в валидаторе и Яндекса и Google, вполне возможен результат при котором у вас не будет ошибок в одном, но будут ошибки в другом валидаторе.
Примеры разметки schema.org
Контакты
Делать скрытые HTML блоки в данном случае не лучшая идея, воспользуемся JSON-LD форматом, который добавит после основных скриптов, после footer’a
<script type="application/ld+json">
{
"@context" : "http://schema.org",
"@type" : "Organization",
"name" : "[[++site_name]]",
"url" : "[[++site_url]]",
"logo": "[[++site_url]][[++logo]]",
"address":{
"@type":"PostalAddress",
"streetAddress":"[[++site_address]]",
"addressLocality":"Москва",
"addressRegion":"Московская Область",
"postalCode":"117546",
"addressCountry":"Россия"
},
"contactPoint" : [{
"@type" : "ContactPoint",
"telephone" : "[[++phone1]]",
"email" : "[[++email]]",
"contactType" : "customer service"
}],
"sameAs" : [
"соц сети"
]
}
</script>
Отзывы на примере easyComm
<div id="ec-{$thread_name}-message-{$id}" class="ec-message" itemscope itemtype="https://schema.org/Review">
<meta itemprop="datePublished" content="[[+date:strtotime:date=`%Y`]]-[[+date:strtotime:date=`%m`]]-[[+date:strtotime:date=`%d`]]"/>
<link itemprop="url" href="[[+uri]]" class="d-none">
<div class="ec-message__meta ec-clearfix">
<div itemprop="itemReviewed" itemscope itemtype="https://schema.org/Organization" class="d-none">
<meta itemprop="name" content="Отзыв о компании [[++site_name]]">
<meta itemprop="telephone" content="[[stripPhone?phone=`[[++phone1]]`]]">
<link itemprop="url" href="[[++site_url]]"/>
<meta itemprop="email" content="[[++publick_email]]">
<div itemprop="address" itemscope itemtype="https://schema.org/PostalAddress">
<meta itemprop="addressLocality" content="Москва">
<meta itemprop="streetAddress" content="[[++site_address]]">
</div>
</div>
<div class="flex flex-space-between">
<div class="ec-message-name_subject flex flex-wrap" itemprop="author" itemscope itemtype="https://schema.org/Person">
<div class="ec-message-name" itemprop="name">{$user_name}</div>
<div class="ec-message-subject">{$subject}</div>
</div>
<div class="ec-message-stars_date" itemprop="reviewRating" itemscope itemtype="https://schema.org/Rating">
<meta itemprop="worstRating" content="1">
<meta itemprop="bestRating" content="5"/>
<meta itemprop="ratingValue" content="[[+rating]]">
<div class="ec-message-stars">
<div class="ec-stars">
<span class="rating-{$rating}"></span>
</div>
</div>
<div class="ec-message-date">{$date | dateAgo}</div>
</div>
</div>
</div>
<div class="text" itemprop="reviewBody">
{if $text | length > 300}
<div class="ec-message-spoiler">
{$text}
</div>
<div class="ec-message-spoiler-btn">
<a href="#">Читать полностью <i class="fa-solid fa-arrow-right"></i></a>
</div>
{else}
{$text}
{/if}
</div>
{if $reply_text}
<div class="ec-message__reply">
{if $reply_author}
<div class="reply_author">Ответ от {$reply_author}</div>
{/if}
<div class="reply_text">{$reply_text}</div>
</div>
{/if}
</div>
Хлебные крошки
[[pdoCrumbs?
&showHome = `1`
&tplWrapper=`breadcrumbs-wrap`
&outputSeparator = `>`
]]
tplHome
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<a itemprop="item" href="[[+link]]">
<span itemprop="name">[[+menutitle]]</span>
<meta itemprop="position" content="[[+idx]]" />
</a>
</li>
tpl
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<a itemprop="item" href="[[+link]]">
<span itemprop="name">[[+menutitle]]</span>
<meta itemprop="position" content="[[+idx]]" />
</a>
</li>
&tplCurrent
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" class="active">
<meta itemprop="item" content="[[++site_url]][[+link]]" />
<span itemprop="name">[[+menutitle]]</span>
<meta itemprop="position" content="[[+idx]]" />
</li>
Чанк breadcrumbs-wrap
<ul class="" itemscope itemtype="http://schema.org/BreadcrumbList">[[!+output]]</ul>
Статьи
<main itemscope itemtype="http://schema.org/Article">
<h1 class="" itemprop="name">[[*seo_h1:default=`[[*pagetitle]]`]]</h1>
<div itemprop="publisher" itemscope itemtype="https://schema.org/Organization" class="d-none">
<div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject">
<meta itemprop="url image" content="[[++site_url]][[++site_logo]]"/>
</div>
<meta itemprop="name" content="[[++site_name]]">
<meta itemprop="telephone" content="[[++site_phone]]">
<meta itemprop="address" content="[[++site_address]]">
</div>
<div itemprop="author" itemscope itemtype="https://schema.org/Person">
<meta itemprop="name" content="[[*article-writer-name]]"/>
<meta itemprop="url" content="[[++site_url]][[*uri]]"/>
</div>
<meta itemprop="url" content="[[++site_url]][[*uri]]"/>
<meta itemprop="image" content="[[*news-img]]"/>
<meta itemprop="headline" content="[[*pagetitle]]"/>
<meta itemprop="datePublished" content="[[*publishedon:date=`%Y-%m-%d`]]T08:00:00+08:00"/>
<meta itemprop="dateModified" content="[[*publishedon:date=`%Y-%m-%d`]]T08:00:00+08:00"/>
<meta itemprop="mainEntityOfPage" content="[[~[[*id]]]]"/>
<div class="" itemprop="articleBody">
[[*content]]
</div>
</main>
FAQ Вариант 1
<div class="accordion" itemscope="" itemtype="http://schema.org/FAQPage">
<div class="item" itemprop="mainEntity" itemscope="" itemtype="http://schema.org/Question">
<div class="" itemprop="name">Вопрос</div>
<div class="data" itemscope="" itemprop="acceptedAnswer" itemtype="http://schema.org/Answer">
<div itemprop="text">
Ответ
</div>
</div>
</div>
</div>
FAQ Вариант 2
<div class="accordion">
{foreach $_modx->resource['srv_faq_listX'] | fromJSON as $k => $item}
<div class="item" itemscope itemtype="http://schema.org/Question">
<h2 class="" itemprop="name">{$item['question']}</h2>
<div class="" itemprop="acceptedAnswer" itemscope itemtype="http://schema.org/Answer">
<meta itemprop="upvoteCount" content="1" />
<div itemprop="text">{$item['answer']}</div>
</div>
</div>
{/foreach}
</div>
Услуга
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "[[*seo_h1]]",
"provider": {
"@type": "Organization",
"name": "[[++site_name]]",
"url": "[[++site_url]]",
"logo": "[[++site_url]][[++site_logo]]"
},
"areaServed": {
"@type": "State",
"name": "Московская область"
},
"description": "[[*seo_desc]]",
"offers": {
"@type": "Offer",
"url": "[[++site_url]][[*uri]]",
"price": "[[*microdata-service-price]]",
"priceCurrency": "RUB"
}
}
</script>
Товары
<div class="" itemscope itemtype="http://schema.org/Product">
<h1 itemprop="name">[[*seo_h1:default=`[[*pagetitle]]`]]</h1>
<div class="content">[[$msProduct.content.custom]]</div>
</div>
Чанк msProduct.content.custom
<meta itemprop="brand" content="[[++site_name]]">
<meta itemprop="model" content="[[+article:default=`-`]]">
<div id="msProduct">
<form method="post">
<input type="hidden" name="id" value="[[*id]]"/>
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating" style="display: none;">
<meta itemprop="worstRating" content="1"/>
<meta itemprop="ratingValue" content="5"/>
<meta itemprop="bestRating" content="5"/>
<meta itemprop="ratingCount" content="100"/>
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<meta itemprop="price" content="[[+price]]">
<meta itemprop="priceCurrency" content="RUB">
<link itemprop="availability" href="http://schema.org/InStock">
<meta itemprop="category" content="Категория">
<link itemprop="url" href="[[++site_url]][[*uri]]">
<time itemprop="priceValidUntil" datetime="2030-12-31"></time>
<meta itemprop="seller" content="ООО «РогаКопыта»">
<link itemprop="itemCondition" href="http://schema.org/NewCondition" />
</div>
</form>
</div>
<div itemprop="description">Контент</div>
Что это и для чего нужно
Schema.org — это стандарт семантической разметки данных в сети, объявленный поисковыми системами Google, Bing и Yahoo! летом 2011 года.
Цель семантической разметки – сделать интернет более понятным, структурированным и облегчить поисковым системам и специальным программам извлечение и обработку информации для удобного её представления в результатах поиска.
Используя семантическую разметку, вы можете улучшить представление сниппета вашего сайта в результатах поиска.
Сравните сниппеты в поисковой выдаче для страницы сайта, участвующего в партнерской программе Яндекс Словарей – неразмеченного и размеченного семантической версткой.
Существует большое количество типов микроразметок, Контакты, Хлебные Крошки, Товары, Статьи, Вопросы и Ответы, Отзывы, Рецепты, Кино, Музыка и множество других.
JSON-LD
Иногда бывает, что по тем или иным причинам мы не можем произвести микроразметку в HTML шаблонах, в таком случае нам на помощь приходит вариант формата JSON-LD скрипта.
Хотя и формат HTML более предпочтителен, тем не мнее JSON-LD тоже вполне имеет право на жизнь и даже является одним из вариантов который демонстрирует официальный сайт в каждом из примеров разметки.
Что такое Open Graph и для чего он нужен
Open Graph разработан для контроля текстово-графического анонса, который формируется при добавлении ссылки на ресурс в социальную сеть. С его помощью можно настроить изображение, которое должно появляться в превью, правильный заголовок, описание и ссылку.
Зачем нужен Open Graph
Пользователь увидит релевантный текст и нужное изображение, которое настроит веб-мастер.
Сниппет будет выглядеть как пост, который можно разместить в соцсети, а не как ссылка, к которой нужны дополнительное описание и картинка.
Оформленное превью выглядит лучше, а значит улучшает поведенческие факторы, приносит больше кликов.
Разметку Open Graph поддерживают соцсети и мессенджеры ВКонтакте, FB, Twitter, Pinterest, Одноклассники, Telegram, Skype и другие.
Как интегрировать
Интеграция микроразметки Open Graph осуществляется в теге <head>, на подобии мета-тегов. Доступные свойства вы можете посмотреть в документации https://www.ogp.me/
<meta name="og:title" content="[[*longtitle:default=`[[*pagetitle]]`]] | [[++site_name]]"> <meta name="og:type" content="website"> <meta name="og:url" content="[[++site_url]][[*id:is=`1`:then=`:else=`[[*uri]]`]]"> <meta name="og:image" content="[[++site_url]][[++logotype]]"> <meta name="og:site_name" content="[[++site_name]]"> <meta name="og:description" content="[[*description]]"> <meta name="og:email" content="[[++publick_email]]"> <meta name="og:phone_number" content="[[++phone1]]"> <meta name="og:latitude" content="51.729880"> <meta name="og:longitude" content="36.190967"> <meta name="og:street-address" content="[[++site_address]]"> <meta name="og:locality" content="Moscow"> <meta name="og:region" content="Moscow"> <meta name="og:postal-code" content="117546"> <meta name="og:country-name" content="RUS"> <meta property="og:type" content="website"> <meta property="og:locale" content="ru_RU"> <meta property="og:site_name" content="[[++site_url]]"> <meta property="og:url" content="[[++site_url]][[*id:is=`1`:then=`:else=`[[*uri]]`]]"> <meta property="og:title" content="[[*longtitle:default=`[[*pagetitle]]`]] | [[++site_name]]"> <meta property="og:description" content="[[*description]]"> <meta property="og:image" content="[[++site_url]][[++logotype]]"> <meta property="og:image:width" content="213"> <meta property="og:image:height" content="64"> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@name"> <meta name="twitter:creator" content="@name"> <meta name="twitter:url" content="[[++site_url]][[*id:is=`1`:then=`:else=`[[*uri]]`]]"> <meta name="twitter:title" content="[[*longtitle:default=`[[*pagetitle]]`]] | [[++site_name]]"> <meta name="twitter:description" content="[[*description]]"> <meta name="twitter:image" content="[[++site_url]][[++logotype]]">