Conflit de règles de réécritures ? Suivez le (petit) guide

Conflit de règles de réécritures ? Suivez le (petit) guide

Il peut arriver que vous ayez besoin d’avoir à la fois un terme de catégorie (ou tout autre taxonomie) et une page qui a le même nom, même slug ou identifiant.

Pour 2 pages ou 2 termes, cela ne pose pas de soucis à WordPress car il va vous forcer à ajouter le fameux « -2 » en fin d’URL. Mais dans le cas de types de contenus différents, c’est un autre problème.

Riryte roul’z?

Regardons rapidement ces règles de réécritures. Déjà, il faut savoir qu’elles se trouvent dans la base de données dans l’entrée « rewrite_rules » sous forme d’un tableau sérialisé (serialized array).

Aperçu des règles de réécritures
Aperçu des règles de réécritures

Pour les voir de cette façon dans l’interface de WordPress, j’utilise l’extension « Rewrite Rules Inspector » créée par Automattic & Daniel Bachhuber (des valeurs sûres !).

On peut donc filtrer par type, mot clé etc, ici j’ai choisi d’y mettre ma page « /partenaires« , 3 résultats donc.

Le problème

Mon soucis ici est que la règle des pages arrive en priorité après la règle de mon développement sur les « partenaires ». Dans le code de cette déclaration, il y a fort à parier que la priorité a été mise par défaut à « top », la plus haute et donc va prendre la main, chose que je regrette.

Alors je peux modifier mon développement, et demander un Flush de ces règles en visitant simplement la page des permaliens ou en cliquant sur « Flush Rules » dans la page du plugin cité.

Le bouton « Flush Rules » de RRI

Mais imaginons que ce n’est PAS mon dev, et/ou que je ne peux pas le retoucher. C’est un cas qui m’est déjà arrivé, et qui vous arrive (sinon vous ne seriez pas là n’est-ce pas ?).

Les solutions

Il existe alors plusieurs solutions pour y remédier :

La base de données

On peut directement aller modifier le tableau en base pour remettre au dessus notre règle. Mais au prochain flush, il y a de fortes chances que ça revienne dessous, et puis, modifier un array directement en bas est risqué…

Le dev

Avec un peu de code on peut réécrire notre règle avec la prio 1 et forcer un flush et ça à chaque chargement de page du site, ok bon donc non, on évite ça, les perfs vont être horribles.

Le bon dev

Avec un peu de code et de réflexion, on ne va le faire que lorsque les règles sont flush ! Comme ça, les perfs sont OK, et si ça bouge, on reste dessus. Utilisons le hook « rewrite_rules_array« .

<?php
add_filter( 'rewrite_rules_array', 'secupress_prioritize_page_rewrite_rules' );
function secupress_prioritize_page_rewrite_rules( $rules ) {
$priority_rules = [
'(.?.+?)/page/?([0-9]{1,})/?$'
'(.?.+?)(?:/([0-9]+))?/?$',
];

$priority_rules = array_reverse( $priority_rules );
foreach ( $priority_rules as $priority_rule ) {
if ( array_key_exists( $priority_rule, $rules ) ) {
$priority_rule_value = $rules[ $priority_rule ];
unset( $rules[ $priority_rule ] );
$rules = [ $priority_rule => $priority_rule_value ] + $rules;
}
}

return $rules;
}

J’utilise un array pour $priority_rules comme ça je peux en mettre plusieurs, je les mets dans l’order des priorités que je souhaite (je fais un array_reverse() après !) et voilà.

Je vais donc aller chercher si la règle que je veux faire remonter existe, si oui, je l’enlève puis je concatène ma règle avec le reste du tableau.

Une fois ce code mis en place (dans un mu-plugin par exemple), je refais un Flush Rules et…

C’est tout !

Vous aimez ? Partagez !


Réagir à cet article

220 caractères maximum