MODX. Микроразметка Schema.org. OpenGraph. JSON-LD

Оглавление

Вам могут пригодится следующие ресурсы:

Микроразметка, которую чаще всего используют 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, вполне возможен результат при котором у вас не будет ошибок в одном, но будут ошибки в другом валидаторе.

Делать скрытые 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>
<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>
    <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>
<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 года.

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

Используя семантическую разметку, вы можете улучшить представление сниппета вашего сайта в результатах поиска.

Сравните сниппеты в поисковой выдаче для страницы сайта, участвующего в партнерской программе Яндекс Словарей – неразмеченного и размеченного семантической версткой.

Существует большое количество типов микроразметок, Контакты, Хлебные Крошки, Товары, Статьи, Вопросы и Ответы, Отзывы, Рецепты, Кино, Музыка и множество других.

Иногда бывает, что по тем или иным причинам мы не можем произвести микроразметку в HTML шаблонах, в таком случае нам на помощь приходит вариант формата JSON-LD скрипта.

Хотя и формат HTML более предпочтителен, тем не мнее JSON-LD тоже вполне имеет право на жизнь и даже является одним из вариантов который демонстрирует официальный сайт в каждом из примеров разметки.

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]]">