SEO: правка мета-тегов для элементов инфоблока, привязанных к нескольким разделам
Если вы используете множественную привязку к разделам инфоблока у элементов, то сео мета-теги родителя будут вытаскиваться у родителя, с наименьшим ID. В этой заметке покажу, как решить это недоразумение.
Статья не актуальна для свежих битриксов — там появилась опция «Основной раздел».
В параметрах компонента bitrix:catalog.element отключаем штатную установку мета-тегов. Это обязательно, так как файл component_epilog.php у шаблона отрабатывает раньше, чем сам компонент ставит мета-теги.
"SET_TITLE" => "N", "SET_BROWSER_TITLE" => "N", "SET_META_KEYWORDS" => "N", "SET_META_DESCRIPTION" => "N",
В файле result_modifier.php вашего шаблона компонента bitrix:catalog.element обрабатываем мета-теги непосредственного родителя и записываем их в общий кеш шаблона компонента с ключом CUSTOM_IPROPERTY_VALUES.
use Bitrix\Iblock\InheritedProperty; use Bitrix\Iblock; use \Bitrix\Main\Text\String as StringHelper; // TODO bad class name for php7 // Some code ... $arResult['CUSTOM_IPROPERTY_VALUES'] = array(); if ($arResult['SECTION']['ID'] > 0) { $iPropTemplates = new InheritedProperty\SectionTemplates($arParams['IBLOCK_ID'], $arResult['SECTION']['ID']); $templates = $iPropTemplates->findTemplates(); if (is_array($templates) && !empty($templates)) { $entity = new Iblock\Template\Entity\Element($arResult['ID']); foreach ($templates as $templateKey => $template) { if (empty($template['TEMPLATE'])) { continue; } $arResult['CUSTOM_IPROPERTY_VALUES'][$templateKey] = StringHelper::htmlEncode( Iblock\Template\Engine::process( $entity, $template['TEMPLATE'] ) ); } } } $this->__component->setResultCacheKeys(array( 'CUSTOM_IPROPERTY_VALUES', ));
Ну и в файле component_epilog.php вашего шаблона компонента bitrix:catalog.element устанавливаем корректные мета-теги.
global $APPLICATION; if ( isset($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_TITLE']) && !empty($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_TITLE']) ) { $APPLICATION->SetTitle($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_TITLE']); $APPLICATION->SetPageProperty('title', $arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_TITLE']); } else { $APPLICATION->SetTitle(htmlspecialcharsbx($arResult['NAME'])); $APPLICATION->SetPageProperty('title', htmlspecialcharsbx($arResult['NAME'])); } if ( isset($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_KEYWORDS']) && !empty($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_KEYWORDS']) ) { $APPLICATION->SetPageProperty('keywords', $arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_KEYWORDS']); } if ( isset($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_DESCRIPTION']) && !empty($arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_DESCRIPTION']) ) { $APPLICATION->SetPageProperty('description', $arResult['CUSTOM_IPROPERTY_VALUES']['ELEMENT_META_DESCRIPTION']); }
Всё.