<?
// 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
. Такое себе решение, но работает. На чистом битрикс не особо и нужно, там можно просто настройками блоков обойтись, в принципе.