Tout savoir sur WordPress

Amusons-nous avec l’URL Rewriting et le passage de paramètres vers une page WordPress

Vous souhaitez passer des paramètres d’une page à l’autre via l’url en GET ? Dans WordPress c’est possible, mais ça fonctionne autrement. Cet article montre comment passer des paramètres en URL via WordPress en faisant une belle réecriture d’URL.

Transmettre des paramètres en URL, avec une URL propre réecrite

Admettons par exemple que vous ayez besoin de transmettre des paramètres dans l’URL quand vous utilisez un  template personnalisé dans votre plugin, comme vu dans mon précédent article. voici l’URL que vous souhaitez écrire :

monsite.fr/catalogue/reebok/crossfit-nano/rouge

Catalogue étant la page cible, reebok la marque du produit, Crossfit Nano la référence du produit et rouge la couleur du produit.

(Pour cet exemple précis on utilisera plutôt directement Woocommerce)

En voulant passer l’url en mode « moche » et direct, du genre :  catalogue&brand=reebok&product=crossfit-nano&color=red et en récupérant  $_GET ça ne marche pas ! C’est normal, WordPress a une façon bien à lui de gérer les choses, c’est plus propre et pas bien plus compliqué !

1. Créer une régle de réecriture d’URL

Tout d’abord, on déclare à WordPress une nouvelle règle de réecriture d’URL, pour avoir une URL bien propre !

Ajoutez au début de votre plugin ou functions.php :

add_action('init', 'add_my_rewrite');

Si vous êtes en POO, mettez cette ligne dans votre __construct. et écrivez :

add_action('init', array($this, 'add_my_rewrite'));

Plus loin, écrivez cette fonction :

function add_my_rewrite() {
  global $wp_rewrite;
  add_rewrite_tag('%brand%','([^&]+)');
  add_rewrite_tag('%product%','([^&]+)');
  add_rewrite_tag('%color%','([^&]+)');
  $wp_rewrite->add_rule('catalogue/([^/]+)/([^/]+)/([^/]+)','index.php?pagename=catalogue&brand=$matches[1]&product=$matches[2]&color=$matches[3]','top');

  $wp_rewrite->flush_rules();
}

Il faut d’abord déclarer chaque « paramètre » via la fonction add_rewrite_tag(). On ajoute ensuite la règle via add_rule(). Pour ceux qui ont déjà fait du rewrite en htaccess, vous noterez que c’est là à peu près la même logique :

  • on déclare l’url qui apparaitra sur le site. Chaque zone « changeante » (ici brand, product et color) étant remplacée par une expression régulière ([^/]+) qui représente tout type de contenu (lettres, chiffres, caractères)
  • en deuxième paramètre on donne à WordPress l’URL « sale » qui lui permettra de récupérer les paramètres. On utilise le tableau $matches[x] pour dire quel morceau ([^/]+) va avec quel paramètre. Attention : ce tableau démarre à 1 et non pas 0

Enfin on flush les règles de réecriture afin que WordPress prenne bien en compte cette règle.

Attention à vos nommages : évitez de créer un élément qui existe déjà (id de page ou de custom type) afin d’éviter tout conflit !

Important : Pour les pages et les customs post types

Pensez à changer « catalogue » ainsi que les paramètres lorsque vous copiez-collez ce code ! Cela se passe dans $wp_rewrite>add_rule(…) :

  • Si vous êtes dans une page : en plus de vos matches, mettez le paramètre pagename=slug_page
  • Si vous êtes dans un custom post type :  en plus de vos matches, mettez le paramètre post_type=slug_cpt

Sinon ça ne fonctionnera pas !

2. Récupérer les données ainsi transmises

Et là on n’utilisera pas du tout $_GET !

Vous connaissez peut être probablement la variable query_vars de WordPress qui contient tous les paramètres lui permettant d’exécuter sa boucle.

C’est dans cette variable que l’on va retrouver nos paramètres passés en URL !

// get parameters
global $wp_query;
$brand = $wp_query->query_vars['brand'];
$product = $wp_query->query_vars['product'];
$color = $wp_query->query_vars['color'];

Et voilà, vous pouvez maintenant faire une boucle personnalisée WordPress pour afficher le produit en question, ou faire tout ce que vous souhaitez avec ces paramètres !

Cet article a été mis à jour il y a 1690 jours - Il n'est peut être plus à jour !

Article écrit par Maxime BJ

Développeur, bloggeur et formateur Web spécialisé WordPress. 31 ans. Grenoblois. Co-fondateur de WPChef, l’organisme de formation WordPress.

Organisateur de WPInAlps, le meetup WordPress Grenoblois. Vous pouvez me rencontrer lors d’événements tels que WordCamp Paris et Europe. Traducteur Français de l’extension Advanced Custom Fields. Également développeur d’applications web avec MeteorJs. Je m’occupe un site pour apprendre l’informatique aux débutants gratuitement.

J’aime les jeux vidéo, la rando, la bouffe bien grasse et les voyages.

16 Commentaires

  1. Merci pour ce tuto. Quand tu parles de catalogue, est-ce bien une page existante ? J’essaie d’utiliser ton code pour un plugin. Au lieu d’écrire /projets/?choix=1, j’aimerais bien avoir /projets/1/ mais cela ne fonctionne pas. Peux-tu m’éclairer ? Ainsi, je pourrais remplacer toutes les variables plus joliment. Merci

  2. Salut

    Dans mon exemple en effet j’ai préalablement crée une page catalogue depuis l’admin WordPress.
    (Mon article précédent http://www.dysign.fr/utiliser-vos-templates-de-page-dans-plugin-wordpress/ explique comment on peut faire une page « programmée » depuis un plugin et ces deux techniques peuvent très bien fonctionner ensemble)

    Le fait de faire la bonne pratique avec WP va te permettre d’éviter le ?choix=1 tout vilain :

    add_rewrite_tag(‘%choix%’,'([^&]+)’);
    $wp_rewrite->add_rule(‘tapage/([^/]+)/’,’index.php?pagename=tapage&choix=$matches[1]’,’top’);

    avec ça tu devrais t’en sortir : on crée une règle pour dire que quand l’url tapage/1 est appelée lui en fait derrière il reconverti et obtient index.php?pagename=tapage&choix=1

    ça devrait fonctionner direct ! n’hésites pas à me contacter par mail aussi si ça ne fonctionne pas

  3. Bonjour Maxime,
    Merci pour ces infos ; ça marche presque parfaitement chez moi (MAMP) : les paramètres sont bien passés et je les récupère parfaitement dans la page de destination. En revanche l’URL n’est pas réécrite et c’est la « sale » qui s’affiche, inexorablement… Aurais-tu une idée ? Merci d’avance

  4. Un grand merci pour ton tuto. Depuis le temps que je cherchais comment faire sans rien trouver. Tu m’as sortis une grande épine du pieds

    Merci

    • J’ai pas mal galéré la première fois aussi, du coup je me suis dit que si ça pouvait éviter d’autres de galérer tant mieux !

  5. Bonjour Maxime,

    J’ai essayé de mettre en oeuvre ton tuto, mais j’avoue que je galère pas mal étant novice en réécriture d’URL.

    J’explique ce que je veux faire :

    J’ai une page PHP que j’ai développé qui nécessitent des paramètres en GET pour fonctionner.

    J’ai créé un template de page nommé page_Statistiques.php qui include ma page stat_joueurs.php que j’ai développé de mes mains
    Je créé une page WP utilisant le template et nommée « statistiques ».

    Dans le template, pour ajouter les paramètres dans le query_vars, j’ai ajouté ce code :

    add_action(‘init’,’add_my_rewrite_Stat’);
    function add_my_rewrite_Stat() {
    global $wp_rewrite;
    add_rewrite_tag(‘%type%’,'([^&]+)’);
    add_rewrite_tag(‘%choix%’,'([^&]+)’);
    add_rewrite_tag(‘%filtre%’,'([^&]+)’);
    $wp_rewrite->add_rule(‘statistiques/([^/]+)/([^/]+)/([^/]+)/’,’index.php?pagename=statistiques&type=$matches[1]&choix=$matches[2]&filtre=$matches[3]’,’top’);

    $wp_rewrite->flush_rules();
    }

    Ensuite, toujours dans le template, je récupère le contenu des paramètres via :
    global $wp_query;

    $type = $wp_query->query_vars[‘type’];
    $Choix = $wp_query->query_vars[‘choix’];
    $Filtre = $wp_query->query_vars[‘filtre’];

    Puis j’exécute ma page stat_joueurs.php
    mais rien ne fonctionne.

    Je fais un print_r du query_var et mes paramètres type,Choix,Filtre ne sont pas présents.

    Peux tu me dire ce que j’ai raté par rapport à ton tuto?
    Je te remercie d’avance
    François

    • Salut ! A priori je dirais :
      le code pour les rewrite doit être placé dans functions.php et pas dans le template.
      Deuxième chose : je pense que le pagename devrait être page_statistique et pas juste statistique. Essaye déjà comme ça et dis-moi ce que ça te donne ?

    • Bonjour Maxime,

      Merci de ta réponse rapide.

      En ce qui concerne le code rewrite dans le function.php, j’avais déjà essayé dans celui de wordpress et dans celui de mon thème.

      page_statistiques est le nom de mon template de page. Ce que tu me dis, c’est que ma page WP doit être nommée page_statistiques?? ok je vais essayer ça.

      Je te tiens au courant

      François

    • Maxime,

      J’ai fait ce que tu m’as dit mais cela ne change rien.

      Est-ce que le add_action doit être dans le functions.php ou dans le template de page?

      J’avoue que je sèche la.

      François

  6. Bonjour,
    Merci pour le tuto, cependant je rencontre un souci : la page est introuvable.
    J’ai une page liste_exposant avec un tableau contenant tous les exposants, et je souhaiterais au clic sur l’un arriver sur sa fiche, une page fiche_exposant.
    J’ai donc dans la page liste_exposant un lien de type http://monsite.fr/fiche_exposant/ contenant en paramètre l’id de l’exposant.
    Dans le function.php de mon thème, j’ai bien :
    add_action(‘init’, ‘add_my_rewrite’);
    function add_my_rewrite() {
    global $wp_rewrite;
    add_rewrite_tag(‘%choix%’,'([^&]+)’);
    $wp_rewrite->add_rule(‘fiche_exposant/([^/]+)/’,’index.php?pagename=fiche_exposant&choix=$matches[1]’,’top’);
    $wp_rewrite->flush_rules();
    //print_r ($wp_rewrite);
    }
    Le print_r fonctionne et m’affiche :
    [fiche_exposant/([^/]+)/] => index.php?pagename=fiche_exposant&choix=$matches[1]
    donc ça a l’air ok.

    Ensuite dans la page fiche_exposant, j’ai ajouté au début :
    global $wp_query;
    $id = $wp_query->query_vars[‘choix’];

    Et ensuite j’ai une requête avec cet id pour afficher les infos de l’exposant.

    Quand je clique sur le lien j’arrive bien sur : http://monsite.fr/fiche_exposant/B27860 mais j’ai Oops! That page can’t be found.

    Je ne sais pas trop où se situe l’erreur, merci pour votre aide.

  7. slt, et cool ce tuto sans utiliser le htaccess.
    j’ essai désespérément de passer un url rewriting avec htaccess sans succès

    voila j’ utilise un script qui m’évite d’afficher « veuillez saisir un commentaire » par défaut de wordpress et ainsi bénéficier de mon
    design.
    dans l ‘adresse url j’ ai « /du_son/wp-comments-post.php » alors que je voudais « /erreur-commentaire », par exemple
    mais je n’y arrive pas même avec ton tuto.

    Que peux tu me conseiller

  8. Bonjour Maxime,
    En utilisant ton tuto, cela veut dire que je pourrai mixer mais custom taxonomy ?
    Exemple un url > Destination : Ile de France & Catégorie : Bière ?
    Si oui, j’ai des questions (mais peut être que ça sort du contexte de ton tuto)
    1/ Comment générer autant de pages qu’il y a de croisement dynamique ?
    2/ Est ce que ces pages sont alors indexées ? (j’aimerais bien ;-) ) ou comment faire pour que ca le soit ?
    3/ Comment je peux générer une description pour chaque page ?
    Merci, et bonnes fêtes.
    A bientôt

    • Oui aucun souci tu vas pouvoir le faire normalement en créant une url a plusieurs paramètres que tu rediriges sur archives et là en fonction des paramètres passés tu modifies ta loop principale avec pre_get_post.
      chaque URL sera indexée par Google (ce serait bien de faire des liens en dur depuis le site vers ces URLS) car comme ce ne sont pas des « pages » dans WP il ne les trouvera pas.
      Pour la descriptiion il faudra que tu l’écrives toi dans le php (meta) à priori.

      Après si le SEO est important je ferais comme ça : créer une page WP standard avec un modèle de page dans lequel je fais une loop spéciale qui contient les paramètres. ça donnera une landing page par expression croisé (avec un texte, la liste des articles…). la page est vue par Yoast, tu pourras ajouter d’autres champs que juste la liste des éléments, et ce sera plus riche

      Je te propose de rejoindre notre Slack WPFR et on en parle plus en détails !

  9. Merci pour l’article c’est super cool :) je vais essayer de suivre tout ça à lettre et éviter de tout faire péter ^^

c941f7a462fccd583795a315ca1b93aeyyyyyyyyyyyyy