В данной статье речь пойдет не только про SEO свойства раздела, но и про нестандартный способ их получения при помощи API. Когда вы работаете с компонентами битрикса, то часто сталкиваетесь, что свойства для SEO записываются в разных местах – это может быть как дополнительное свойство, так и файл component_epilog.php . Поверьте, встречались и случаи когда мета свойства записывали в header.php 🙂 что усложняло их поиск на проекте.
Что происходило при такой записи мета? Записывался массив прямо в шаблоне, и в дальнейшем выводилось на экран. Делать так я настоятельно не рекомендую, но вы как разработчик должны знать, что предыдущий разраб совершил в прошлом ошибку написав такой код:
$SEO_TITLES = array( "/catalog/filtry_k_elektoerozionike/" => "Купить фильтр недорого", "/catalog/bloki/" => "Купить осевые блоки в магазине" );
а в дальнейшем была проверка:
<?if ( $SEO_TITLES[$APPLICATION->GetCurPage()] ) :?> <title><?=$SEO_TITLES[$APPLICATION->GetCurPage()]?></title> <?else :?> <title><?$APPLICATION->ShowTitle();?></title> <?endif;?>
Зачем я вам показал такой код спросите вы? Чтобы понять, как делать не надо, и что такой код очень сложно поддерживать пользователю – а ведь удобство использования сайта одна из основных целей. Плюс и вам не захочется заниматься такой рутиной как контент, который записывается в header.php 🙂
Кстати я уже писал про то как задавать свойства через апи битрикса, вы можете ознакомится с ней тут, быть может такой способ вам более по душе.
Теперь перейдем к сути статьи. Как вы могли заметить я не назвал самый основной способ в Битриксе, и самый наиболее актуальный – SEO вкладку, которая теперь доступна для элементов и разделов.
Под элементами в данном контексте мы подразумеваем товары, новости, записи блога, а разделы – это категории (тут уже кому как удобнее называть).
ЗАДАЧА: У нас есть компонент который не меняет мета свойства у раздела новостей. Более того, в массиве $arResult нет никаких упоминаний про ID раздела.
Решений несколько, рассмотрим одно из них (по моему мнению, это не самый лучший способ, в идеале дописать код компонента таким образом, чтобы он передавал айди в массив).
Для компонента создаем файл component_epilog.php и пишем следующий код:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); global $APPLICATION; $SECTION_CODE = $APPLICATION->GetCurDir();
Получаем текущий адрес раздела. Стоит отметить, что для решение мы могли использовать суперглобальный массив $_SERVER.
Теперь наша цель убрать из URL всё лишнее:
if ($SECTION_CODE != '/articles/'): $SECTION_CODE = str_replace('/articles/', '', $SECTION_CODE); $SECTION_CODE = str_replace('/', '', $SECTION_CODE); endif;
Тут мы добавили проверку, если страница разделов не является главной (а это /articles/), то мы убираем ее из URL (который равен например /articles/tehnika/) и в итоге после замен мы получаем строку содержащую tehnika.
Если вы знакомы с апи секций битрикса, то можете по символьному коду узнать всё что вам нужно, в том числе и ID:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); global $APPLICATION; $SECTION_CODE = $APPLICATION->GetCurDir(); if ($SECTION_CODE != '/articles/'): $SECTION_CODE = str_replace('/articles/', '', $SECTION_CODE); $SECTION_CODE = str_replace('/', '', $SECTION_CODE); if (CModule::IncludeModule("iblock")): $iblock_id = 9; $my_elements = CIBlockSection::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y", "CODE" => $SECTION_CODE), false, Array('ID', 'NAME') ); if ($ar_fields = $my_elements->GetNext()) { echo $ar_fields['ID']; // ID ТЕКУЩЕЙ СЕКЦИИ } endif; endif; ?>
Не забываем что указываем $iblock_id и также “CODE” => $SECTION_CODE (tehnika).
Как узнать SEO свойства зная раздел в битриксе
Теперь вернемся к вкладке SEO у раздела. Воспользуемся D7:
$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($iblock_id,$ar_fields['ID']); $IPROPERTY = $ipropValues->getValues();
И всё что остается, это поменять для раздела мета title, keywords и description:
if ($IPROPERTY['SECTION_META_TITLE']) { $APPLICATION->SetPageProperty("title", $IPROPERTY['SECTION_META_TITLE']); $APPLICATION->SetTitle($IPROPERTY['SECTION_META_TITLE']); } if ($IPROPERTY['SECTION_META_KEYWORDS']) { $APPLICATION->SetPageProperty("keywords", $IPROPERTY['SECTION_META_KEYWORDS']); } if ($IPROPERTY['SECTION_META_DESCRIPTION']) { $APPLICATION->SetPageProperty("description", $IPROPERTY['SECTION_META_DESCRIPTION']); }
То есть, что мы делаем – проверяем заполнено ли значение на вкладке SEO – если да, то устанавливаем h1, title а также другие заполненные свойства.
Бонусная задача: выяснилось, что на странице раздела не добавляется в хлебные крошки название раздела, как быть?
Решение: “этого не было в изначальном ТЗ!” 🙂 шутки шутками, но такие вещи вы не могли предугадать. Но выход есть, и он в одну строку:
// Добавляем в навигационную цепочку имя раздела $APPLICATION->AddChainItem($ar_fields['NAME']);
таким образом мы выводим в конце хлебных крошек, после слова Статьи -> Техника.
Более детальное описание вы сможете найти в документации, кое-что я описывал в других статьях по битриксу, рекомендую ознакомится и сделать вывод – стоит так поступать или не стоит.
А теперь полный код:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); global $APPLICATION; $SECTION_CODE = $APPLICATION->GetCurDir(); if ($SECTION_CODE != '/articles/'): $SECTION_CODE = str_replace('/articles/', '', $SECTION_CODE); $SECTION_CODE = str_replace('/', '', $SECTION_CODE); if (CModule::IncludeModule("iblock")): $iblock_id = 9; $my_elements = CIBlockSection::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y", "CODE" => $SECTION_CODE), false, Array('ID', 'NAME') ); if ($ar_fields = $my_elements->GetNext()) { $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($iblock_id,$ar_fields['ID']); $IPROPERTY = $ipropValues->getValues(); if ($IPROPERTY['SECTION_META_TITLE']) { $APPLICATION->SetPageProperty("title", $IPROPERTY['SECTION_META_TITLE']); $APPLICATION->SetTitle($IPROPERTY['SECTION_META_TITLE']); } if ($IPROPERTY['SECTION_META_KEYWORDS']) { $APPLICATION->SetPageProperty("keywords", $IPROPERTY['SECTION_META_KEYWORDS']); } if ($IPROPERTY['SECTION_META_DESCRIPTION']) { $APPLICATION->SetPageProperty("description", $IPROPERTY['SECTION_META_DESCRIPTION']); } $APPLICATION->AddChainItem($ar_fields['NAME']); // Добавляем в навигационную цепочку если компонент не сделал это } endif; else: // Код для страницы со статьями, в нашем случае /articles/ $APPLICATION->SetPageProperty("title", 'Статьи'); $APPLICATION->SetTitle('Статьи'); endif; ?>
Данная статья не является решением всех проблем связанных с мета тегами и СЕО настройками, но вы должны уметь находить выход даже из таких ситуаций, когда код еще до вас был ужасным, когда сорваны сроки и бюджет не позволяет написать это качественно и долго.