SEO-оптимизаторы рекомендуют сообщать поисковикам какая страница является предыдущей и следующей через теги rel="next" и rel="prev" (rel=prev/next).
В Битриксе штатной такой функции нету. Кто-то пытается сделать rel=next/prev прямо на ссылках в пагинации. Но такая затея довольно сомнительная, т.к гугл просит размещать код в head ()
Можно править шаблоны компонентов каталога и новостей, но что если шаблонов очень много? Хотелось бы всё это ставить в одном месте. И недавно за обедом пришла идея такая реализации.
При прочтении будьте внимательны.
Редактор статьи в некоторые link поставил пробелы. В реальности их быть не должно.
Способ размещения rel=prev/next в <head> (работает при кешировании и без)
1) В шаблоне пагинации через html-комментарии ставим признак пагинации и признак последней страницы пагинации.
В моём случае признак пагинации это <!-- has_stranation_pagen_1 -->
Признак последней страницы пагинации <!-- it_last_page_stranation -->
Код установки признаков в шаблоне пагинации
2) В файле /bitrix/php_interface/init.php в обработчике onepilog смотрим что хранится в буфере страницы. Если там есть признак пагинации, то ставим ссылки rel=prev/next
Пример кода обработчика:
Если у вас на сайте кеш, то после правок его нужно почистить.
Теперь тестируем. тут важно проверить четыре момента:
1) Страницу без пагинации (не должно выводиться rel="next" и rel="prev")
2) Пагинацию на странице 1 (должен вывестись только rel="next")
3) Пагинацию на серединных страницах (должен вывестись rel="prev" и rel="next")
4) Пагинацию на последней странице (должен вывестись только rel="prev")
Добавлено 20 декабря 2016
В комментариях к статье Олег и Евгений дали очень дельные замечания. Поиск по html-коду даёт определённую нагрузку на сервер.
Маленькую, но всё-же даёт. Если вы правите своё знакомый сайт и шаблонов не много, то более подходящий способ будет способ Олега через правку шаблона компонента (см. в комментариях)
В Битриксе штатной такой функции нету. Кто-то пытается сделать rel=next/prev прямо на ссылках в пагинации. Но такая затея довольно сомнительная, т.к гугл просит размещать код в head ()
Можно править шаблоны компонентов каталога и новостей, но что если шаблонов очень много? Хотелось бы всё это ставить в одном месте. И недавно за обедом пришла идея такая реализации.
При прочтении будьте внимательны.
Редактор статьи в некоторые 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-коду даёт определённую нагрузку на сервер.
Маленькую, но всё-же даёт. Если вы правите своё знакомый сайт и шаблонов не много, то более подходящий способ будет способ Олега через правку шаблона компонента (см. в комментариях)