Уникальные мета теги для фильтра Bitrix

Часто, сео специалисты просят сделать уникальные мета теги для фильтрованных страниц каталога.

Тут описано простое решение как это сделать.

Реализация состоит из 2 частей

  1. Собираем установленные фильтры
  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);
                }
            }
        }
    }
}