Структурированные данные schema.org / JSON-LD / MODX

schema.org MODX Revolution

Всем привет, оставлю тут заметку, каким образом, я релизую cтруктурированные данные schema.org в формате JSON-LD для MODX Revolution.

Для начала, могу сказать, что таким образом намного проще простовлять микроразметку, чем добавлять её в html.
Данную разметку поддерживает и Google и Yandex

Вадиторы:

Напишу следующие виды микроразметки, которые обычно использую

Стандарт:

  • BreadcrumbList (хлебные крошки);
  • Organization (инфа об организации)
    • PostalAddress (Адрес)
    • ContactPoint (Телефон)

Блог:

  • BlogPosting

Для интернет магазинов (дополнительно):

  • Order (Информация о продавце)
  • Product (Информация о товаре)
    • Offer (Цена товара)
    • AggregateRating (Рейтинг товара)

Рекомендую создать для этих целей отдельно чанк. Обычно создаю массив, дальше делаю просто json_encode, для Laravel Blade предаю ещё второй параметр: JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES

Все написано на Fenom :)

BreadcrumbList

Реализуем с помощью стандартного pdoCrumbs

{$_modx->runSnippet('pdoCrumbs',[
	'showHome'=> 1,
	'showCurrent' => 1,
	'from' => '0'
	'tplWrapper'=> '@INLINE 
  <script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "BreadcrumbList",
    "itemListElement": [ {$output} ]
  }
  </script>',
	'tplHome'=>'@INLINE 
  {
    "@type": "ListItem",
    "position": {$idx},
    "item":
      {
        "@id": "{$link}",
        "name": "Главная"
      }
  },',
	'tplCurrent'=>'@INLINE 
  {
    "@type": "ListItem",
    "position": {$idx},
    "item":
    {
    "@id": "{$link}",
    "name": "{$menutitle}"
    }
  }',
	'tpl'=>'@INLINE 
  {
    "@type": "ListItem",
    "position": {$idx},
    "item":
      {
        "@id": "{$link}",
        "name": "{$menutitle}"
      }
  },',
  ])}

Organization

Здесь просто подставляем переменные, обычно я пользуюсь компонентом ClientConfig.

{set $organization = [
    '@context' => 'https://schema.org',
    '@type' => 'Organization',
    'name' => 'company_name' | config,
    'url' => 'site_url' | config,
    'logo' => 'site_url' | config ~ 'assets/img/logo.png',
    'address' => [
        '@type' => 'PostalAddress',
        'streetAddress' => 'address' | config,
        'addressLocality' => 'city' | config,
        'postalCode' => 'index' | config,
        'addressCountry' => 'RU',
    ],
    'contactPoint' => [
      '@type' => 'ContactPoint',
      'telephone'=> 'phone' | config,
      'contactType' => 'customer service',
      'areaServed' => 'RU',
      'availableLanguage' => 'Russian'
   ]
]}
<script type="application/ld+json">
{json_encode($organization)}
</script>

BlogPosting

Выводим только на странице статьи. Можно поставить проверку в чанке, на то, какой шаблон.

{set $blog_posting = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'mainEntityOfPage' =>[
        '@type' => 'WebPage',
        '@id' => $_modx->makeUrl($_modx->resource.id, '','','https')
    ],
    'headline' => $_modx->resource.pagetitle,
    'description' => $_modx->resource.description,
    'image' => 'site_url' | config  ~ $_modx->resource.img,
    'author' =>[
        '@type' => 'Organization',
        'name' => 'company_name' | config
    ],
    'publisher' =>[
        '@type' => 'Organization',
        'name' => 'company_name' | config,
        'logo' =>[
            '@type' => 'ImageObject',
            'url' => 'site_url' | config ~ 'assets/img/logo.png'
        ],
    ],
    'datePublished' => $_modx->resource.publishedon | date_format : '%Y-%m-%d',
    'dateModified' => $_modx->resource.publishedon | date_format : '%Y-%m-%d',
]}
<script type="application/ld+json">
{json_encode($blog_posting)}
</script>

Order

{set $order = [
 '@context' => 'https://schema.org/',
 '@type' => 'Order',
 'seller' => [
   '@type' => 'Organization',
   'name' => 'company_name' | config,
   'telephone' => 'phone' | config,
  ]
]}


<script type="application/ld+json">
{json_encode($order)}
</script>

Пишите в комментариях, а каким способом пользуетесь Вы?

Если белый экран, пробуйте так:

{set $organization = json_encode($organization) | replace : '{' : '{ '}
<script type="application/ld+json">
   {$organization}
</script>

03.12.2020 / 16043

No avatar

Комментарии (2)

  1. Test 07 сентября 2021, 21:18(Комментарий был изменён) # 0
    {$modx->getOption('site_name')}
    1. Alan 14 марта 2021, 23:53 # 0
      Спасибо, помогло! Не получалось никак феномом заполнить данные JSON-LD