Правильная пагинация 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"