СправошнаяПоиск

Canonical для всех страниц Bitrix

<?
// canonical на все страницы. Пагинация — неканоническая, canonical на первую страницу.
$APPLICATION->AddHeadString('<link rel="canonical" href="https://pavelfilippov.ru' . str_replace('index.php', '', $APPLICATION->GetCurPage(true)) . '" />');
?>

 

Вставляем в header.php. При необходимости предварительно можно (нужно) отключить канонические адреса в настройках блоков на страницах.

UPD 2024-06-21. Исправление дублирующихся карточек товара на старом битрикс с кастомным каталогом и изувеченным разрабами шаблоном ASPRO.

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

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

Решение — проверять, включен ли canonical в разделе и выводить ручной в зависимости от этого. Теоретически, за это должен отвечать второй необязательный параметр true в AddHeadString, он отвечает за проверку как раз повторения строки, но в header это не работает,

 

$APPLICATION->AddHeadString('<link rel="canonical" href="https://pavelfilippov.ru' . str_replace('index.php', '', $APPLICATION->GetCurPage(true)) . '" />',true);

 

$APPLICATION->GetPageProperty("canonical") всегда возвращает false.

Но можно использовать отложенную функцию.

 

// костыль для убирания двоящегося canonical в карточках товаров (детальный просмотр товара)
function ShowCanonical() {
  global $APPLICATION;
  $canonicalCurrent = $APPLICATION->GetPageProperty("canonical");
  $findme   = 'pavelfilippov.ru';
  $position = strpos($canonicalCurrent, $findme);
  if ($position === false){
    return '<link rel="canonical" href="https://pavelfilippov.ru' . str_replace('index.php', '', $APPLICATION->GetCurPage(true)) . '" />';
  }
  else {
    return false;
  }
}
$APPLICATION->AddBufferContent('ShowCanonical');

 

Здесь для примера просто проверяется наличие домена в canonical если он существует для страницы, но можно поменять строку вхождения на любое значение и менять канонический адрес в зависимости от места нахождения на сайте (типа catalog для каталога, articles для статей, смотря что там в пути). AddHeadString заменена на простое вкорячивание тега link. Такое себе решение, но работает. На чистом битрикс не особо и нужно, там можно просто настройками блоков обойтись, в принципе.