Канонічні посилання сторінки в Бітрікс
Канонические ссылки страниц на CMS Битрикс
Что же такое каноническая ссылка? Когда на вашем сайте один и тот же раздел или страница встречается больше одного раза, то вам просто необходимо использовать канонические ссылки.
При разработке и поддержке сайтов, мне удалось обнаружить, что дубли страниц на Битрикс могут встречаться по разным причинам:
- Сайт расположен на нескольких доменах
- Содержимое инфоблока выводится в разных разделах сайта
- На сайте присутсвуют ускореные мобильные страницы AMP
Сначала нужно определиться с выбором основной страницы и ее дублей. Когда мы разобрались в этой ссылочной каше, то начинаем прописывать во всех дублях страниц канонические ссылки на ту страничку или раздел, дубликатом которой они являются. А на самой же основной странице можно указать ссылку на себя саму. Это не будет проблемой. Конечно проделывать такое в ручном режиме года перед вами всемогущий Битрикс - глупо. Поэтому автоматизируем этот процесс в его компонентах.
Все это хорошо. Но что делать когда у нас сайт на разных доменах. Например мобильная версия сайта https://m.riggs.ua и полная версия https://riggs.ua, и есть страницы где многостраничные компоненты не расположены. Тогда в самом шаблоне лучше всего установить это свойство. Сейчас я вам расскажу как это сделать.
Так как у нас мобильная и полная версия сайта являются зеркалами то в шаблоне мобильной версии прописываем код с использованием функции SetPageProperty и ее первым параметром передающим идентификатор свойства страницы canonical.
Так как по правилам хорошего тона ссылка должна указывать не относительный путь а полный, то нам не составит труда ее сконструировать. Поэтому каноническую ссылку собираем из констант. SITE_HTTP_PROTOCOL - это наша константа, по которой мы указываем работает ли сайт обычно по http или по защищенному соединению https.Определить ее мы легко можем в init.php.
Следующая константа SITE_SERVER_NAME - специальная битриксовская, которая берется из настроек сайта из поля "URL сервера". В этом поле вы указали главный адрес сервера сайта. Ну и самом конце нам нужно получить относительный адрес текущей страницы, который мы можем получить при помощи функции GetCurPage().
Все! Наша первая каноническая ссылка сформирована. Она будет отрабатываться на всех страницах мобильной версии шаблона сайта и указывать на оригинал, который находится на главном зеркале нашего сайта.
Проблему со статическими страницами мы решили. Беремся за динамические разделы многостраничных компонентов битрикс. Почему только за разделы? Потому что в последних версиях компонентов битрикс уже реализовано определение канонических страниц для элементов инфоблоков. Достаточно этот функционал только включить в настройках компонента.
Какие же компоненты потребовалось править лично мне. Конечно же комплексный многостраничный компонент bitrix:news. Я думаю нет такого сайта который бы не использовал этот компонент. Даже эта статья, которую вы сейчас читаете, выведена на экран с его помощью. Повторюсь, что на элементы инфоблока такие как эта статья канонические ссылки уже работали стандартными методами битрикс. Почему не реализован функционал установки канонических ссылок разделов инфоблоков битрикс мне пока что не понятно. Возможно это связано с тем что на разных сайтах логика построения адресов разделов будет посложнее чем адреса элементов. Возможно есть какие то подводные камни. Но тем не менее, пришлось что то с этим делать.
Канонические ссылки разделов в компоненте списка новостей bitrix:news.list
Самостоятельно реализовать этот функционал тоже достаточно просто. Перед правкой шаблона компонента лучше его скопировать в шаблон сайта. В таком случае наши доработки не слетят при следующем обновлении системы.
За вывод разделов в шаблоне компонента news отвечает файл section.php, в котором подключается компонент bitrix:news.list. Вот шаблон этого компонента нам и придется подправить. Для решения лучше всего создать отдельный подключаемый файл в шаблоне компонента result_modifier.php. В его содержимое нужно записать следующий код, который изображен на картинке.
Код ставим в условие параметра компонента. Если стоит настройка устанавливать каноническую ссылку для детальной страницы, то под нее мы будем ставить и для страниц раздела. Этот код поможет нам установить ссылки со страниц с включенной постраничной навигацией или на общий список раздела. В данном примере каноничность нас спасает только если ее надо проставлять в рамках одного компонента. Так как ссылки получаем из настроек самого компонента. Но если существует еще один компонент новостей и выводится он по какому то другому физическому пути, то к сожалению проблему дублей решить не удастся. Так как получать ссылки нужно по настройках инфоблока, а этот код этого не делает. Зато обрабатывается он быстрее, без лишних запросов к базе данных. Но если все же нужно получать глобальные ссылки из настроек инфоблока, то пример реализации такого кода я покажу на примере компонента каталога далее в статье.
Канонические ссылки разделов в компоненте каталога bitrix:catalog.section.list
Здесь я покажу немного иной способ решения проблемы. Данный пример будет немного правильнее предыдущего, но сложнее, так как нам не обойтись стандартными данными результата выполнения компонента из $arResult. Тут придется дополнительно получать данные чтобы получить глобальные ссылки инфоблока которые используются по всему сайту, а не в рамках одного компонента
В этом же компоненте в выводе разделов участвуют два файла section.php и sections.php. В них же в свою очередь подключается bitrix:catalog.section.list. В нем же и нужно нам будет устанавливать какнонические URL. В шаблоне этого компонента тоже создаем стандартный битриксовский файл result_modifier.php. В нем прописываем код который показан выше на рисунке. Как видим, ссылки мы получаем через CIBlockSection::GetList(). В этом случае наши ссылки будут глобальные. И помогут решить проблему дублей в рамках всего сайта и его зеркал.
Надеюсь мне удалось преподнести информацию доступно и полностью раскрыть тему. Если будут какие то вопросы, то конечно же - обращайтесь!
24 березня 2017 (Boudybuilder) Виталий Фантич