💻 DéveloppementAvancé PS 1.6 PS 1.7 PS 8.x

Récupérer des variables dans les URLs simplifiées PrestaShop

Comment fonctionnent les URLs simplifiées PrestaShop, récupérer des paramètres dynamiques et créer des règles de réécriture personnalisées avec le Dispatcher.

En bref : Les URLs simplifiées PrestaShop reposent sur le Dispatcher qui utilise des expressions régulières pour extraire les identifiants de chaque URL. Pour ajouter des variables personnalisées, privilégiez le hook moduleRoutes dans un module plutôt que des règles .htaccess, afin de garantir la pérennité et la compatibilité avec la génération de liens.

Publié le 21 mars 2026 5 min de lecture Alexandre Carette

Récupérer des variables dans les URLs simplifiées PrestaShop

Les URLs simplifiées (friendly URLs) de PrestaShop transforment des adresses cryptiques comme index.php?id_product=42&controller=product en URLs lisibles telles que /tshirt-bleu-42.html. Ce mécanisme repose sur un système de routes internes qui associe chaque pattern d'URL à un contrôleur et à un identifiant. Lorsqu'on souhaite ajouter des paramètres personnalisés dans ces URLs, il faut comprendre en profondeur le fonctionnement du Dispatcher et des règles de réécriture.

Comment PrestaShop résout une URL simplifiée

Chaque type de page possède un schéma d'URL défini dans la table ps_meta et géré par la classe Dispatcher. Voici les routes par défaut :

Type de pageRoute par défautIdentifiant Produit`{category:/}{id}-{rewrite}.html``id_product` Catégorie`{id}-{rewrite}``id_category` CMS`content/{id}-{rewrite}``id_cms` Fournisseur`supplier/{id}-{rewrite}``id_supplier` Fabricant`brand/{id}-{rewrite}``id_manufacturer`

Le point essentiel : l'identifiant numérique est toujours présent dans l'URL, même en mode simplifié. C'est lui qui permet à PrestaShop de retrouver l'entité correspondante en base de données. Supprimer cet ID de l'URL nécessite un mécanisme de réécriture alternatif.

Le rôle du Dispatcher

Le Dispatcher (classe classes/Dispatcher.php) est le routeur central de PrestaShop. À chaque requête entrante, il :

  1. **Parse l'URL** en la comparant aux routes enregistrées via des expressions régulières
  2. **Extrait les variables** (ID, rewrite, etc.) depuis les segments de l'URL
  3. **Charge le contrôleur** approprié avec ces paramètres dans `$_GET`
  4. 
    // Exemple simplifié du fonctionnement interne du Dispatcher
    // Route : {id}-{rewrite}.html
    // URL reçue : 42-tshirt-bleu.html
    // Regex générée : ^([0-9]+)-([a-zA-Z0-9-]+)\.html$
    // Résultat : $_GET['id_product'] = 42
    

    Les routes sont définies dans Back Office > Préférences > SEO & URLs (PrestaShop 1.6/1.7) ou Back Office > Paramètres de la boutique > Trafic & SEO (PrestaShop 8.x).

    Ajouter un paramètre personnalisé dans une URL simplifiée

    Pour injecter une variable supplémentaire dans le schéma d'URL, trois approches sont possibles.

    Approche 1 : Modifier la route dans le back office

    PrestaShop permet d'utiliser des mots-clés prédéfinis dans les schémas de routes. Pour les produits par exemple, les mots-clés disponibles incluent {id}, {rewrite}, {ean13}, {category}, {reference}, {manufacturer_name}, etc.

    Si votre variable correspond à un mot-clé existant, il suffit de l'ajouter dans le schéma :

    
    {category}/{reference}-{rewrite}-{id}.html
    

    Cela produira une URL comme : /vetements/REF001-tshirt-bleu-42.html.

    Approche 2 : Enregistrer une route personnalisée via un module

    Pour des variables qui ne correspondent à aucun mot-clé existant, il faut enregistrer une route personnalisée dans un module via le hook moduleRoutes :

    
    // Dans votre module
    public function hookModuleRoutes()
    {
        return [
            'module-monmodule-mapage' => [
                'rule' => 'custom/{variable_custom}/{id_entity}',
                'controller' => 'mapage',
                'keywords' => [
                    'variable_custom' => [
                        'regexp' => '[a-zA-Z0-9_-]+',
                        'param' => 'variable_custom',
                    ],
                    'id_entity' => [
                        'regexp' => '[0-9]+',
                        'param' => 'id_entity',
                    ],
                ],
                'params' => [
                    'fc' => 'module',
                    'module' => 'monmodule',
                ],
            ],
        ];
    }
    

    Dans le contrôleur front du module, la variable est ensuite récupérable normalement :

    
    // Dans controllers/front/mapage.php
    $variableCustom = Tools::getValue('variable_custom');
    $idEntity = (int) Tools::getValue('id_entity');
    

    Approche 3 : Réécriture directe via .htaccess

    Pour des cas spécifiques où l'on souhaite transformer une URL externe en paramètres internes sans toucher au Dispatcher, on peut ajouter des règles dans le .htaccess avant les règles PrestaShop :

    
    # Règle personnalisée AVANT les règles PrestaShop
    # Transforme /mon-prefixe/valeur-param/42 en index.php?controller=product&id_product=42&custom=valeur-param
    RewriteRule ^mon-prefixe/([a-zA-Z0-9_-]+)/([0-9]+)$ index.php?controller=product&id_product=$2&custom=$1 [QSA,L]
    

    Attention : cette méthode est fragile car PrestaShop régénère le .htaccess lors de certaines opérations en back office. Pour pérenniser vos règles, utilisez plutôt l'approche module.

    Bonnes pratiques pour les URLs personnalisées

    Vider le cache des routes

    Après toute modification de route, il est impératif de :

    1. Vider le cache PrestaShop (Back Office > Paramètres avancés > Performances)
    2. Régénérer le `.htaccess` (SEO & URLs > cocher "URL simplifiée" et sauvegarder)
    3. 
      # Ou en ligne de commande (PrestaShop 8.x)
      php bin/console cache:clear --env=prod
      

      Valider les expressions régulières

      Une regex mal formée dans une route peut bloquer l'ensemble du site. Testez toujours vos patterns :

      
      // Test rapide d'une regex de route
      $pattern = '#^custom/([a-zA-Z0-9_-]+)/([0-9]+)$#';
      $url = 'custom/ma-variable/42';
      if (preg_match($pattern, $url, $matches)) {
          echo 'Variable : ' . $matches[1]; // ma-variable
          echo 'ID : ' . $matches[2];       // 42
      }
      

      Éviter les conflits de routes

      Les routes sont évaluées dans un ordre précis. Une route trop permissive (comme {rewrite} sans préfixe) peut capturer des URLs destinées à d'autres contrôleurs. Préfixez toujours vos routes personnalisées avec un segment unique.

      Cas pratique : URL sans ID numérique

      Certains marchands souhaitent supprimer l'ID des URLs pour des raisons esthétiques ou SEO. PrestaShop ne le supporte pas nativement car le Dispatcher a besoin de cet identifiant pour résoudre la page.

      La solution consiste à intercepter la requête en amont, résoudre le rewrite en ID via une requête en base, puis injecter l'ID dans $_GET :

      
      // Override de Dispatcher::dispatch() ou via un module
      public function hookActionDispatcher($params)
      {
          $rewrite = Tools::getValue('rewrite');
          if ($rewrite && !Tools::getValue('id_product')) {
              $id = Db::getInstance()->getValue(
                  'SELECT id_product FROM ' . _DB_PREFIX_ . 'product_lang
                   WHERE link_rewrite = "' . pSQL($rewrite) . '"
                   AND id_lang = ' . (int) Context::getContext()->language->id
              );
              if ($id) {
                  $_GET['id_product'] = (int) $id;
              }
          }
      }
      

      Inconvénient : cette approche ajoute une requête SQL supplémentaire par page et peut poser des problèmes en cas de doublons de link_rewrite. À utiliser avec précaution.

      Évolutions entre versions de PrestaShop

      VersionParticularités 1.6Routes dans `Dispatcher.php`, `.htaccess` seul 1.7Hook `moduleRoutes`, Symfony partiel (back office) 8.xSymfony complet en back office, `moduleRoutes` toujours valide en front, commandes console disponibles
#url-rewriting #dispatcher #htaccess #routing #seo

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.