Правильная пагинация Joomla 3, добавляем rel="next" rel="prev"
По современным требованиям к поисковой оптимизации сайта необходимо оптимизировать систему пагинации Joomla.
Для корректного поиска в многостраничных документах в секции Head страниц многостраничного документа надо добавить следующие теги.
На 1-й странице тег
<link rel="prev" href="/url_адрес_второй_страницы_пагинации">
Но остальных, кроме последней.
<link rel="prev" href="/url_адрес_предыдущей_страницы"> <link rel="next" href="/url_адрес_следующей_страницы"> <link rel="canonical" href="/url_адрес_основной_страницы">
На последней странице последовательности:
<link rel="prev" href="/url_адрес_предыдущей_страницы"> <link rel="canonical" href="/url_адрес_основной_страницы">
На сайте с Joomla необходимо добавить теги rel="prev", rel="next" и rel="canonical" на страницах с пагинацией, а так же безопасно удалить '?limitstart=0' из ссылок:
Для того чтобы добавить на страницах сайта теги rel="next" и rel="prev" достаточно модифицировать функцию pagination_list_render в файле pagination.php.
Для этого у вас в шаблоне должен быть переопределенный файл pagination.php, который будет находиться по пути:
[корень сайта]/templates/[ваш шаблон]/html/pagination.php
В этом файле должна быть функция которая выглядит примерно вот так (ну как минимум название функции совпадает):
function pagination_list_render($list) { $html = array(); $html[] = '<ul>'; $html[] = '<li class="pagination-start">' . $list['start']['data'] . '</li>'; $html[] = '<li class="pagination-prev">' . $list['previous']['data'] . '</li>'; foreach ($list['pages'] as $page) { $html[] = '<li class="number">' . $page['data'] . '</li>'; } $html[] = '<li class="pagination-next">' . $list['next']['data'] . '</li>'; $html[] = '<li class="pagination-end">' . $list['end']['data'] . '</li>'; $html[] = '</ul>'; return implode("\n ", $html); }
Весь этот участок кода нужно заменить на код представленный ниже:
function pagination_list_render($list){ $doc = JFactory::getDocument(); // Calculate to display range of pages $currentPage = 1; $range = 1; $step = 5; foreach ($list['pages'] as $k => $page) { if (!$page['active']) { $currentPage = $k; } } if ($currentPage >= $step) { if ($currentPage % $step == 0) { $range = ceil($currentPage / $step) + 1; } else { $range = ceil($currentPage / $step); } } $html .= '<ul>'; $html .= '<li class="pagination-start">' . str_replace('?limitstart=0', '', $list['start']['data']) . '</li>'; $html .= '<li class="pagination-prev">' . str_replace('?limitstart=0', '', $list['previous']['data']) . '</li>'; $prev_href = null; preg_match('#(href=").*?(")#', $list['previous']['data'], $prev_a); if (count($prev_a) > 0) { $prev_href = str_replace(array('href="/','"'), "", $prev_a[0]); } //var_dump(JURI::base().$prev_href); if(isset($prev_href)) { $doc->addCustomTag('<link rel="prev" href="'.JURI::base().$prev_href.'">'); } foreach ($list['pages'] as $k => $page) { if (in_array($k, range($range * $step - ($step + 1), $range * $step))) { if (($k % $step == 0 || $k == $range * $step - ($step + 1)) && $k != $currentPage && $k != $range * $step - $step) { $page['data'] = preg_replace('#(<a.*?>).*?(</a>)#', '$1...$2', $page['data']); } } $html .= '<li class="number">' . str_replace('?limitstart=0', '', $page['data']) . '</li>'; } $html .= '<li class="pagination-next">' . $list['next']['data'] . '</li>'; $next_href = null; preg_match('#(href=").*?(")#', $list['next']['data'], $next_a); if (count($next_a) > 0) { $next_href = str_replace(array('href="/','"'), "", $next_a[0]); } //var_dump(JURI::base().$prev_href); if(isset($next_href)) { $doc->addCustomTag('<link rel="next" href="'.JURI::base().$next_href.'">'); } $html .= '<li class="pagination-end">' . $list['end']['data'] . '</li>'; $html .= '</ul>'; return $html; }
В результате в теге <head> нашего сайта на страницах с пагинацией у нас автоматически будут добавляться необходимые нам теги rel="next" и rel="prev" вместе с ссылками на соответствующие страницы.
Приведенный выше код так же решает проблему удаления пресловутого '?limitstart=0' из ссылок, ведущих на первую страницу пагинации: "start", "prev", "1"