Микроразметка LD+JSON для интернет-магазина

Когда есть необходимость в добавлении микроразметки сайта уже после того, как в дизайн сайта внедрена верстка (что чаще всего бывает при покупке готовых решений для сайта), можно воспользоваться форматом ld+json, чтобы не править верстку уже по живому.

Микроразметка контактной информации

Создаем файл json.php, в котором прописываем все статические данные с контактной информацией сайта с таким наполнением:

<script type="application/ld+json" data-skip-moving="true">
{
	"@context": "http://schema.org",
	"@type": "WebSite",
	"name": "YourSiteName",
	"alternateName": "ТМ YourSite",
	"url": "https://yoursite.site"
}
</script>
<script type="application/ld+json" data-skip-moving="true">
{
	"@context": "http://schema.org",
	"@type": "Person",
	"name": "ТМ YourSite",
	"url": "https://yoursite.site",
	"sameAs": [
	"https://www.facebook.com/yoursite.site/",
	"https://www.instagram.com/yoursite.site/",
	"https://t.me/yoursite_site",
	"https://www.youtube.com/channel/yoursite_site",
	"https://plus.google.com/yoursite_site"
	]
}
</script>
<script type="application/ld+json" data-skip-moving="true">
{
	"@context": "http://schema.org",
	"@type": "Organization",
	"name" : "ТМ YourSite",
	"location": {
		"@type":"Place",
		"address": {
			"@type": "PostalAddress",
			"addressLocality": "Town",
			"streetAddress": "ул. Street name, 777"
		}
	},
	"telephone": "+X (XXX) XXX-X-XXX",
	"email": "[email protected]",
	"url": "https://yoursite.site",
	"logo": {
		"@context": "http://schema.org",
			"@type": "ImageObject",
			"url": "https://yoursite.site/images/logo.png",
			"name": "ТМ YourSite"
		}
	},
	"contactPoint": [{
		"@type": "ContactPoint",
		"telephone": "+X (XXX) XXX-X-XX1",
		"contactType": "customer service"
	},{
		"@type": "ContactPoint",
		"telephone": "+X (XXX) XXX-X-XX2",
		"contactType": "customer service"
	},{
		"@type": "ContactPoint",
		"telephone": "+X (XXX) XXX-X-XX3",
		"contactType": "customer service"
	}]
}
</script>

И подключаем этот файл в шапке сайта:

$asset = Bitrix\Main\Page\Asset::getInstance();
ob_start();
include $_SERVER['DOCUMENT_ROOT'] . SITE_TEMPLATE_PATH . '/json.php';
$LdJSONs = ob_get_contents();
ob_end_clean();
$asset->addString($LdJSONs);

Таким образом, получим контактную информацию сайта, которая будет проиндексирована поисковиками.

Микроразметка статьи или новости

Для добавления микроразметки к карточке товара, нужно в файле result_modifier.php получить всю информацию, касающуюся микроразметки:

$imgPath = '';
if (is_array($arResult['DETAIL_PICTURE']))
{
	$imgPath = $arResult['DETAIL_PICTURE']['SRC'];
} elseif (is_array($arResult['MORE_PHOTO']) && is_array($arResult['MORE_PHOTO'][0]))
{
	$imgPath = $arResult['MORE_PHOTO'][0]['SRC'];
} elseif (is_array($arResult['PREVIEW_PICTURE']))
{
	$imgPath = $arResult['PREVIEW_PICTURE']['SRC'];
}
$arSiteInfo = \Pai\Tools\CTools::getSiteInfo();
$arProtocol = CMain::IsHTTPS() ? "https://" : "http://";
$serverName = $arSiteInfo['SERVER_NAME'];

if (strpos($imgPath, ':') === false)
{
	$imgPath = $arProtocol . $serverName . $imgPath;
}

$arDateLastUpdate = ParseDateTime($arResult['TIMESTAMP_X']);
$arDatePublished = ParseDateTime($arResult['ACTIVE_FROM']);
$microJs = array(
	"@context" => "http://schema.org",
	"@type" => "Article",
	"author" => "ТМ YourSite",
	"name" => isset($arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE'])
		? $arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE']
		: $arResult['NAME'],
	"dateModified" => (is_array($arDateLastUpdate))
		? $arDateLastUpdate['YYYY'] . '-' . $arDateLastUpdate['MM'] . '-' . $arDateLastUpdate['DD']
		: '',
	"datePublished" => (is_array($arDatePublished))
		? $arDatePublished['YYYY'] . '-' . $arDatePublished['MM'] . '-' . $arDatePublished['DD']
		: '',
	"image" => $imgPath,
	"url" => $arProtocol . $serverName . $arResult['DETAIL_PAGE_URL'],
	"headline" => isset($arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE'])
		? $arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE']
		: $arResult['NAME'],
	"publisher" => array(
		"@context" => "http://schema.org",
		"@type" => "Organization",
		"telephone" => "+XX (XXX) XXX-X-XXX",
		"email" => "[email protected]",
		"name" => "ТМ YourSite",
		"logo" => array(
			"@context"=>"http://schema.org",
			"@type"=>"ImageObject",
			"url"=>"https://yoursite.site/images/logo.png",
			"name"=> "ТМ YourSite"
		)
	),
	"mainEntityOfPage"=>$arProtocol . $serverName . $arResult['DETAIL_PAGE_URL']
);

if (strlen($microJs['image']) <= 0) unset($microJs['image']);
if (strlen($microJs['dateModified']) <= 0) unset($microJs['dateModified']);
if (strlen($microJs['mpn']) <= 0) unset($microJs['mpn']);
if ($microJs['dateModified'] == $microJs['datePublished'])
	unset($microJs['dateModified']);
$arResult['JSON'] = $microJs;
$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys,
	array('JSON'));

И в component_epilog.php прописываем вывод микроразметки:

if(!empty($arResult['JSON'])){
	$asset = Bitrix\Main\Page\Asset::getInstance();
	$asset->addString('<script type="application/ld+json">'.json_encode($arResult['JSON']).'</script>');
}

Так мы получим микроразметку статьи

Разметка списка товаров

Конечно же, самым главным в разметке интернет-магазина будет микроразметка списка товаров и карточки товара

Для этого в файле result_modifier.php компонента catalog.section, который выводит список товаров, прописываем струтуру данных для вывода:

$rating = array(
	'value' => 0,
	'cnt' => 0,
	'sum' => 0,
);

$price = array();
foreach ($arResult['ITEMS'] as $arItem)
{
	if (!empty($arItem['PROPERTIES']['vote_count']['VALUE']) && intval($arItem['PROPERTIES']['vote_count']['VALUE']) > 0)
	{
		$rating['sum'] += $arItem['PROPERTIES']['vote_sum']['VALUE'];
		$rating['cnt'] += $arItem['PROPERTIES']['vote_count']['VALUE'];
	}

	if(!empty($arItem['MIN_BASIS_PRICE']) && floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE'])>0){
		if(empty($price)){
			$price = array(
				'MIN'=>floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']),
				'MAX'=>floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']),
			);
		} else {
			if(floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']) < $price['MIN']){
				$price['MIN'] = floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']);
			}

			if(floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']) > $price['MAX']){
				$price['MAX'] = floatval($arItem['MIN_BASIS_PRICE']['DISCOUNT_VALUE']);
			}
		}
	}
}

if ($rating['cnt'] == 0)
{
	$rating = array(
		'value' => 5,
		'cnt' => 1
	);
} else {
	$rating['value'] = $rating['sum'] / $rating['cnt'];
}

$arResult['JSON'] = array(
	'@context' => "http://schema.org/",
	'@type' => 'Product',
	'name' => $arResult['NAME'],
	'aggregateRating' => array(
		'@type' => 'AggregateRating',
		'ratingValue' => ($rating['value']==0) ? 5 : $rating['value'],
		'reviewCount' => $rating['cnt'],
	),
	'offers' => array(
		'@type' => 'AggregateOffer',
		'lowPrice' => $price['MIN'],
		'highPrice' => $price['MAX'],
		'priceCurrency' => 'ГРН'
	)
);

$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys,array('JSON'));

И в component_epilog.php выводим данные:

$asset = Bitrix\Main\Page\Asset::getInstance();
if(!empty($arResult['JSON'])){
	$asset->addString('<script type="application/ld+json" type="application/ld+json">'.json_encode($arResult['JSON']).'</script>');
}

Так будет прописана микроразметка для списка товаров.

Разметка карточки товара

Для начала, в result_modifier.php прописываем данные для микроразметки:

$arDateLastUpdate = ParseDateTime($arResult['TIMESTAMP_X']);
$imgPath = '';
if (is_array($arResult['DETAIL_PICTURE']))
{
	$imgPath = $arResult['DETAIL_PICTURE']['SRC'];
} elseif (is_array($arResult['MORE_PHOTO']) && is_array($arResult['MORE_PHOTO'][0]))
{
	$imgPath = $arResult['MORE_PHOTO'][0]['SRC'];
} elseif (is_array($arResult['PREVIEW_PICTURE']))
{
	$imgPath = $arResult['PREVIEW_PICTURE']['SRC'];
}
$arSiteInfo = \Pai\Tools\CTools::getSiteInfo();
$arProtocol = CMain::IsHTTPS() ? "https://" : "http://";
$serverName = $arSiteInfo['SERVER_NAME'];

if (strpos($imgPath, ':') === false)
{
	$imgPath = $arProtocol . $serverName . $imgPath;
}

$microJs = array(
	"@type" => "Product",
	"@context" => "http://schema.org/",
	"name" => isset($arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE'])
		? $arResult['IPROPERTY_VALUES']['ELEMENT_PAGE_TITLE']
		: $arResult['NAME'],
	"image" => $imgPath,
	"description" => (strlen($arResult['~DETAIL_TEXT']) > 0) ? $arResult['~DETAIL_TEXT'] : $arResult['~PREVIEW_TEXT'],
	"mpn" => $arResult['PROPERTIES']['CML2_ARTICLE']['VALUE'],
	"brand" => array(
		"@type" => "Thing",
		"name" => "ТМ YourSite"
	),
	"aggregateRating" => array(
		"@type" => "AggregateRating",
		"ratingValue" => floatval($arResult['PROPERTIES']['rating']['VALUE']) > 0
			? floatval($arResult['PROPERTIES']['rating']['VALUE'])
			: 5,
		"reviewCount" => intval($arResult['PROPERTIES']['vote_count']['VALUE']) > 0
			? intval($arResult['PROPERTIES']['vote_count']['VALUE'])
			: 1,
	),
	"offers" => array(
		"@type" => "Offer",
		"priceCurrency" => "ГРН",
		"price" => $arResult['MIN_BASIS_PRICE']['DISCOUNT_VALUE'],
	)
);

if (strlen($microJs['image']) <= 0) unset($microJs['image']);
if (strlen($microJs['description']) <= 0) unset($microJs['description']);
if (strlen($microJs['mpn']) <= 0) unset($microJs['mpn']);
$arResult['JSON'] = $microJs;
$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys,
	array('JSON'));

И в component_epilog.php прописываем вывод микроданных:

if(!empty($arResult['JSON'])){
	$asset->addString('<script type="application/ld+json">'.json_encode($arResult['JSON']).'</script>');
}
Количество показов: 5984
09.09.2018

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.