Когда есть необходимость в добавлении микроразметки сайта уже после того, как в дизайн сайта внедрена верстка (что чаще всего бывает при покупке готовых решений для сайта), можно воспользоваться форматом 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": "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>'); }
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.