Микроразметка контактной информации
Создаем файл 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": "info@yoursite.site",
"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" => "info@yoursite.site",
"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>');
}
