Внедрение микроразметки schema.org для основных страниц

Внедрение микроразметки schema.org для основных страниц

2025-05-21

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
//  Если к примеру данные статичные и выводятся в header.php (Сквозной вывод для всех страниц)
$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);

// Добавляем JSON-LD в <head>
$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
// news.detail/result_modifier.php

// Подключаем модуль iblock
\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';

// Убедимся, что $imagePath - относительный путь, добавим слеш если нужно
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
// В news.detail/template.php 

if (!empty($arResult['SCHEMA_ARTICLE'])) {
global $APPLICATION;

$jsonLd = json_encode($arResult['SCHEMA_ARTICLE'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// Добавляем JSON-LD в <head>
$APPLICATION->AddHeadString('<script type="application/ld+json">' . $jsonLd . '</script>', true);
}

Если нужна вставка прямо в шаблон template.php

1
2
3
4
5
6
// В news.detail/template.php 
<?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
// news.list/result_modifier.php

$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
// В news.list/template.php 

if (!empty($arResult['SCHEMA_QUESTION'])) {
global $APPLICATION;

$jsonLd = json_encode($arResult['SCHEMA_QUESTION'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// Добавляем JSON-LD в <head>
$APPLICATION->AddHeadString('<script type="application/ld+json">' . $jsonLd . '</script>', true);
}

Если нужна вставка прямо в шаблон template.php

1
2
3
4
5
6
// В news.list/template.php 
<?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
// В catalog.section/result_modifier.php

// Подключаем модуль iblock
\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;

/* Формируем массив для schema Product */
$arResult['SCHEMA_PRODUCT'] = [
"@context" => "https://schema.org",
"@type" => "Product",
"name" => $arResult['NAME'] ?? '',
"description" => $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'] ?? '',
// Добавляем preview картинку первого товара
"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
// В catalog.section/template.php 

if (!empty($arResult['SCHEMA_PRODUCT'])) {
global $APPLICATION;

$jsonLd = json_encode($arResult['SCHEMA_PRODUCT'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

// Добавляем JSON-LD в <head>
$APPLICATION->AddHeadString('<script type="application/ld+json">' . $jsonLd . '</script>', true);
}

Если нужна вставка прямо в шаблон template.php

1
2
3
4
5
6
7
// В catalog.section/template.php 

<?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; ?>