Как добавить на 1С Битрикс ссылку canonical?

Есть сайт (интерент магазин), на нем множество параметров фильтрации, а так разделение на страницы (пагинация)
site.ru/catalog/category/?PAGEN_1=2

Вопрос, как можно реализовать canonical ссылку в шапке страницы?
<link rel="canonical" href="site.ru/catalog/category/">


Проблема, что поисковики начали утверждать, у меня в два раза больше страниц, чем на самом деле (начали создавать дубли одних и тех же страниц). Выход один, указать каноническую страницу, но как реализовать?

Перечитал весь интеренет, ответа не нашел. Кто сталкивался, как решил?

------------------------
Решение вопроса:

Для catalog.section
в result_modifier.php
$arSection = CIblockSection::GetById($arResult["ID"])->GetNext();
$arResult['SECTION_PAGE_URL'] = $arSection['SECTION_PAGE_URL'];
$cp = $this->__component; 
if (is_object($cp))
$cp->SetResultCacheKeys(array('SECTION_PAGE_URL'));


в component_epilog.php
$APPLICATION->AddHeadString('<link href="http://'.SITE_SERVER_NAME.$arResult['SECTION_PAGE_URL'].'" rel="canonical" />',true);


Для catalog.element
в result_modifier.php
$arElement = CIblockElement::GetById($arResult["ID"])->GetNext();
$arResult['DETAIL_PAGE_URL'] = $arElement['DETAIL_PAGE_URL'];
$cp = $this->__component; 
if (is_object($cp))
$cp->SetResultCacheKeys(array('DETAIL_PAGE_URL'));


в component_epilog.php
$APPLICATION->AddHeadString('<link href="http://'.SITE_SERVER_NAME.$arResult['DETAIL_PAGE_URL'].'" rel="canonical" />',true);


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

п.с. ребят, за вопросом не слежу (он востребован, комментарии постоянно появляются), решение возможно устарело. Напишите в ЛК правильный вариант, что бы я обновил решение в вопросе.
  • Вопрос задан
  • 39004 просмотра
Пригласить эксперта
Ответы на вопрос 9
@Knebel
Как вариант можно добавить в файл /bitrix/templates/название_темы/header.php следующий код между тегами <head>...</head>:

<link rel="canonical" href="<? echo $APPLICATION->GetCurDir(); ?>" />
Ответ написан
tomgif
@tomgif
Веб-разработчик
$APPLICATION->SetPageProperty('canonical', $arResult["CANONICAL_PAGE_URL"]);
Ответ написан
Комментировать
@RGBPlus Автор вопроса
Решение добавил в саму тему!
Ответ написан
Комментировать
@Seo5
бился с этой задачей 4 часа сегодня и до этого еще столько же, так и не вышло сделать для категорий по вашей схеме, для тех у кого тоже не вышло, я все таки нашел решение (https://saitsozdanie.ru/bitrix/kak-ubrat-dubli-str...) - выводит canonical сразу на всех страницах, кому может пригодится, а если интернет-магазин и дублируются карточки товаров, то вообще есть решение из коробки и программирование знать не надо https://saitsozdanie.ru/bitrix/canonical-v-bitriks.html
Ответ написан
Комментировать
@xavikz
а разве такой код не будет динамически меняться на разных страницах одного и того же товара?
допустим, для урла с адресом:
каталог/производитель/наименование
будет канонические ссылка ="каталог/производитель/наименование"
а для
каталог/страна/наименование
будет канонические ссылка ="каталог/страна/наименование"
Так и какой смысл от таких канонов?
Ведь они должны все дубли указывать на одну страницу, а по факту этого не происходит.
Ответ написан
Сделал новый модуль для 1С-Битрикс.

Позволяет красиво обработать постраничную навигацию, создавать страницы типа /page-2/, /stranica-2/ и при этом соблюсти все рекомендации Google для постраничной навигации, добавить теги rel=next/prev/canonical на страницы с постраничкой!

Надеюсь кому-то будет полезно!

Буду благодарен за отзывы и предложения!
Ссылка на модуль: marketplace.1c-bitrix.ru/solutions/gorokhovdv.paging
Ответ написан
DmitBogdanov
@DmitBogdanov
пытаюсь тут что-то
  • Правильное включение canonical для элементов каталога - здесь
  • Включение canonical для родительских рубрик каталога:
    в /bitrix/templates/шаблон/components/bitrix/catalog.section.list/шаблон/component_epilog.php
    добавляем
    $APPLICATION->AddHeadString('<link href="https://сайт.ru'. str_replace('index.php', '', $APPLICATION->GetCurPage(true)) . '" rel="canonical" />',true);


  • Включение canonical для дочерних рубрик каталога:
    в /bitrix/templates/шаблон/components/bitrix/catalog.section/шаблон/component_epilog.php
    добавляем
    $APPLICATION->AddHeadString('<link href="https://сайт.ru'. str_replace('index.php', '', $APPLICATION->GetCurPage(true)) . '" rel="canonical" />',true);



Ответ написан
Комментировать
@helicopter-windmill
Нашел решение для вставки тега canonical для всех страниц сайта:
- находим файл bitrix/modules/main/include/prolog.php
- между строчками:
require_once(dirname(__FILE__)."/prolog_before.php");

require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_after.php");

- вставляем туда
$url = $_SERVER['REQUEST_URI'];
$url = explode('?', $url);
$url = 'http://www.site.ru'.$url[0];
echo '<link rel="canonical" href="'.$url.'"/>';
Ответ написан
@ZardoZAntony
программист, сис. админ
AddHeadString плохое решение. А если у вас уже другой криво написанный модуль установил canonical через такую же функцию. Правильно делать так:

В админке создаем свойство canonical. В нужных местах его устанавливаем через $APPLICATION->SetPageProperty('canonical', 'link'); И в том смысл этой отложенной функции, что установится только последняя по коду ссылка, а установок может быть сколько угодно в любых компонентах и не будет конфликта.

в init.php добавляем отложенные функции для вывода
function ShowCanonical() {
    global $APPLICATION;
    $APPLICATION->AddBufferContent('GetCanonical');
}

function GetCanonical(){
    global $APPLICATION;
    $val = $APPLICATION->GetProperty('canonical');
    if ($val)
        return  '<link rel="canonical" href="' . $val . '">';
}

Выводим через ShowCanonical();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы