Dans l’article d’aujourd’hui, nous allons examiner en profondeur les permaliens WordPress et la réécriture d’URL. D’après un article de 1999 par Jacob Nielsen, un site web utilisable nécessite :

  • un nom de domaine facile à mémoriser et facile à épeler
  • des URLs courtes
  • des URLs faciles à écrire
  • des URLs qui visualisent la structure du site
  • des URLs qui sont « hackable » pour permettre aux utilisateurs de passer à des niveaux supérieurs de l’architecture de l’information en modifiant la fin de l’URL
  • des URLs persistantes qui ne changent pas

Une URL ne devrait jamais changer, car elle peut être stockée et partagée de plusieurs façons. C’est la raison pour laquelle nous les appelons des permaliens. De plus, une URL doit être sémantique, c’est-à-dire qu’elle doit avoir un sens immédiat et intuitif pour les utilisateurs non experts (en savoir plus sur les URLs sémantiques sur Wikipedia).

Dans un web statique, une URL identifie une ressource par son nom, comme le montre l’exemple suivant :

http://example.com/path/to/resource/wordpress-permalinks.html

Afin d’avoir des URL bien structurées, nous avons juste besoin d’un système de fichiers bien structuré et de ressources bien nommées.
Mais le web est dynamique, et nous avons l’habitude de gérer des sites web à l’aide de CMS pilotés par des bases de données, et les URLs contiendront un certain nombre de paramètres dont les valeurs détermineront la requête à exécuter dans la base de données. Prenons l’exemple suivant :

http://example.com/?key1=val1&key2=val2

Dans cette URL, vous remarquerez un séparateur (le point d’interrogation), et un ensemble de paires clé/valeur (séparées par « & ») qui constituent la chaîne de requête. L’URL ne répond pas aux exigences d’utilisabilité et d’accessibilité spécifiées ci-dessus, et devrait être convertie en un permalien plus significatif et plus convivial pour le référencement.
La façon dont ces URL « hideuses » sont converties en permaliens optimisés dépend de votre serveur web. Si vous êtes sur Apache, vous devrez ajouter un ensemble de directives de réécriture dans le .htaccess du répertoire racine. Si vous êtes un utilisateur de Nginx, vous pouvez ajouter une directive try_files dans le fichier de configuration principal (pour en savoir plus à ce sujet, voir le blog Nginx).

Mais ne vous inquiétez pas ! La plupart du temps, vous n’aurez pas à configurer ligne par ligne le serveur web, car les CMS les plus populaires permettent aux utilisateurs de gérer la structure de permalien facilement et en toute sécurité depuis l’administration. Et WordPress ne fait pas exception. Les administrateurs pourront définir leurs règles de réécriture personnalisées rapidement et facilement à partir du panneau d’administration. Les utilisateurs et les développeurs avancés ont pu obtenir encore plus grâce à la fonction WordPress Rewrite API, qui fournit des fonctions et des hooks qui permettent de personnaliser les permaliens à un niveau supérieur.

L'administrateur peut facilement vérifier sa structure préférée à partir des réglages

L’administrateur peut facilement vérifier sa structure préférée à partir des réglages

Les URLs déterminent la requête à exécuter dans la base de données. Pour cette raison, notre première étape sera une brève introduction aux requêtes WordPress.

Un Aperçu des Requêtes WordPress

Dans le but spécifique de construire la requête, exécutez-la et stockez les résultats depuis la base de données WordPress, WordPress fournit la classe WP_Query. Grâce à cette classe, nous n’avons pas besoin de nous soucier de la requête car WP_Query va automatiquement traiter la requête, la construire et l’exécuter. Ensuite, d’après la hiérarchie de modèle, WordPress retournera la ressource demandée.

WordPress admet les requêtes des articles, des pages, de types de publication ainsi que pour un certain nombre d’archives classées par catégorie, étiquette, date, auteur, et plus encore. De plus, si les fonctionnalités par défaut ne suffisent pas, les développeurs peuvent créer des requêtes personnalisées en créant de nouvelles instances de la classe WP_Query (l’objet requête) ou en passant des paramètres spécifiques à une instance existante de la requête avant son exécution.

Les paramètres de requête sont nommés variables de requête qui sont divisées en trois groupes.

Variables de requêtes publiques : ces variables sont publiques dans le sens où elles sont disponibles pour être utilisées dans les requêtes publiques (Ex : les URLs).
Grâce à ces variables, nous pouvons demander des articles par auteurs :

?author=12
?author_name=mickey

Par catégorie ou étiquette :

?cat=4,5,6
?category_name=CMS
?tag=wordpress

Par date et heure :

?monthnum=201601
?year=2015
?w=13
?day=31

Par article ou par page :

?p=123
?name=hello-world
?page_id=234

Et bien plus encore.

Variables de requête privées : ces variables ne sont pas destinées à être ajoutées aux chaînes de requête d’URL. Ils peuvent être utilisés pour affecter des requêtes juste à l’intérieur d’un script (une extension ou le fichier functions.php d’un thème).

La chaîne de requête suivante ne renvoie pas le résultat attendu :

?meta_key=city&meta_value=london

meta_key et meta_value sont des variables de requête privées qui ne doivent pas être définies dans les chaînes de requête. Elles doivent être passés à une instance de l’objet de requête, comme je vous le montrerai plus tard.

Voir la liste complète des variables de requêtes publiques et privées dans le Codex.

Variables de requêtes personnalisées : ces variables définies par l’utilisateur peuvent être transmises via des chaînes de requêtes d’URL, tout comme les variables de requêtes publiques. La principale différence entre les variables publiques et personnalisées est que WordPress ne gère pas les variables personnalisées par lui-même, et nous devrions obtenir leurs valeurs depuis une extension pour personnaliser les requêtes.

Cela dit, revenons aux permaliens.

Les permaliens laids affichent la chaîne de requête, c’est-à-dire la partie de l’URL contenant un ensemble de variables de requête (la chaîne de requête) qui va déterminer la ressource retournée.

WordPress est configuré par défaut sur la structure des permaliens laids

WordPress est configuré par défaut sur la structure des permaliens laids

À titre d’exemple, considérons les URL suivantes :

http://example.com/?cat=5
http://example.com/?cat=5,7,9

En réponse à ces URLs, WordPress retournerait l’archive des articles appartenant aux catégories spécifiées.
Nous ne sommes pas limités à un seul paramètre par URL. Dans les exemples suivants, nous construisons des requêtes plus complexes :

?author_name=lucy&category_name=WebDev
?tag=wordpress&m=201606

Dans la première chaîne de requête, author_name et category_name appelleront tous les articles de l’auteur spécifié dans la catégorie WebDev. Dans la deuxième chaîne de requête, tag et m appelleront tous les articles étiquetés avec wordpress et publiés en juin 2016.
Comme vous pouvez le voir, nous pouvons définir plus d’une variable de requête et forcer WordPress à exécuter des requêtes avancées en ajoutant simplement les paires key=value appropriées aux chaînes de requête.

En activant les jolis permaliens, nous avons mis en place une structure d’URL utilisable, accessible et conviviale pour le référencement. Comparons les URL suivantes :

http://example.com/?p=123 
http://example.com/wordpress-permalinks/

Dans cet exemple, le vilain permalien affiche la variable p et sa valeur (l’ID de l’article), tandis que la jolie URL affiche le slug de l’article.

WordPress fournit quatre formats de jolis permaliens que nous pouvons choisir dans l’écran Permalien de l’écran des réglages comme le montre l’image ci-dessous.

Permaliens WordPress par défaut

Permaliens WordPress par défaut

Mais nous ne sommes pas limités aux formats par défaut, car WordPress permet aux utilisateurs de personnaliser le format des jolis permaliens en définissant une ou plusieurs balises de structure.

L'option de structure personnalisée permet de définir un joli format de permalien hautement personnalisé.

L’option de structure personnalisée permet de définir un joli format de permalien hautement personnalisé.

Ces balises sont des mots-clés spécifiques enveloppés dans le caractère %. WordPress fournit les balises suivantes :

  • %year%
    L’année de la publication (quatre chiffres)
  • %monthnum %
    Le mois de publication (deux chiffres)
  • %day%
    Le jour de la publication (deux chiffres)
  • %hour%
    L’heure de publication (deux chiffres)
  • %minute%
    La minute de publication (deux chiffres)
  • %second%
    La seconde de publication (deux chiffres)
  • %post_id%
    L’ID unique de l’article (entier)
  • %postname %
    Le slug de l’article (la chaîne sanitisée représentant le titre de l’article)
  • %category %
    Le slug de la
    catégorie
  • %author%
    Le slug de l’auteur

Cochons le bouton de Structure personnalisée et ajoutons l’une des chaînes suivantes dans le champ de texte :

/%author%/%postname%/
/%year%/%postname%/
/%category%/%postname%/

Chacune de ces chaînes génère un joli permalien différent avec des valeurs sémantiques spécifiques, comme indiqué ci-dessous :

http://example.com/mickey/wordpress-permalinks/
http://example.com/2016/wordpress-permalinks/
http://example.com/CMS/wordpress-permalinks/

Dans le premier exemple, l’URL résultante met en évidence les auteurs des articles. Les deux autres formats indiquent respectivement l’année de publication et la catégorie de l’article. C’est à vous de choisir le format qui vous convient le mieux.

En plus des requêtes publiques et privées, WordPress permet aux développeurs et aux utilisateurs avancés de définir leurs propres requêtes personnalisées. Une fois enregistrées, ces variables peuvent être ajoutées aux chaînes de requête, tout comme les variables de requête publiques, et leurs valeurs peuvent également être utilisées pour affecter les requêtes.

A partir de maintenant, je vais vous montrer comment construire une méta requête personnalisée (c’est-à-dire une requête qui récupère les articles par un champ personnalisé) en tirant profit des variables de requête personnalisée.
Afin d’atteindre cet objectif, nous allons développer une extension à partir de laquelle nous allons enregistrer des variables personnalisées, obtenir leurs valeurs et modifier la requête en conséquence.

Dans le fichier principal d’une extension ajoutez le code suivant :

/**
 * Register custom query vars
 *
 * @param array $vars The array of available query variables
 */
function myplugin_register_query_vars( $vars ) {
	$vars[] = 'city';
	return $vars;
}
add_filter( 'query_vars', 'myplugin_register_query_vars' );

/**
 * Build a custom query
 *
 * @param $query obj The WP_Query instance (passed by reference)
 *
 */
function myplugin_pre_get_posts( $query ) {
	// check if the user is requesting an admin page 
	// or current query is not the main query
	if ( is_admin() || ! $query->is_main_query() ){
		return;
	}

	$city = get_query_var( 'city' );

	// add meta_query elements
	if( !empty( $city ) ){
		$query->set( 'meta_key', 'city' );
		$query->set( 'meta_value', $city );
		$query->set( 'meta_compare', 'LIKE' );
	}
}
add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );

Disséquons ce code. Nous avons d’abord enregistré une variable de requête nommée city :

function myplugin_register_query_vars( $vars ) {
	$vars[] = 'city';
	return $vars;
}
add_filter( 'query_vars', 'myplugin_register_query_vars' );

Le filtre query_vars permet d’ajouter, de supprimer ou de modifier des variables de requête publiques avant l’exécution de la requête. La fonction de callback dans l’exemple conserve en argument un tableau des variables disponibles, ajoute une nouvelle variable et retourne le même tableau.
Ensuite, nous avons utilisé la valeur de la variable pour modifier la requête :

function myplugin_pre_get_posts( $query ) {
	// check if the user is requesting an admin page 
	// or current query is not the main query
	if ( is_admin() || ! $query->is_main_query() ){
		return;
	}

	$city = get_query_var( 'city' );

	// add meta_query elements
	if( !empty( $city ) ){
		$query->set( 'meta_key', 'city' );
		$query->set( 'meta_value', $city );
		$query->set( 'meta_compare', 'LIKE' );
	}
}
add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );

Le hook d’action pre_get_posts est déclenché après la création de la requête mais avant son exécution. Ainsi nous pouvons hooker une fonction de rappel à cette action pour apporter nos modifications à la requête avant qu’elle ne s’exécute. Voici ce qui arrive :

  1. La fonction de rappel conserve une instance de l’objet $query, qui est passée par référence et non par valeur. Cela signifie que toute modification apportée à l’objet de requête affecte la requête originale et non une copie de celle-ci. Pour cette raison, nous devons être sûrs de quelle requête va être exécutée (la requête principale).
  2. Ensuite, on obtient la valeur de city à partir de la chaîne de requête actuelle grâce à la fonction get_query_var.
  3. Enfin, si $city n’est pas vide, nous pouvons définir les éléments meta_key, meta_value et meta_compare. Ces dernières sont des requêtes privées qui ne sont pas disponibles pour les requêtes publiques. Leurs valeurs ne peuvent être définies qu’à partir de l’intérieur du script.

Maintenant, activez l’extension, ajoutez le champ personnalisé city à un certain nombre d’articles, et réglez les URLs comme ci-dessous :

http://example.com/?city=London

En réponse à cette requêtes, WordPress retournera tous les articles dont la valeur du city est London.

Rendons les Jolis

Notre dernière tâche est de convertir l’URL laide de l’exemple ci-dessus en une jolie structure de permalien. Ajoutons la fonction suivante à notre extension :

/**
 * Add rewrite tags and rules
 */
function myplugin_rewrite_tag_rule() {
	add_rewrite_tag( '%city%', '([^&]+)' );
	add_rewrite_rule( '^city/([^/]*)/?', 'index.php?city=$matches[1]','top' );
}
add_action('init', 'myplugin_rewrite_tag_rule', 10, 0);

Les fonctions add_rewrite_tag etadd_rewrite_rule font partie de la Rewrite API. add_rewrite_tag rend WordPress conscient de la variable de requête city, tandis que add_rewrite_rule indique une nouvelle règle de réécriture. Les deux fonctions doivent être connectées à l’action init. Grâce à de nouvelles balises et règles, nous pouvons envoyer l’URL suivante :

http://example.com/city/London/

WordPress retournera une archive des articles dont la valeur du champ personnalisé city est London.

Note : chaque fois qu’une nouvelle règle de réécriture est ajoutée, les permaliens WordPress doivent être rafraîchis à partir de l’écran Permaliens sous le menu Réglages.

Résumé

WordPress fournit un système complet pour gérer les permaliens. La plupart des fonctionnalités sont disponibles prêtes à l’emploi et sont accessibles depuis le panneau d’administration. Mais si nous avions besoin d’un contrôle plus approfondi sur les permaliens, tout un ensemble de hooks et de fonctions nous permettent d’ajouter des variables aux chaînes de requête, et de réécrire les URLs dans des permaliens WordPress accessibles et faciles à référencer.

Le code complet de cet article est disponible sur Gist.

12
Partages