[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":22,"megamenu":103,"header-db":160,"$fXCTDCMD6KjyFelgYhFhTftpy5JwYwLL3xFlE6Jss2yI":173,"footer-db":209,"$fTt3b4Qkd0fpJOO-h-QKx4uxW_y9kJ3rbD5g0Aea8V5U":226},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"columns":23},[24,40,70,91],{"title":25,"links":26},"Plateforme",[27,31,34,37],{"label":28,"href":29,"external":30},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":32,"href":33,"external":30},"Devenir Ambassadeur","\u002Fambassadeur",{"label":35,"href":36,"external":30},"Modules PrestaShop","\u002Fmodules",{"label":38,"href":39,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":41,"links":42},"Le Synedre",[43,46,49,52,55,58,61,64,67],{"label":44,"href":45,"external":30},"L'histoire","\u002Fsynedre",{"label":47,"href":48,"external":30},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":50,"href":51,"external":30},"L'équipe","\u002Fequipe",{"label":53,"href":54,"external":30},"Le réacteur en direct","\u002Freacteur",{"label":56,"href":57,"external":30},"Le Drill (entraînement)","\u002Fdrill",{"label":59,"href":60,"external":30},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":62,"href":63,"external":30},"Les agents IA","\u002Fagents-ia",{"label":65,"href":66,"external":30},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":68,"href":69,"external":30},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":71,"links":72},"Ressources",[73,76,79,82,85,88],{"label":74,"href":75,"external":30},"Blog","\u002Fblog",{"label":77,"href":78,"external":30},"Academy","\u002Facademy",{"label":80,"href":81,"external":30},"Dictionnaire","\u002Fdictionnaire",{"label":83,"href":84,"external":30},"Expertise PrestaShop","\u002Fexpertise",{"label":86,"href":87,"external":30},"Flywheel","\u002Fflywheel",{"label":89,"href":90,"external":30},"Manifeste","\u002Fmanifeste",{"title":92,"links":93},"À propos",[94,97,100],{"label":95,"href":96,"external":30},"Alexandre Carette","\u002Fa-propos",{"label":98,"href":99,"external":30},"Dossier de presse","\u002Fpresse",{"label":101,"href":102,"external":30},"Contact","\u002Fcontact",{"items":104},[105,114,120,126,134,142,148,154],{"id":106,"type":107,"label":108,"href":84,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":111,"children":112,"psChildren":113},41,"link",{"fr":109},"Expertise",null,0,[],[],{"id":115,"type":107,"label":116,"href":75,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":117,"children":118,"psChildren":119},42,{"fr":74},1,[],[],{"id":121,"type":107,"label":122,"href":36,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":123,"children":124,"psChildren":125},43,{"fr":35},2,[],[],{"id":127,"type":107,"label":128,"href":130,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":131,"children":132,"psChildren":133},44,{"fr":129},"Outils IA","\u002Foutils-ia",3,[],[],{"id":135,"type":107,"label":136,"href":29,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":138,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":139,"children":140,"psChildren":141},45,{"fr":137},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":143,"type":107,"label":144,"href":78,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":145,"children":146,"psChildren":147},46,{"fr":77},5,[],[],{"id":149,"type":107,"label":150,"href":96,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":151,"children":152,"psChildren":153},47,{"fr":92},6,[],[],{"id":155,"type":107,"label":156,"href":102,"icon":110,"description":110,"badge":110,"groupTitle":110,"style":110,"gridColumns":110,"cssClass":110,"psCategoryId":110,"showPsChildren":30,"position":157,"children":158,"psChildren":159},48,{"fr":101},7,[],[],{"header":161},{"logo":162,"topBar":167,"contactEmail":170,"features":171,"navBar":110},{"src":163,"alt":164,"text":95,"href":165,"class":166},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":110,"showLanguages":30,"align":168,"languages":169},"left",[],"contact@alexandrecarette.fr",{"showSearch":30,"showWishlist":30,"showLogin":20,"showContact":30,"showCart":30,"showBlogLink":30,"showContactLink":30,"showGiftcardLink":30,"showStoresLink":30,"stickyHeader":20,"headerLayout":172},"inline",{"title":174,"slug":175,"metaDescription":176,"category":177,"tags":178,"difficulty":184,"psVersions":185,"content":188,"faq":189,"tldr":205,"readingTime":139,"generatedAt":206,"publishDate":206,"relatedArticles":207,"sourceCategory":208},"Module PrestaShop qui se réenregistre sur un hook : diagnostic et solution","module-prestashop-hook-revient-systematiquement-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.","developpement",[179,180,181,182,183],"hooks","modules","ps_featuredproducts","displayHome","debug","intermediaire",[186,187],"1.7","8.x","\u003Ch2>Le problème : un module qui refuse de quitter son hook\u003C\u002Fh2>\n\u003Cp>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 : \u003Cstrong>la méthode \u003Ccode>install()\u003C\u002Fcode> du module contient un appel \u003Ccode>registerHook()\u003C\u002Fcode> qui re-greffe le module à chaque installation\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>Ce cas est particulièrement fréquent avec les modules natifs comme \u003Ccode>ps_featuredproducts\u003C\u002Fcode>, \u003Ccode>ps_banner\u003C\u002Fcode> ou \u003Ccode>ps_customtext\u003C\u002Fcode> (anciennement \u003Ccode>ps_themecusto\u003C\u002Fcode>), qui s'enregistrent sur \u003Ccode>displayHome\u003C\u002Fcode> lors de leur installation.\u003C\u002Fp>\n\u003Ch2>Comprendre le mécanisme des hooks dans PrestaShop\u003C\u002Fh2>\n\u003Cp>Quand vous installez un module PrestaShop, sa méthode \u003Ccode>install()\u003C\u002Fcode> est exécutée. Cette méthode appelle généralement \u003Ccode>registerHook()\u003C\u002Fcode> pour associer le module aux hooks sur lesquels il doit intervenir.\u003C\u002Fp>\n\u003Cp>Voici un exemple typique tiré de \u003Ccode>ps_featuredproducts\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function install()\n{\n    $this-&gt;_clearCache('*');\n\n    Configuration::updateValue('HOME_FEATURED_NBR', 8);\n    Configuration::updateValue('HOME_FEATURED_CAT', (int) Context::getContext()-&gt;shop-&gt;getCategory());\n    Configuration::updateValue('HOME_FEATURED_RANDOMIZE', false);\n\n    return parent::install()\n        && $this-&gt;registerHook('addproduct')\n        && $this-&gt;registerHook('updateproduct')\n        && $this-&gt;registerHook('deleteproduct')\n        && $this-&gt;registerHook('categoryUpdate')\n        && $this-&gt;registerHook('displayHome')\n        && $this-&gt;registerHook('displayOrderConfirmation2')\n        && $this-&gt;registerHook('displayCrossSellingShoppingCart')\n        && $this-&gt;registerHook('actionAdminGroupsControllerSaveAfter');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le problème est clair : chaque fois que ce module est réinstallé, \u003Ccode>registerHook('displayHome')\u003C\u002Fcode> est appelé, et le module réapparaît en page d'accueil.\u003C\u002Fp>\n\u003Ch2>Solution 1 : Commenter le `registerHook` dans la méthode `install()`\u003C\u002Fh2>\n\u003Cp>La méthode la plus propre consiste à modifier directement le fichier PHP du module pour empêcher l'enregistrement sur le hook indésirable.\u003C\u002Fp>\n\u003Ch3>Étapes\u003C\u002Fh3>\n\u003Col>\n\u003Cli>Ouvrez le fichier principal du module (ex : `modules\u002Fps_featuredproducts\u002Fps_featuredproducts.php`)\u003C\u002Fli>\n\u003Cli>Localisez la méthode `install()`\u003C\u002Fli>\n\u003Cli>Commentez la ligne `registerHook` correspondant au hook que vous souhaitez supprimer :\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-php\">\nreturn parent::install()\n    && $this-&gt;registerHook('addproduct')\n    && $this-&gt;registerHook('updateproduct')\n    && $this-&gt;registerHook('deleteproduct')\n    && $this-&gt;registerHook('categoryUpdate')\n    \u002F\u002F Désactivé volontairement : pas d'affichage en page d'accueil\n    \u002F\u002F && $this-&gt;registerHook('displayHome')\n    && $this-&gt;registerHook('displayOrderConfirmation2')\n    && $this-&gt;registerHook('displayCrossSellingShoppingCart')\n    && $this-&gt;registerHook('actionAdminGroupsControllerSaveAfter');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col>\n\u003Cli>Désinstallez puis réinstallez le module depuis le back-office\u003C\u002Fli>\n\u003Cli>Videz le cache PrestaShop\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Important :\u003C\u002Fstrong> 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.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Solution 2 : Vider le cache manuellement\u003C\u002Fh2>\n\u003Cp>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.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\n# Supprimez les dossiers de cache\nrm -rf var\u002Fcache\u002Fdev\u002F*\nrm -rf var\u002Fcache\u002Fprod\u002F*\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sur \u003Cstrong>PrestaShop 8.x\u003C\u002Fstrong>, vous pouvez aussi utiliser la commande console :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nphp bin\u002Fconsole cache:clear --env=prod\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Si le module n'est plus greffé après le vidage de cache, c'était simplement un affichage fantôme.\u003C\u002Fp>\n\u003Ch2>Solution 3 : Vérifier le module `ps_themecusto`\u003C\u002Fh2>\n\u003Cp>Le module \u003Ccode>ps_themecusto\u003C\u002Fcode> (Theme Customization) a un comportement parfois méconnu : il peut \u003Cstrong>réenregistrer certains modules natifs sur leurs hooks par défaut\u003C\u002Fstrong> 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.\u003C\u002Fp>\n\u003Cp>Si vous constatez que des modules natifs reviennent systématiquement sur des hooks après les avoir retirés :\u003C\u002Fp>\n\u003Col>\n\u003Cli>Désinstallez `ps_themecusto` depuis le back-office\u003C\u002Fli>\n\u003Cli>Vérifiez si le problème persiste\u003C\u002Fli>\n\u003Cli>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\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Solution 4 (PrestaShop 8.x) : Utiliser le système de services Symfony\u003C\u002Fh2>\n\u003Cp>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 \u003Ccode>install()\u003C\u002Fcode>. Si vous développez un module personnalisé, privilégiez cette approche :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">\n# modules\u002Fmon_module\u002Fconfig\u002Fservices.yml\nservices:\n  mon_module.hook_subscriber:\n    class: MonModule\\Hook\\HookSubscriber\n    tags:\n      - { name: kernel.event_subscriber }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette méthode offre un meilleur contrôle et évite les effets de bord liés aux réinstallations.\u003C\u002Fp>\n\u003Ch2>Vérification en base de données\u003C\u002Fh2>\n\u003Cp>Pour confirmer qu'un module est bien désenregistré d'un hook, vous pouvez vérifier directement en base de données :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nSELECT h.name AS hook_name, m.name AS module_name\nFROM ps_hook_module hm\nJOIN ps_hook h ON h.id_hook = hm.id_hook\nJOIN ps_module m ON m.id_module = hm.id_module\nWHERE m.name = 'ps_featuredproducts'\nORDER BY h.name;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Pour supprimer manuellement l'association :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nDELETE hm FROM ps_hook_module hm\nJOIN ps_hook h ON h.id_hook = hm.id_hook\nJOIN ps_module m ON m.id_module = hm.id_module\nWHERE m.name = 'ps_featuredproducts'\nAND h.name = 'displayHome';\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Attention :\u003C\u002Fstrong> faites toujours un backup avant de modifier la base de données, et n'oubliez pas de vider le cache après.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Bonnes pratiques pour éviter ce problème\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>**Documentez vos modifications** : si vous commentez un `registerHook`, notez-le dans un fichier de suivi ou un commentaire clair\u003C\u002Fli>\n\u003Cli>**Utilisez des overrides plutôt que de modifier les fichiers natifs** : créez un override du module dans `override\u002Fmodules\u002F` pour survivre aux mises à jour\u003C\u002Fli>\n\u003Cli>**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\u003C\u002Fli>\n\u003Cli>**Versionnez vos modifications** : utilisez Git pour tracer toute modification de module, même sur les modules natifs\u003C\u002Fli>\n\u003C\u002Ful>",[190,193,196,199,202],{"q":191,"a":192},"Pourquoi mon module PrestaShop revient-il sur un hook après l'avoir désactivé ?","La méthode install() du module contient un appel registerHook() qui réenregistre automatiquement le module sur le hook à chaque installation ou réinstallation. Pour résoudre ce problème définitivement, il faut commenter ou supprimer la ligne registerHook() correspondante dans le fichier PHP principal du module, puis désinstaller et réinstaller le module.",{"q":194,"a":195},"Comment empêcher ps_featuredproducts de s'afficher sur la page d'accueil PrestaShop ?","Ouvrez le fichier modules\u002Fps_featuredproducts\u002Fps_featuredproducts.php, localisez la méthode install() et commentez la ligne && $this->registerHook('displayHome'). Ensuite, désinstallez et réinstallez le module depuis le back-office, puis videz le cache. Le module conservera ses autres fonctionnalités (cross-selling, page de confirmation) sans s'afficher en page d'accueil.",{"q":197,"a":198},"Le module ps_themecusto peut-il réenregistrer des modules sur leurs hooks par défaut ?","Oui, le module ps_themecusto (Theme Customization) peut réinitialiser l'enregistrement de certains modules natifs sur leurs hooks par défaut. Si vous constatez que vos personnalisations de hooks sont écrasées régulièrement, essayez de désinstaller ps_themecusto pour vérifier s'il est responsable du problème.",{"q":200,"a":201},"Comment vérifier en base de données si un module est greffé sur un hook PrestaShop ?","Exécutez une requête SQL joignant les tables ps_hook_module, ps_hook et ps_module pour lister les associations hook\u002Fmodule. Par exemple : SELECT h.name, m.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 = 'nom_du_module'. Vous pouvez aussi supprimer l'association directement en base avec un DELETE, sans oublier de vider le cache ensuite.",{"q":203,"a":204},"Faut-il modifier les fichiers natifs PrestaShop ou utiliser un override pour les hooks ?","Il est préférable d'utiliser un override dans le dossier override\u002Fmodules\u002F plutôt que de modifier directement les fichiers natifs. Les modifications directes seront écrasées lors des mises à jour du module. Pour les projets complexes, une solution encore plus propre consiste à créer un petit module dédié qui désenregistre les hooks indésirables dans sa propre méthode install().","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.","2026-03-21T14:04:19.000Z",[],"PrestaShop pour les développeurs",{"footer":210},{"theme":211,"description":110,"hours":110,"logo":212,"contact":213,"social":214,"bottomBar":224,"newsletter":225},"dark",{"src":163,"href":165,"alt":95},{"email":110,"phone":110,"address":110,"cta":110},[215,218,221],{"platform":216,"href":217,"label":216},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":219,"href":220,"label":219},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":222,"href":223,"label":222},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":110},{"show":30,"title":110,"description":110,"placeholder":110,"ctaLabel":110,"consentText":110},{"academy":227,"blog":228,"expertise":239},[],[229,233,236],{"title":230,"url":231,"score":117,"type":232},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":234,"url":235,"score":117,"type":232},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":237,"url":238,"score":117,"type":232},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[]]