Микроразметка помогает поисковым системам правильно понимать содержимое страницы. Для интернет-магазина особенно важна разметка карточки товара: название, изображение, бренд, цена, валюта и наличие.
В 1С-Битрикс и готовых решениях вроде Аспро микроразметка часто уже частично встроена в шаблон карточки товара. Но на практике Яндекс может ругаться на отсутствие обязательных или важных полей: brand, image, availability, price или priceCurrency.
Один из удобных способов исправить проблему — добавить отдельную микроразметку в формате JSON-LD. Она не зависит от HTML-вёрстки карточки товара и выводится отдельным скриптом.
Что такое JSON-LD
JSON-LD — это формат структурированных данных, который размещается на странице внутри тега script. Пользователь этот код не видит, но поисковые системы могут его прочитать.
<script type="application/ld+json">
{
"@context": https://schema.org,
"@type": "Product",
"name": "Название товара"
}
</script>
Для карточки товара используется тип Product. Внутри него обычно указывается торговое предложение Offer, где передаются цена, валюта, ссылка на товар и доступность.
Пример JSON-LD для товара
Базовая микроразметка карточки товара может выглядеть так:
<script type="application/ld+json">
{
"@context": https://schema.org,
"@type": "Product",
"name": "Пресс одноленточный BPS-1200-1600F",
"description": "Описание товара",
"image": https://site.ru/upload/iblock/image.jpg,
"brand": {
"@type": "Brand",
"name": "Феролл"
},
"offers": {
"@type": "Offer",
"url": https://site.ru/product/press/,
"price": "7368800",
"priceCurrency": "RUB",
"availability": https://schema.org/InStock
}
}
</script>В этом примере:
name— название товара;description— описание товара;image— абсолютная ссылка на изображение;brand— бренд или производитель;offers— торговое предложение;price— цена без пробелов и символа валюты;priceCurrency— валюта, напримерRUB;availability— наличие товара.
Где добавлять микроразметку в Битрикс
В 1С-Битрикс код микроразметки обычно добавляют в шаблон детальной карточки товара. Чаще всего это шаблон компонента bitrix:catalog.element.
Файл может находиться по одному из путей:
/local/templates/ваш_шаблон/components/bitrix/catalog.element/шаблон/template.phpили внутри комплексного компонента каталога:
/local/templates/ваш_шаблон/components/bitrix/catalog/шаблон/element.phpЕсли сайт использует готовое решение Аспро, шаблон также может быть вложен глубже в структуру компонента. Искать его удобно по строкам, которые уже есть в HTML карточки товара.
grep -R "schema.org/Product" /home/site/public_html/local/templates -n
grep -R "itemprop=\"offers\"" /home/site/public_html/local/templates -n
grep -R "catalog-detail" /home/site/public_html/local/templates -n
Править файлы в папке /bitrix/modules/ не рекомендуется. Лучше вносить изменения в копию шаблона внутри /local/templates/, чтобы правки не потерялись при обновлениях.
Как проверить текущую микроразметку
Перед внесением изменений нужно открыть карточку товара в браузере, нажать Ctrl + U и посмотреть исходный код страницы.
В коде страницы можно искать такие строки:
application/ld+json
schema.org/Product
itemtype=http://schema.org/Product
itemprop="offers"
itemprop="brand"
itemprop="availability"
Если в HTML уже есть микроразметка, важно понять, какие именно поля отсутствуют. Например, на странице может визуально выводиться текст «В наличии», но если он не размечен как availability, Яндекс может считать поле отсутствующим.
Готовый пример JSON-LD для шаблона catalog.element
Ниже пример кода для файла template.php детальной карточки товара. Он формирует JSON-LD на основе данных из массива $arResult.
<?php
$productName = trim($arResult['NAME']);
$productDescription = '';
if (!empty($arResult['PREVIEW_TEXT'])) {
$productDescription = $arResult['PREVIEW_TEXT'];
} elseif (!empty($arResult['DETAIL_TEXT'])) {
$productDescription = $arResult['DETAIL_TEXT'];
}
$productDescription = trim(strip_tags($productDescription));
$productImage = '';
if (!empty($arResult['DETAIL_PICTURE']['SRC'])) {
$productImage = $arResult['DETAIL_PICTURE']['SRC'];
} elseif (!empty($arResult['PREVIEW_PICTURE']['SRC'])) {
$productImage = $arResult['PREVIEW_PICTURE']['SRC'];
}
if ($productImage && strpos($productImage, 'http') !== 0) {
$productImage = 'https://' . SITE_SERVER_NAME . $productImage;
}
$productUrl = 'https://' . SITE_SERVER_NAME . $arResult['DETAIL_PAGE_URL'];
$productPrice = '';
if (!empty($arResult['PROPERTIES']['PRICE']['VALUE'])) {
$productPrice = $arResult['PROPERTIES']['PRICE']['VALUE'];
} elseif (!empty($arResult['MIN_PRICE']['VALUE'])) {
$productPrice = $arResult['MIN_PRICE']['VALUE'];
}
$productPrice = preg_replace('/[^0-9.]/', '', (string)$productPrice);
$schemaData = [
'@context' => 'https://schema.org',
'@type' => 'Product',
'name' => $productName,
'description' => $productDescription,
'image' => $productImage,
'brand' => [
'@type' => 'Brand',
'name' => 'Феролл',
],
'offers' => [
'@type' => 'Offer',
'url' => $productUrl,
'price' => $productPrice,
'priceCurrency' => 'RUB',
'availability' => 'https://schema.org/InStock',
],
];
if (!$productDescription) {
unset($schemaData['description']);
}
if (!$productImage) {
unset($schemaData['image']);
}
if (!$productPrice) {
unset($schemaData['offers']['price']);
}
?>
<script type="application/ld+json">
<?=json_encode($schemaData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);?>
</script>Как прописать один бренд для всех товаров
Если сайт монобрендовый, бренд можно не брать из свойства товара. Например, если все товары относятся к бренду «Феролл», его можно прописать напрямую:
'brand' => [
'@type' => 'Brand',
'name' => 'Феролл',
],Это удобно, если в инфоблоке не заполнено отдельное свойство бренда или оно вообще не используется.
Как добавить availability только для товаров «В наличии»
Иногда не нужно указывать доступность для всех товаров. Например, можно выводить availability только для товаров, у которых статус равен «В наличии».
Пример проверки статуса:
<?php
$statusText = '';
if (!empty($arResult['DISPLAY_PROPERTIES']['STATUS']['DISPLAY_VALUE'])) {
$statusText = $arResult['DISPLAY_PROPERTIES']['STATUS']['DISPLAY_VALUE'];
} elseif (!empty($arResult['PROPERTIES']['STATUS']['VALUE'])) {
$statusText = $arResult['PROPERTIES']['STATUS']['VALUE'];
}
$statusText = trim(mb_strtolower(strip_tags((string)$statusText)));
$offerData = [
'@type' => 'Offer',
'url' => $productUrl,
'price' => $productPrice,
'priceCurrency' => 'RUB',
];
if ($statusText === 'в наличии') {
$offerData['availability'] = 'https://schema.org/InStock';
}
$schemaData['offers'] = $offerData;
?>Такой вариант полезен, если на сайте есть разные статусы: «В наличии», «Под заказ», «Нет в наличии», «Ожидается» и другие. В этом случае не нужно автоматически размечать все товары как доступные.
Полный пример с проверкой статуса «В наличии»
Ниже более полный пример, где бренд всегда равен «Феролл», а поле availability добавляется только при статусе «В наличии».
<?php
$productName = trim($arResult['NAME']);
$productDescription = '';
if (!empty($arResult['PREVIEW_TEXT'])) {
$productDescription = $arResult['PREVIEW_TEXT'];
} elseif (!empty($arResult['DETAIL_TEXT'])) {
$productDescription = $arResult['DETAIL_TEXT'];
}
$productDescription = trim(strip_tags((string)$productDescription));
$productImage = '';
if (!empty($arResult['DETAIL_PICTURE']['SRC'])) {
$productImage = $arResult['DETAIL_PICTURE']['SRC'];
} elseif (!empty($arResult['PREVIEW_PICTURE']['SRC'])) {
$productImage = $arResult['PREVIEW_PICTURE']['SRC'];
}
if ($productImage && strpos($productImage, 'http') !== 0) {
$productImage = 'https://' . SITE_SERVER_NAME . $productImage;
}
$productUrl = 'https://' . SITE_SERVER_NAME . $arResult['DETAIL_PAGE_URL'];
$productPrice = '';
if (!empty($arResult['PROPERTIES']['PRICE']['VALUE'])) {
$productPrice = $arResult['PROPERTIES']['PRICE']['VALUE'];
} elseif (!empty($arResult['MIN_PRICE']['VALUE'])) {
$productPrice = $arResult['MIN_PRICE']['VALUE'];
}
$productPrice = preg_replace('/[^0-9.]/', '', (string)$productPrice);
$statusText = '';
if (!empty($arResult['DISPLAY_PROPERTIES']['STATUS']['DISPLAY_VALUE'])) {
$statusText = $arResult['DISPLAY_PROPERTIES']['STATUS']['DISPLAY_VALUE'];
} elseif (!empty($arResult['PROPERTIES']['STATUS']['VALUE'])) {
$statusText = $arResult['PROPERTIES']['STATUS']['VALUE'];
}
$statusText = trim(mb_strtolower(strip_tags((string)$statusText)));
$offerData = [
'@type' => 'Offer',
'url' => $productUrl,
'price' => $productPrice,
'priceCurrency' => 'RUB',
];
if ($statusText === 'в наличии') {
$offerData['availability'] = 'https://schema.org/InStock';
}
$schemaData = [
'@context' => 'https://schema.org',
'@type' => 'Product',
'name' => $productName,
'description' => $productDescription,
'image' => $productImage,
'brand' => [
'@type' => 'Brand',
'name' => 'Феролл',
],
'offers' => $offerData,
];
if (!$productDescription) {
unset($schemaData['description']);
}
if (!$productImage) {
unset($schemaData['image']);
}
if (!$productPrice) {
unset($schemaData['offers']['price']);
}
?>
<script type="application/ld+json">
<?=json_encode($schemaData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);?>
</script>Важные нюансы при внедрении
Цена должна быть без пробелов и символа валюты
Неправильный вариант:
"price": "7 368 800 ₽"Правильный вариант:
"price": "7368800",
"priceCurrency": "RUB"Картинка должна быть абсолютной ссылкой
Нежелательный вариант:
"image": "/upload/iblock/image.jpg"Лучше использовать полный адрес:
"image": https://site.ru/upload/iblock/image.jpgНаличие должно быть ссылкой Schema.org
Неправильный вариант:
"availability": "В наличии"Правильный вариант:
"availability": https://schema.org/InStockБренд лучше указывать как объект Brand
Допустимый, но менее подробный вариант:
"brand": "Феролл"Более корректный вариант:
"brand": {
"@type": "Brand",
"name": "Феролл"
}Как избежать дублей микроразметки
В некоторых шаблонах Битрикс или Аспро уже есть микроразметка через атрибуты itemscope, itemtype и itemprop. После добавления JSON-LD на странице может оказаться две разметки одного товара.
Само по себе это не всегда критично, но важно, чтобы данные не противоречили друг другу. Например, если в старой microdata-разметке указана одна цена, а в JSON-LD другая, поисковые системы могут проигнорировать данные или показать предупреждения.
Поэтому после внедрения JSON-LD нужно проверить исходный код страницы и убедиться, что цена, валюта, изображение, бренд и наличие совпадают с фактическими данными товара.
Как проверить результат
После внесения правок нужно очистить кеш Битрикс, открыть карточку товара и посмотреть исходный код страницы через Ctrl + U.
В коде должен появиться блок:
<script type="application/ld+json">
{
"@context": https://schema.org,
"@type": "Product"
}
</script>Также нужно проверить, что внутри JSON-LD есть основные поля:
"name"
"image"
"brand"
"offers"
"price"
"priceCurrency"
"availability"Если ранее Яндекс показывал ошибку «brand не найдено» или «availability не найдено», после корректного добавления этих полей ошибка должна исчезнуть после переобхода страницы роботом.
Для карточки товара в 1С-Битрикс удобно использовать микроразметку JSON-LD. Она добавляется отдельным блоком в шаблон детальной карточки и не требует изменения видимой HTML-вёрстки.
Минимально полезная разметка товара должна содержать тип Product, изображение, бренд и блок Offer с ценой, валютой и доступностью. Для монобрендового сайта бренд можно прописать напрямую, а поле availability выводить только для товаров со статусом «В наличии».



