Если вы уже в разработке сайтов не первый год, то уже скорее всего знаете, что сайт чаще всего разрабатывается для продвижения компании, товаров, услуг в интернете. И даже если вы разрабатываете сайт, реализующий какой-то сервис в помощь людям (например, подбор машин, сравнение цен), так или иначе вы надеетесь на продвижение сайта в массы. Поэтому писать код нужно с заделом на SEO оптимизацию. Одним из важных фактров является правильное оформление пагинации (разбиения категорий или страниц с товарами на отдельные страницы). Неправильная пагинация может привести к дублированию контента у поисковика, что негативно влияет на позиции сайта в поиске. В данной статье вы найдете пример кода SEO пагинации в Symfony с использованием meta-тегов rel="prev", rel="next" в секции head.
Чаще всего разработчики Symfony проектов используют готовый бандл для пагинации от KNP Labs - KNP Paginator Bundle. Именно для него мы и реализуем добавление необходимых meta-тегов.
Начнем с написания макроса для шаблона:
<!-- объект пагинатора находится в переменной paginator -->
{% macro pagination_meta(pagination) %}
{% set total = pagination.totalItemCount %}
{% set items_per_age = pagination.itemNumberPerPage %}
{% set current = pagination.currentPageNumber %}
{% set last = (total / items_per_age) | round(0, 'ceil') %}
{% set page_parameter = pagination.paginatorOption('pageParameterName') %}
{% if current != 1 %}
<link rel="prev" href="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params') | merge({ (page_parameter): (current - 1) })) }}" />
{% endif %}
{% if current != last %}
<link rel="next" href="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params') | merge({ (page_parameter): (current + 1) })) }}" />
{% endif %}
{% endmacro %}
Сохраним файл, например, в папке templates/common/pagination_meta.html.twig, если вы используете Symfony 4. Для Symfony 2/3 это может быть файл common/pagination_meta.html.twig в папке src/AppBundle/Resources/views либо другой путь на ваше усмотрение.
Далее убедитесь, что в базовом шаблоне Twig у вас есть блок для секции head. Если нет, создайте его:
{# templates/layout.html.twig #}
<!DOCTYPE html>
<html lang="ru">
<head>
+ {% block head %}
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="keywords" content="{% block keywords %}{% endblock %}">
<meta name="description" content="{% block description %}{% endblock %}">
<meta name="author" content="">
<link rel="icon" href="{{ asset('favicon.ico') }}">
<title>{% block title %}Vse o WEB{% endblock %}</title>
{% block stylesheets %}{% endblock %}
{% block head_scripts %}{% endblock %}
<![endif]-->
+ {% endblock %}
</head>
<body>
...
Использовать макрос проще простого:
{# category.html.twig #}
{% extends "layout.html.twig" %}
{# импортируем макрос, указывая правильный путь к нему #}
{% import 'common/pagination_meta.html.twig' as macros %}
{# добавляем мета-теги в head, не забыв про вызов parent() #}
{% block head %}
{{ parent() }}
{{ macros.pagination_meta(posts) }}
{% endblock %}
{# ваш код шаблона #}
Вот и всё, теперь мета теги next и prev будут добавлены на все страницы пагинации, но на первой будет отсутствовать rel="prev", а на последней rel="next", как того и требует реализация. Поисковики смогут построить цепочку страниц и правильно проиндексируют пагинацию.