Уникальные мета теги для фильтра Bitrix
Часто, сео специалисты просят сделать уникальные мета теги для фильтрованных страниц каталога.
Тут описано простое решение как это сделать.
Реализация состоит из 2 частей
- Собираем установленные фильтры
- Добавляем его к мета тегам
Собираем установленные фильтры
В шаблоне bitrix:catalog.smart.filter
в файле result_modifier.php
собираем активные фильтры.
Всё зависит от задачи, в данном примере собираются все значения кроме числовых (ползунки от и до).
$arResult['SET_FILTERS'] = [];
foreach ($arResult['ITEMS'] as $k => $arItem) {
switch ($arItem['DISPLAY_TYPE']) {
case 'A':
case 'B':
/** Пропустим числовые данные ползунки */
break;
default:
foreach ($arItem['VALUES'] as $v) {
/** Если фильтр активен, то запишем значение в массив */
if ($v['CHECKED'] == 1) {
$arResult['SET_FILTERS'][] = $v['VALUE'];
}
}
}
}
/** Добавим значение в кеш */
$cp = $this->__component;
if (is_object($cp)) {
$cp->arResult['SET_FILTERS'] = $arResult['SET_FILTERS'];
$cp->SetResultCacheKeys(
[
'SET_FILTERS'
]
);
}
Данные мы собрали, теперь их нужно записать в глобальную переменную
В файле component_epilog.php
всё того же шаблона, сделаем это
if (!empty($arResult['SET_FILTERS'])) {
$APPLICATION->SetPageProperty('titleSuffix', implode(', ', $arResult['SET_FILTERS']));
}
Вывод данных
Для вывода используется событие OnEpilog
модуля main
.
Логика такова, в конце формирования страницы, смотрится переменная titleSuffix
которую мы создали в фильтре.
Если она не пустая, то формируется новый h1 из старый h1 + значения фильтра.
C title, description, keywords всё немного сложнее, в них замена происходит через поиск исходного h1 в тексте и заменяет его на новый.
Пример класа с событием, вызывается init.php \SiteEvent\Main\End::initEvents();
namespace SiteEvent\Main;
use Bitrix\Main\EventManager;
class End
{
const module = 'main';
/**
* Инициализация событий
*/
public static function initEvents()
{
$event = EventManager::getInstance();
$event->addEventHandler(self::module, 'OnEpilog', [__CLASS__, 'OnEpilog']);
}
public static function OnEpilog()
{
global $APPLICATION;
$titleSuffix = $APPLICATION->GetPageProperty('titleSuffix');
if (!empty($titleSuffix)) {
$h1 = $APPLICATION->GetTitle();
$newH1 = $h1 . ' ' . $titleSuffix;
$APPLICATION->SetTitle($newH1);
/** Добавим в хлебные крошки */
$APPLICATION->AddChainItem($titleSuffix);
foreach (['title', 'description', 'keywords'] as $prop) {
$current = $APPLICATION->GetPageProperty($prop);
$newValue = str_replace($h1, $newH1, $current);
if ($current !== $newValue) {
$APPLICATION->SetPageProperty($prop, $newValue);
}
}
}
}
}