Schema.org — это совместный проект поисковых систем Google, Bing, Yahoo и Yandex, который предоставляет единый словарь для структурированной разметки данных на веб-страницах. Использование Schema.org помогает поисковым системам лучше понимать содержимое сайта и улучшать отображение результатов поиска, например, показывать расширенные сниппеты.
Основные типы разметки Schema.org Существует множество типов разметки, среди которых наиболее популярные:
Organization — информация о компании или организации.
Article — статья или новостной материал.
FAQPage — страница с часто задаваемыми вопросами.
Product — товар с описанием, ценами и предложениями.
Пример разметки Organization 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 $schemaOrganization = [ "@context" => "https://schema.org" , "@type" => "Organization" , "name" => "Название компании" , "url" => "https://example.com" , "logo" => "https://example.com/logo.png" , "email" => "info@example.com" , "telephone" => "+7 (495) 123-45-67" , "address" => [ "@type" => "PostalAddress" , "streetAddress" => "Улица, дом" , "addressLocality" => "Город" , "postalCode" => "123456" , "addressCountry" => "RU" ], "sameAs" => [ "https://www.facebook.com/example" , "https://twitter.com/example" ] ];global $APPLICATION ;$jsonLd = json_encode ($schemaOrganization , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);$APPLICATION ->AddHeadString ('<script type="application/ld+json">' . $jsonLd . '</script>' , true );
Пример разметки Article 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $schemaArticle = [ "@context" => "https://schema.org" , "@type" => "Article" , "headline" => "Заголовок статьи" , "description" => "Краткое описание статьи" , "author" => [ "@type" => "Person" , "name" => "Автор статьи" ], "datePublished" => "2024-05-20" , "dateModified" => "2024-05-21" , "image" => "https://example.com/image.jpg" , "publisher" => [ "@type" => "Organization" , "name" => "Название издателя" , "logo" => [ "@type" => "ImageObject" , "url" => "https://example.com/logo.png" ] ] ];
1. Article — разберём пример в шаблоне компонента news.detail в 1С-Битрикс 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 \Bitrix\Main\Loader ::includeModule ('iblock' );$headline = $arResult ['IPROPERTY_VALUES' ]['ELEMENT_META_TITLE' ] ?? $arResult ['NAME' ];$description = $arResult ['IPROPERTY_VALUES' ]['ELEMENT_META_DESCRIPTION' ] ?? $arResult ['PREVIEW_TEXT' ] ?? '' ;$imagePath = $arResult ['PREVIEW_PICTURE' ]['SRC' ] ?? $arResult ['DETAIL_PICTURE' ]['SRC' ] ?? '' ;$baseUrl = 'https://example.com' ;if ($imagePath && strpos ($imagePath , '/' ) !== 0 ) { $imagePath = '/' . $imagePath ; }$logoPath = '/images/logo.png' ;$arResult ['SCHEMA_ARTICLE' ] = [ "@context" => "https://schema.org" , "@type" => "Article" , "headline" => $headline , "description" => $description , "image" => [ "@type" => "ImageObject" , "url" => $imagePath ? $baseUrl . $imagePath : null , ], "publisher" => [ "@type" => "Organization" , "name" => "Название издателя" , "logo" => [ "@type" => "ImageObject" , "url" => $baseUrl . $logoPath ], ], ];
Пример вывода JSON-LD в <head>
из шаблона компонента 1 2 3 4 5 6 7 8 9 10 if (!empty ($arResult ['SCHEMA_ARTICLE' ])) { global $APPLICATION ; $jsonLd = json_encode ($arResult ['SCHEMA_ARTICLE' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $APPLICATION ->AddHeadString ('<script type="application/ld+json">' . $jsonLd . '</script>' , true ); }
Если нужна вставка прямо в шаблон template.php 1 2 3 4 5 6 <?php if (!empty ($arResult ['SCHEMA_ARTICLE' ])): ?> <script type="application/ld+json" > <?= json_encode ($arResult ['SCHEMA_ARTICLE' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?> </script><?php endif ; ?>
Пример разметки FAQPage 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $faqPage = [ "@context" => "https://schema.org" , "@type" => "FAQPage" , "mainEntity" => [ [ "@type" => "Question" , "name" => "Вопрос 1?" , "acceptedAnswer" => [ "@type" => "Answer" , "text" => "Ответ на вопрос 1." ] ], [ "@type" => "Question" , "name" => "Вопрос 2?" , "acceptedAnswer" => [ "@type" => "Answer" , "text" => "Ответ на вопрос 2." ] ] ] ];
1. FAQPage — разберём пример в шаблоне компонента news.list в 1С-Битрикс 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 $arResult ['SCHEMA_QUESTION' ] = [ "@context" => "https://schema.org" , "@type" => "FAQPage" , "mainEntity" => [] ];foreach ($arResult ["ITEMS" ] as $arItem ) { $question = $arItem ["NAME" ] ?? '' ; $answerText = $arItem ["PREVIEW_TEXT" ] ?? '' ; if ($question !== '' && $answerText !== '' ) { $arResult ['SCHEMA_QUESTION' ]['mainEntity' ][] = [ "@type" => "Question" , "name" => $question , "acceptedAnswer" => [ "@type" => "Answer" , "text" => $answerText , ], ]; } }
Пример вывода JSON-LD в <head>
из шаблона компонента 1 2 3 4 5 6 7 8 9 10 if (!empty ($arResult ['SCHEMA_QUESTION' ])) { global $APPLICATION ; $jsonLd = json_encode ($arResult ['SCHEMA_QUESTION' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $APPLICATION ->AddHeadString ('<script type="application/ld+json">' . $jsonLd . '</script>' , true ); }
Если нужна вставка прямо в шаблон template.php 1 2 3 4 5 6 <?php if (!empty ($arResult ['SCHEMA_QUESTION' ])): ?> <script type="application/ld+json" > <?= json_encode ($arResult ['SCHEMA_QUESTION' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?> </script><?php endif ; ?>
Пример разметки Product с ценами 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $schemaProduct = [ "@context" => "https://schema.org" , "@type" => "Product" , "name" => "Название продукта" , "image" => [ "https://example.com/photos/1x1/photo.jpg" ], "description" => "Описание продукта" , "offers" => [ "@type" => "AggregateOffer" , "lowPrice" => "1000" , "highPrice" => "1500" , "priceCurrency" => "RUB" , "offerCount" => 5 ] ];
1. Product — разберём пример в шаблоне компонента catalog.section в 1С-Битрикс (тема aspro.max) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 \Bitrix\Main\Loader ::includeModule ('iblock' );$filter = [ "ACTIVE" => "Y" , "IBLOCK_ID" => $arParams ['IBLOCK_ID' ], "SECTION_ID" => $arParams ['SECTION_ID' ], "INCLUDE_SUBSECTIONS" => "Y" ];$selectFields = [ "ID" , "IBLOCK_ID" , "PROPERTY_MAXIMUM_PRICE" ];$elementList = CIBlockElement ::GetList ([], $filter , false , false , $selectFields );$productPrices = [];$productCount = 0 ;while ($element = $elementList ->GetNextElement ()) { $fields = $element ->GetFields (); if (!empty ($fields ["~PROPERTY_MAXIMUM_PRICE_VALUE" ])) { $price = (int )$fields ["~PROPERTY_MAXIMUM_PRICE_VALUE" ]; $productPrices [] = $price ; } $productCount ++; }$minPrice = !empty ($productPrices ) ? min ($productPrices ) : 0 ;$maxPrice = !empty ($productPrices ) ? max ($productPrices ) : 0 ;$arResult ['SCHEMA_PRODUCT' ] = [ "@context" => "https://schema.org" , "@type" => "Product" , "name" => $arResult ['NAME' ] ?? '' , "description" => $arResult ['IPROPERTY_VALUES' ]['SECTION_META_DESCRIPTION' ] ?? '' , "image" => $arResult ['ITEMS' ][0 ]['PREVIEW_PICTURE' ]['SRC' ] ?? '' , "offers" => [ "@type" => "AggregateOffer" , "priceCurrency" => "RUB" , "lowPrice" => $minPrice , "highPrice" => $maxPrice , "offerCount" => $productCount ] ];
В шаблоне компонента catalog.section
в 1С-Битрикс (в частности, в теме aspro.max) правильное место для вывода структурированных данных Schema.org — это в <head>
страницы или сразу перед закрывающим тегом </body>
, чтобы поисковые системы корректно распарсили JSON-LD.
Пример вывода JSON-LD в <head>
из шаблона компонента 1 2 3 4 5 6 7 8 9 10 if (!empty ($arResult ['SCHEMA_PRODUCT' ])) { global $APPLICATION ; $jsonLd = json_encode ($arResult ['SCHEMA_PRODUCT' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $APPLICATION ->AddHeadString ('<script type="application/ld+json">' . $jsonLd . '</script>' , true ); }
Если нужна вставка прямо в шаблон template.php 1 2 3 4 5 6 7 <?php if (!empty ($arResult ['SCHEMA_PRODUCT' ])): ?> <script type="application/ld+json" > <?= json_encode ($arResult ['SCHEMA_PRODUCT' ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) ?> </script><?php endif ; ?>