Vse o WEB
Информация и размышления о Web технологиях

SEO пагинация Symfony c помощью KNP paginator bundle

Если вы уже в разработке сайтов не первый год, то уже скорее всего знаете, что сайт чаще всего разрабатывается для продвижения компании, товаров, услуг в интернете. И даже если вы разрабатываете сайт, реализующий какой-то сервис в помощь людям (например, подбор машин, сравнение цен), так или иначе вы надеетесь на продвижение сайта в массы. Поэтому писать код нужно с заделом на 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", как того и требует реализация. Поисковики смогут построить цепочку страниц и правильно проиндексируют пагинацию.

Наверх