KnpPaginatorBundle, Solarium & SEO

L’article ci-dessous détaille la configuration à prévoir pour faire tourner KnpPaginatorBundle et Solarium sous Symfony2. Vous trouverez à la fin de cet article un petit conseil pour optimiser le référencement naturel lorsque vous utilisez Knp Paginator.

Pour faire fonctionner le bundle Symfony2 KnpPaginator et Solarium, il vous faudra passer un array à la fonction paginate(). Par défaut, la fonction select() de Solarium retourne un object. La fonction (array) de PHP permet de convertir un objet en array. Dans ce cas précis, le résultat retourné n’est pas exploitable par KnpPaginator , il faut donc utiliser une autre commande. En l’occurrence, c’est la fonction getDocuments de Solarium qui va faire l’affaire, voyez un peu :

$array_from_resultsolr = $resultsolr->getDocuments();
$paginator  = $this->get('knp_paginator');
$pagination = $paginator->paginate($array_from_resultsolr,  $this->get('request')->query->get('page', 1)/*page number*/,20/*limit per page*/);

C’est bien beau tout ça, mais comment faire fonctionner le tri ?

Avant la mise en place de la pagination, j’utilisai ça :

$select->addSort('price', $select::SORT_ASC);

Le rendu par défaut se faisait sur le prix. Il faut maintenant indiquer à Solarium que le rendu doit se faire sur le contenu de la variable « direction » récupérée dans l’URL :

$select->addSort($this->get('request')->query->get('sort', 'price'), $select::$this->get('request')->query->get('direction', 'ASC'));

La configuration actuelle n’est pas 100 % fonctionnelle : le paramètre de tri par défaut indiqué à Solarium n’est pas, par défaut, envoyé à KnpPaginator. Conséquence : les paramètre d’url retournés par Twig ne sont pas les bons, il faut donc cliquer deux fois sur l’option de tri pour que celle-ci devienne effective.

On va donc modifier les paramètres de tri par défaut. Mais avant, on va créer 2 variables :

// Default parameters, will be used by Solarium and KnpPaginator
$default_sort = 'price';
$default_direction = 'asc';

On modifie ensuite le paramétrage de Solarium :

// Take the 'direction' and 'sort' parameters if set in url, otherwise set them by default to 'price' and 'ASC'
$select->addSort($this->get('request')->query->get('sort', $default_sort), $select::$this->get('request')->query->get('direction', $default_direction));

Et on fait de même pour le paramétrage de KnpPaginator:

//Default pagination and sorting parameters
$pagination->setParam('sort',$this->get('request')->query->get('sort',$default_sort));
$pagination->setParam('direction',$this->get('request')->query->get('direction', $default_direction));

La prochaine release de KnpPaginator devrait fonctionner avec le code ci-dessous :

// default sort field and direction are set based on options (if available)
        if (!isset($_GET[$options['sortFieldParameterName']]) && isset($options['defaultSortFieldName'])) {
            $_GET[$options['sortFieldParameterName']] = $options['defaultSortFieldName'];

        if (!isset($_GET[$options['sortDirectionParameterName']])) {
                $_GET[$options['sortDirectionParameterName']] = isset($options['defaultSortDirection']) ? $options['defaultSortDirection'] : 'asc';
            }
        }

Recommandations SEO

Pensez à modifier votre fichier robots.txt pour bloquer l’indexation des paramètres de tri !!! Sans cette modification, vous encourez une hausse drastique du nombre de pages inutilement crawlées par les divers robots, de la charge serveur inutile, et un impact négatif sur les positions dans Google.

#robots.txt - valable pour une configuration par défaut de KnpPaginatorBundle, avec les champs name et extra1 à bloquer
#Robots.txt directive are case sensitive
User-agent : *
Disallow: /*direction=desc
Disallow: /*sort=name
Disallow: /*sort=extra1
#And to avoid duplicate content :
Disallow: /*page=1

#Dé-commenter les deux lignes suivantes pour ne laisser crawlable que la première page de résultat - Attention, Allow est pris en compte par Googlebot, mais n'est pas pris en compte par tous les moteurs de recherche... En fonction de votre configuration, il est possible de jouer également avec le blocage de la direction pour le laisser crawlable que première page.
#Allow: /*page=1
#Disallow: /*page=

Update du 22/01/2014 :
Just au cas où le fichier robots.txt serait modifié, vous pouvez ajouter cela:

$currentpage = $_SERVER['REQUEST_URI'];
$list_of_parameters_to_do_not_index=['direction=desc','sort=name', 'sort=extra1'];
foreach( $list_of_parameters_to_do_not_index as $i )
if (strpos($currentpage,$i))
	{
	$indexer="do_not_index_the_page_please";
	}

Coté vue, dans le header :

{% block indexer %}

{% endblock %}

Et dans le fichier qui sera appelé

{% block indexer %}
        {% if indexer == "do_not_index_the_page_please" %}      {% endif %}
{% endblock %}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *