SEO-оптимизаторы рекомендуют сообщать поисковикам какая страница является предыдущей и следующей через теги rel="next" и rel="prev" (rel=prev/next). В Битриксе штатной такой функции нету. Кто-то пытается сделать rel=next/prev прямо на ссылках в пагинации. Но такая затея довольно сомнительная, т.к гугл просит размещать код в head (https://support.google.com/webmasters/...3744?hl=ru) Можно править шаблоны компонентов каталога и новостей, но что если шаблонов очень много? Хотелось бы всё это ставить в одном месте. И недавно за обедом пришла идея такая реализации.
При прочтении будьте внимательны. Редактор статьи в некоторые link поставил пробелы. В реальности их быть не должно.
Способ размещения rel=prev/next в <head> (работает при кешировании и без) 1) В шаблоне пагинации через html-комментарии ставим признак пагинации и признак последней страницы пагинации. В моём случае признак пагинации это <!-- has_stranation_pagen_1 --> Признак последней страницы пагинации <!-- it_last_page_stranation -->
Код установки признаков в шаблоне пагинации
//Выводим метки для добавления <li nk rel="prev/next">: начало
$nav_index = (int)$arResult['NavNum'];
$quantity_pages = (int)$arResult['NavPageCount'];
//смотрим номер страницы в параметрах. в случае указания неверной страницы, компонент вернёт первый номер страницы,
//а нам нужен введённый номер. для неправильного номера флаг странация не выводится
$current_page = 1;
if(isset($_GET['PAGEN_'.$nav_index]) && (int)$_GET['PAGEN_'.$nav_index]>1) $current_page = (int)$_GET['PAGEN_'.$nav_index];
if($quantity_pages>1 && $current_page>=1 && $current_page<=$quantity_pages)
{
echo '<!-- has_stranation_pagen_'.$nav_index.' -->';
if($current_page >= $quantity_pages) echo '<!-- it_last_page_stranation -->';
}
//Выводим метки для добавления <li nk rel="prev/next">: конец
2) В файле /bitrix/php_interface/init.php в обработчике onepilog смотрим что хранится в буфере страницы. Если там есть признак пагинации, то ставим ссылки rel=prev/next Пример кода обработчика:
AddEventHandler("main", "OnEpilog", "vova_page_epilog");
function vova_page_epilog()
{
global $APPLICATION;
//Проверка на 404 страницу
$is_page_404 = false;
if(defined("ERROR_404")==true) $is_page_404 = true;
//Добавление тегов rel=prev/next: начало
if($is_page_404==false )
{
$page_content = ob_get_contents();
if($page_content!=false && strpos($page_content, '<!-- has_stranation_pagen_1 -->')!==false)
{
//Номер текущей страницы
$current_page = 1;
if(isset($_GET['PAGEN_1']) && (int)$_GET['PAGEN_1']>1) $current_page = (int)$_GET['PAGEN_1'];
//Проверка на последнюю страницу
$it_last_page = false;
if(strpos($page_content, '<!-- it_last_page_stranation -->')!==false) $it_last_page = true;
//Следующая страница
if($it_last_page==false)
{
$element_url = 'http://'.$_SERVER['HTTP_HOST'].$APPLICATION->GetCurPageParam('PAGEN_1='.($current_page+1), array('PAGEN_1'));
$APPLICATION->AddHeadString('<li nk rel="next" href="'.$element_url.'" />', true);
}
//Предыдущая страница
if($current_page>1)
{
if($current_page==2)
{
$element_url = 'http://'.$_SERVER['HTTP_HOST'].$APPLICATION->GetCurPageParam('', array('PAGEN_1'));
//очистка на случай, если останется последний символ ?
$element_url = trim($element_url, '?');
}
else $element_url = 'http://'.$_SERVER['HTTP_HOST'].$APPLICATION->GetCurPageParam('PAGEN_1='.($current_page-1), array('PAGEN_1'));
$APPLICATION->AddHeadString('<li nk rel="prev" href="'.$element_url.'" />', true);
}
}
}
//Добавление тегов rel=prev/next: конец
}
Если у вас на сайте кеш, то после правок его нужно почистить.
Теперь тестируем. тут важно проверить четыре момента: 1) Страницу без пагинации (не должно выводиться rel="next" и rel="prev") 2) Пагинацию на странице 1 (должен вывестись только rel="next") 3) Пагинацию на серединных страницах (должен вывестись rel="prev" и rel="next") 4) Пагинацию на последней странице (должен вывестись только rel="prev")
Добавлено 20 декабря 2016 В комментариях к статье Олег и Евгений дали очень дельные замечания. Поиск по html-коду даёт определённую нагрузку на сервер. Маленькую, но всё-же даёт. Если вы правите своё знакомый сайт и шаблонов не много, то более подходящий способ будет способ Олега через правку шаблона компонента (см. в комментариях)
Там не только next и prev, но и установка canonical.
Мне кажется нужно простое и массовое решение, а в вашем примере одиночная реализация. Каноникал проще ставить в onepilog, а не добавлять в каждом шаблоне. Причём в вашем коде нужно проверить, не будет ли выдаваться неправильный каноникал на нулевой категории. Плюс лишние затраты на выборку из кэша. Аналогично prev/next. И ещё в указанном коде скорее всего есть ошибка - указан параметр SECTION_SECTION_PAGE_URL вместо SECTION_PAGE_URL (могу ошибаться)
Владимир Беглецов, как по мне — массового решения и не надо. Да и нормально его не сделать. А знаете почему и в чём фатальный недостаток вашего решения для массовости? Вы забыли про несколько постраничек на одной странице. PAGEN_1 не обязательно будет с цифрой 1 в конце, там может быть и 2, и ещё больше. Мой немассовый вариант это учитывает
Да и зачем делать на всех страниц то, что не везде надо? Я просто обратчик OnEpilog, который выполняется на всех страницах сайта (даже где нет постранички).
В чём затраты-то? Данные из кеша так и так вытаскиваются в component_epilog. В нём мы просто с ними работаем
Аналогично prev/next. И ещё в указанном коде скорее всего есть ошибка - указан параметр SECTION_SECTION_PAGE_URL вместо SECTION_PAGE_URL (могу ошибаться)
Ошибаетесь SECTION_SECTION_PAGE_URL — ключ, записываемый в кеш. Он может быть каким угодно.
Олег Максименко написал: Вы забыли про несколько постраничек на одной странице. PAGEN_1 не обязательно будет с цифрой 1 в конце, там может быть и 2, и ещё больше
Не забыл, поэтому и прописал метку с указанием индекса пагинации. Через метку можно понять какой индекс. Как правило пагинации имеют индекс до 3, поэтому достаточно будет 3-х проверок. Хотя 2 и 3 индекс уже означает проблемы на сайте (появляются излишние пагинации, в широком смысле).
Олег Максименко написал: SECTION_SECTION_PAGE_URL — ключ, записываемый в кеш
Ай ай, извиняюсь, что-то я ступил, не увидел начальное определение SECTION_SECTION_PAGE_URL. Но ошибку у вас всё-равно нашёл - если у компонента не указана категория (а это частый случай), то в canonical будет записан адрес главной страницы сайта. То есть выведется неправильный адрес канонической ссылки.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».