Битрикс – как узнать по разделу его SEO свойства

В данной статье речь пойдет не только про 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;
?>

Данная статья не является решением всех проблем связанных с мета тегами и СЕО настройками, но вы должны уметь находить выход даже из таких ситуаций, когда код еще до вас был ужасным, когда сорваны сроки и бюджет не позволяет написать это качественно и долго.

Если на вашем сайте необходимо выполнить настройку по выводу SEO свойств из шаблонов а также формированию мета-тегов - обращайтесь ко мне.

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *