Если вы используете множественную привязку к разделам инфоблока у элементов, то сео мета-теги родителя будут вытаскиваться у родителя, с наименьшим 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']);
}

Всё.