💻 DéveloppementIntermédiaire PS 1.7 PS 8.x

Module PrestaShop qui se réenregistre sur un hook : diagnostic et solution

Votre module PrestaShop revient systématiquement sur un hook après désenregistrement ? Découvrez pourquoi et comment résoudre ce problème définitivement.

En bref : Quand un module PrestaShop revient systématiquement sur un hook après désenregistrement, c'est parce que sa méthode install() contient un registerHook() qui le réenregistre à chaque réinstallation. La solution : commenter cette ligne dans le fichier PHP du module, vérifier le rôle de ps_themecusto, et vider le cache.

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

Le problème : un module qui refuse de quitter son hook

Vous avez désenregistré un module d'un hook via le back-office PrestaShop, mais à chaque réinstallation, mise à jour ou vidage de cache, il revient se greffer automatiquement. C'est un comportement frustrant mais parfaitement explicable : la méthode install() du module contient un appel registerHook() qui re-greffe le module à chaque installation.

Ce cas est particulièrement fréquent avec les modules natifs comme ps_featuredproducts, ps_banner ou ps_customtext (anciennement ps_themecusto), qui s'enregistrent sur displayHome lors de leur installation.

Comprendre le mécanisme des hooks dans PrestaShop

Quand vous installez un module PrestaShop, sa méthode install() est exécutée. Cette méthode appelle généralement registerHook() pour associer le module aux hooks sur lesquels il doit intervenir.

Voici un exemple typique tiré de ps_featuredproducts :


public function install()
{
    $this->_clearCache('*');

    Configuration::updateValue('HOME_FEATURED_NBR', 8);
    Configuration::updateValue('HOME_FEATURED_CAT', (int) Context::getContext()->shop->getCategory());
    Configuration::updateValue('HOME_FEATURED_RANDOMIZE', false);

    return parent::install()
        && $this->registerHook('addproduct')
        && $this->registerHook('updateproduct')
        && $this->registerHook('deleteproduct')
        && $this->registerHook('categoryUpdate')
        && $this->registerHook('displayHome')
        && $this->registerHook('displayOrderConfirmation2')
        && $this->registerHook('displayCrossSellingShoppingCart')
        && $this->registerHook('actionAdminGroupsControllerSaveAfter');
}

Le problème est clair : chaque fois que ce module est réinstallé, registerHook('displayHome') est appelé, et le module réapparaît en page d'accueil.

Solution 1 : Commenter le `registerHook` dans la méthode `install()`

La méthode la plus propre consiste à modifier directement le fichier PHP du module pour empêcher l'enregistrement sur le hook indésirable.

Étapes

  1. Ouvrez le fichier principal du module (ex : `modules/ps_featuredproducts/ps_featuredproducts.php`)
  2. Localisez la méthode `install()`
  3. Commentez la ligne `registerHook` correspondant au hook que vous souhaitez supprimer :
  4. 
    return parent::install()
        && $this->registerHook('addproduct')
        && $this->registerHook('updateproduct')
        && $this->registerHook('deleteproduct')
        && $this->registerHook('categoryUpdate')
        // Désactivé volontairement : pas d'affichage en page d'accueil
        // && $this->registerHook('displayHome')
        && $this->registerHook('displayOrderConfirmation2')
        && $this->registerHook('displayCrossSellingShoppingCart')
        && $this->registerHook('actionAdminGroupsControllerSaveAfter');
    
    1. Désinstallez puis réinstallez le module depuis le back-office
    2. Videz le cache PrestaShop
    3. Important : ajoutez toujours un commentaire expliquant pourquoi le hook est désactivé. Un autre développeur (ou vous-même dans six mois) doit comprendre que c'est intentionnel.

      Solution 2 : Vider le cache manuellement

      Parfois, le hook semble revenir alors qu'il est bien désenregistré en base de données. C'est un problème de cache. PrestaShop met en cache la liste des hooks actifs.

      
      # Supprimez les dossiers de cache
      rm -rf var/cache/dev/*
      rm -rf var/cache/prod/*
      

      Sur PrestaShop 8.x, vous pouvez aussi utiliser la commande console :

      
      php bin/console cache:clear --env=prod
      

      Si le module n'est plus greffé après le vidage de cache, c'était simplement un affichage fantôme.

      Solution 3 : Vérifier le module `ps_themecusto`

      Le module ps_themecusto (Theme Customization) a un comportement parfois méconnu : il peut réenregistrer certains modules natifs sur leurs hooks par défaut lorsqu'il se réinitialise. C'est un mécanisme conçu pour garantir que le thème fonctionne correctement, mais qui peut interférer avec vos personnalisations.

      Si vous constatez que des modules natifs reviennent systématiquement sur des hooks après les avoir retirés :

      1. Désinstallez `ps_themecusto` depuis le back-office
      2. Vérifiez si le problème persiste
      3. Si le problème est résolu, vous pouvez soit laisser `ps_themecusto` désinstallé, soit le réinstaller après avoir appliqué la Solution 1
      4. Solution 4 (PrestaShop 8.x) : Utiliser le système de services Symfony

        Sur PrestaShop 8.x, les modules modernes peuvent déclarer leurs hooks via les fichiers de configuration Symfony plutôt que dans la méthode install(). Si vous développez un module personnalisé, privilégiez cette approche :

        
        # modules/mon_module/config/services.yml
        services:
          mon_module.hook_subscriber:
            class: MonModule\Hook\HookSubscriber
            tags:
              - { name: kernel.event_subscriber }
        

        Cette méthode offre un meilleur contrôle et évite les effets de bord liés aux réinstallations.

        Vérification en base de données

        Pour confirmer qu'un module est bien désenregistré d'un hook, vous pouvez vérifier directement en base de données :

        
        SELECT h.name AS hook_name, m.name AS module_name
        FROM ps_hook_module hm
        JOIN ps_hook h ON h.id_hook = hm.id_hook
        JOIN ps_module m ON m.id_module = hm.id_module
        WHERE m.name = 'ps_featuredproducts'
        ORDER BY h.name;
        

        Pour supprimer manuellement l'association :

        
        DELETE hm FROM ps_hook_module hm
        JOIN ps_hook h ON h.id_hook = hm.id_hook
        JOIN ps_module m ON m.id_module = hm.id_module
        WHERE m.name = 'ps_featuredproducts'
        AND h.name = 'displayHome';
        

        Attention : faites toujours un backup avant de modifier la base de données, et n'oubliez pas de vider le cache après.

        Bonnes pratiques pour éviter ce problème

        • **Documentez vos modifications** : si vous commentez un `registerHook`, notez-le dans un fichier de suivi ou un commentaire clair
        • **Utilisez des overrides plutôt que de modifier les fichiers natifs** : créez un override du module dans `override/modules/` pour survivre aux mises à jour
        • **Créez un module "hook manager"** : pour les projets complexes, un petit module qui désenregistre les hooks indésirables dans sa méthode `install()` est une solution élégante et maintenable
        • **Versionnez vos modifications** : utilisez Git pour tracer toute modification de module, même sur les modules natifs
#hooks #modules #ps_featuredproducts #displayHome #debug

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.