[WordPress] Comment créer ses « Pretty Permalinks » personnels sur son blog ?

 

WordPress est une plateforme de blogging formidable. Très extensible, elle permet d’ajouter à peu près toutes les fonctionnalités que l’on veut, pour peu que l’on soit un peu curieux et que l’on sache coder en PHP (ou que l’on sache trouver les bons plugins).

Son API est riche, et permet beaucoup de chose très simplement, grâce à la mise à disposition par défaut de fonctions de haut niveau.

 

Introduction

L’une d’entre elles concerne la manière dont sont utilisées les adresses des pages et billets du blog. Les bidouilleurs connaissent la technique de l’URL Rewriting, notamment avec le serveur Web (Apache par exemple).

Mais WordPress possède également son module de redirection et d’URL Rewriting, que l’on utilise notamment via l’administration du blog (Réglages -> Permaliens) :

wordpress permaliens url rewriting 500x256 [WordPress] Comment créer ses Pretty Permalinks personnels sur son blog ?

Je passerais sur l’utilisation de cette partie des permaliens (très bien expliquée sur WordPress.org), pour me concentrer sur l’API et ses possibilités.

 

Les bases

Nota : Ce tutoriel n’est pas un cours sur PHP ou les expressions régulières.

Lorsqu’on écrit un thème ou un plugin, il arrive que l’on souhaite ajouter une règle de réécriture d’url. Avec WordPress, celle-ci ne sont pas stockées dans un fichier (comme le .htaccess de Apache) mais dans la base de données.

Pour connaitre les règles déjà en vigueur, il est possible de les faire afficher dans une page PHP :

global $wp_rewrite;
print_r($wp_rewrite->rewrite_rules());

Ce code va produire l’affichage suivant :

Array (
  [([0-9]{4})/([0-9]{1,2})/otw/([0-9]{1,})/page/([0-9]{1,})/?$] => index.php?year=$1&monthnum=$2&paged=$4&otw=$3
  [([0-9]{4})/([0-9]{1,2})/otw/([0-9]{1,})$] => index.php?year=$1&monthnum=$2&otw=$3
  [search/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$] => index.php?s=$1&otw=$2&paged=$3 [search/(.+?)/otw/([0-9]{1,})/?$] => index.php?s=$1&otw=$2
  [tag/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$] => index.php?tag=$1&otw=$2&paged=$3
  [tag/(.+?)/otw/([0-9]{1,})/?$] => index.php?tag=$1&otw=$2
  [category/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$] => index.php?category_name=$1&otw=$2&paged=$3
  [category/(.+?)/otw/([0-9]{1,})/?$] => index.php?category_name=$1&otw=$2
  [otw/([0-9]{1,})/page/([0-9]{1,})/?$] => index.php?&otw=$1&paged=$2
  [otw/([0-9]{1,})/?$] => index.php?&otw=$1
  [ontheweb/.+?/attachment/([^/]+)/?$] => index.php?attachment=$1
  [ontheweb/.+?/attachment/([^/]+)/trackback/?$] => index.php?attachment=$1&tb=1
  [ontheweb/.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$1&feed=$2
  [ontheweb/.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$1&feed=$2
  [ontheweb/.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$1&cpage=$2
  [ontheweb/(.+?)/trackback/?$] => index.php?ontheweb=$1&tb=1
  ...

 
Bref, tout ces hiéroglyphes représentent les règles qui s’appliquent sur votre blog. Et il y en a bien d’autres. Pour en rajouter, vous avez plusieurs options.

 

Le cas simple

La plus simple, pour une une règle « classique » est la suivante :

add_action('generate_rewrite_rules', 'new_permalink_rule');
function new_permalink_rule() {
	global $wp_rewrite;

        //ajout de la règle de templating
	$wp_rewrite->add_rewrite_tag('%otw%', '([0-9]{1,})', 'otw=');
        //définition de la forme de l'url
	$url_structure = $wp_rewrite->root . "otw/'%otw%'/";
        //génération des règles
	$my_rewrite_rules = $wp_rewrite->generate_rewrite_rules($url_structure);
        // ajout des règles créés aux existantes
	$wp_rewrite->rules = $my_rewrite_rules + $wp_rewrite->rules;

	return $wp_rewrite->rules;
}

Ce code va produire les règles « classiques » et par défaut dont je parlais, qui sont les suivantes :

[otw/([0-9]{1,})/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?otw=$1&feed=$2
[otw/([0-9]{1,})/(feed|rdf|rss|rss2|atom)/?$] => index.php?otw=$1&feed=$2
[otw/([0-9]{1,})/page/?([0-9]{1,})/?$] => index.php?otw=$1&paged=$2
[otw/([0-9]{1,})/?$] => index.php?otw=$1

La plupart du temps, elles suffisent car elles sont assez génériques (du point de vue de WordPress).

Notez qu’avec ce code, les règles créées sont ajoutées avant les règles existantes. C’est très important si vous avez des règles plus particulières que l’existant, car une fois une règle appliquées, la redirection s’arrête.

 
Dans cet exemple, je crée des règles de redirection pour des urls de la forme suivante :

http://blog.websourcing.fr/otw/123/xxxx

otw est un paramètre que j’ai implémenté sur le blog, qui me sert à récupérer le numéro de page de la rubrique « Sur Le Web ». Aurapavant, mes urls étaient plutôt de la forme suivante :

http://blog.websourcing.fr/xxxx?otw=123

Rien de rédhibitoire mais ces urls ne permettent pas le caching des pages, notamment avec le plugin W3 Total Cache sur un serveur standard.

Nota : Pour que ces nouvelles règles s’appliquent, il faut aller sur la page Réglages -> Permaliens et cliquer sur « enregistrer les modifications ». C’est d’ailleurs tout le temps le cas.

 
Le petit truc en plus : Comment récupérer la valeur ainsi renvoyé avec WordPress ?

Il vous suffit d’ajouter le code suivant (toujours dans functions.php) :

function query_vars($public_query_vars) {
	$public_query_vars[] = "otw";
	return $public_query_vars;
}
add_filter('query_vars', 'query_vars');

La valeur sera incorporée dans la requête $wp_query (celle qui sert à afficher La Boucle notamment).
Ensuite dans votre plugin ou thème, un appel du type suivant suffit :

$otw = $wp_query->query_vars['otw'];

 

Les cas complexes

Mais il se peut que vous souhaitiez ajouter des règles beaucoup plus complexes, ou qui ne font pas partie de celle par défaut.

C’était mon cas avec mon thème, car j’ai toujours deux parties distinctes (« Sur le Blog » et « Sur le Web » par exemple sur la home), correspondants à deux boucles, avec deux paginations.

Mes urls sont en effet de la forme :

http://blog.websourcing.fr/otw/2/2010/08/page/12
http://blog.websourcing.fr/otw/2/search/xxx/page/5
http://blog.websourcing.fr/otw/2/tag/untag/page/8
http://blog.websourcing.fr/otw/2/category/unecategorie/page/12
http://blog.websourcing.fr/otw/2/page/3

Il me fallait donc d’autres règles. C’est ainsi que j’ai écrit la fonction suivante :

add_action('generate_rewrite_rules', 'new_permalink_rules');
function new_permalink_rules( $wp_rewrite )
{
   $new_rules = array(
      '([0-9]{4})/([0-9]{1,2})/otw/([0-9]{1,})/page/([0-9]{1,})/?$' => 'index.php?year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(4).'&otw='.$wp_rewrite->preg_index(3)
      ,'([0-9]{4})/([0-9]{1,2})/otw/([0-9]{1,})$' => 'index.php?year='.$wp_rewrite->preg_index(1).'&monthnum='.$wp_rewrite->preg_index(2).'&otw='.$wp_rewrite->preg_index(3)

      ,'search/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$' => 'index.php?s='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3)
      ,'search/(.+?)/otw/([0-9]{1,})/?$' => 'index.php?s='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2)

      ,'tag/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$' => 'index.php?tag='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3)
      ,'tag/(.+?)/otw/([0-9]{1,})/?$' => 'index.php?tag='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2)

     ,'category/(.+?)/otw/([0-9]{1,})/page/([0-9]{1,})/?$' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(3)
      ,'category/(.+?)/otw/([0-9]{1,})/?$' => 'index.php?category_name='.$wp_rewrite->preg_index(1).'&otw='.$wp_rewrite->preg_index(2)

      ,'otw/([0-9]{1,})/page/([0-9]{1,})/?$' => 'index.php?&otw='.$wp_rewrite->preg_index(1).'&paged='.$wp_rewrite->preg_index(2)
      ,'otw/([0-9]{1,})/?$' => 'index.php?&otw='.$wp_rewrite->preg_index(1)

   );

   $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}

Je vous laisse chercher à quelle url se rattache chaque règle.

En gros, on fait une redirection vers le contrôleur de WordPress (index.php) qui contient tout le code pour rediriger vers le bon template (home, search, category, …).

Ensuite, chaque paramètre est récupéré avec une expression régulière, puis retransmit de manière plus classique (otw=123) dans l’url réécrite.

On utilise pour cela l’instruction $wp_rewrite->preg_index(n) ou n est la n-ième partie de l’expression régulière de la règle qui s’applique.

Exemple:

'otw/([0-9]{1,})/?$' se lit

toute url contenant otw/ puis au moins un nombre, eventuellement suivi d’un slash.

et la redirection correspondante 'index.php?&otw='.$wp_rewrite->preg_index(1) renvoie vers la page index.php avec le paramètre otw ayant pour valeur le premier bloc ([0-9]{1,})

 
Voila, j’espère avoir été clair. Aidez vous du Codex WordPress, il est très riche et on y trouve tout.
Je ne fais pas de support en ligne. Mais je fais du consulting icon wink [WordPress] Comment créer ses Pretty Permalinks personnels sur son blog ?

Écrire ce genre d’article est long et fastidieux. N’hésitez pas à faire une clic sur les boutons de vote ou à partager.