08.08.2024 Уже прочитали 4092 раз

Добавляем тег rel=canonical на страницы сайта Битрикс

Задача:

Добавить на сайте тег rel="canonical", чтобы убрать дубли в Каталоге и Информационных страницах.

  • Для детальной страниц каталога будем использовать типовой функционал 1С-Битрикс через настройки компонента и инфоблока.
  • Для всех остальных случаев, будем использовать свой код.

Шаг 1. Выводим тег canonical на детальной странице товара

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

  • /catalog/instrument-dlya-montazha/zaklyepochniki/2187/
  • /catalog/instrument-dlya-montazha/2187/
  • /catalog/ruchnoy_instrument/2187/

Первым делом выполняем простую задачу, т.е. идем в настройки Инфоблока и настройки Компонента и следуем рекомендациям описанным на официальном сайте 1С-Битрикс: https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=34&LESSON_ID=7199.

Далее, в код комплексного компонента добавляем строчку "DETAIL_SET_CANONICAL_URL" => "Y",

Проверяем, что у нас получилось!

Теперь при переходе на страницы указанные в нашем примере в коде сайте отображается постоянный тег, в котором указан правильный путь до этого товара

< link rel=" canonical" href="https://SITE.RU/catalog/instrument-dlya-montazha/zaklyepochniki/2187/" />

Теперь можно переходить к самописному коду для всего сайта, кроме карточки товара.

Шаг 2. Пишем кастомный код для вывода тега canonical для остальных случаев

Что будет делает этот код:

  • Формировать базовый URL без порта и с HTTPS.
  • Очищать текущий URL от /index.php и параметров фильтра, если это необходимо.
  • Добавлять / в конец URL, если это не .php или .html.
  • Исключать страницы с ID товара из канонического тега и формирует правильный канонический URL для остальных страниц.

Описание кода

  1. Определяем базовый URL:
    $protocol = 'https://';  // Используется HTTPS
    $host = $_SERVER['HTTP_HOST'];
    $host = preg_replace('/:\d+$/', '', $host);
    $baseUrl = $protocol . $host;
    
    • Определяем протокол (https://) и домен сайта ($_SERVER['HTTP_HOST']).
    • Удаляем порт из домена, если он присутствует (preg_replace('/:\d+$/', '', $host)).
    • Формируем базовый URL сайта ($baseUrl).
  2. Получаем текущий URL для канонического тега:
    $canonicalUrl = $APPLICATION->GetCurPage(true);
    $canonicalUrl = preg_replace('/\/index\.php$/', '', $canonicalUrl);
    
    • Получаем текущий URL страницы, используя метод $APPLICATION->GetCurPage(true).
    • Убираем /index.php из конца URL, если он присутствует.
  3. Добавляем обработку страниц смарт фильтра в Каталоге:
    if (strpos($canonicalUrl, '/filter/') !== false) {
        $parentSectionUrl = preg_replace('/\/filter\/.*$/', '', $canonicalUrl);
        $parentSectionUrl = preg_replace('/\/index\.php$/', '', $parentSectionUrl);
        $canonicalUrl = $parentSectionUrl;
    }
    
    • Если URL содержит /filter/, обрабатываем его, чтобы получить URL родительского раздела (без параметров фильтра).
    • Убираем /index.php из родительского URL, если он присутствует.
  4. Добавляем / в конец URL:
    if (!preg_match('/\.(php|html)$/', $canonicalUrl)) {
        $canonicalUrl = rtrim($canonicalUrl, '/') . '/';
    }
    
    • Проверяем, что URL заканчивается на /, если он не заканчивается на .php или .html.
  5. Добавляем проверка на детальную страницу товара и вывод канонического тега:
    if (!preg_match('/\/\d+\/$/', $canonicalUrl)) {
        $canonicalFullUrl = $baseUrl . $canonicalUrl;
        if ($baseUrl . $_SERVER['REQUEST_URI'] !== $canonicalFullUrl) {
            echo '';
        }
    }
    
    • Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (preg_match('/\/\d+\/$/', $canonicalUrl)).
    • Формируем полный канонический URL и добавляем его в <link rel="canonical">, если он отличается от текущего URL страницы.
    • Проверяем, является ли текущая страница детальной страницей товара по наличию ID товара в URL (preg_match('/\/\d+\/$/', $canonicalUrl)).
    • Формируем полный канонический URL и добавляем его в <link rel="canonical">, если он отличается от текущего URL страницы.
  6. Готовый код нужно поместить до закрывающегося тега head (файл header.php в шаблоне сайта)

    Этот код поможет корректно формировать канонический URL для вашего сайта, учитывая специфические условия для фильтров и детальных страниц товаров.

Обратная связь

Материал был полезен?

Оценка помогает понимать, какие материалы стоит развивать и дополнять.

Обсудить задачу

Обратиться за помощью

Опишите задачу и оставьте контакты. Я посмотрю вводные и свяжусь с вами удобным способом.

Направление *