[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$f0yDJeF7XIN5IhjDucmtL-lKquRXBkKs8m6RH5lJdZKI":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":61,"megamenu":142,"$fIxr3Cj7_lcsVSXyLPhCVFL2fFUQAVs-cA7PxXbyqodc":198,"header-db":212,"footer-db":225},{"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",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":34,"psVersions":35,"content":39,"faq":40,"tldr":56,"readingTime":57,"generatedAt":58,"publishDate":58,"relatedArticles":59,"sourceCategory":60},"Activer la navigation à facettes sur la page d'accueil PrestaShop","navigation-facettes-page-accueil-prestashop","Comment intégrer le module de navigation à facettes sur la page d'accueil PrestaShop : override, redirection catégorie et hook personnalisé.","developpement",[28,29,30,31,32,33],"navigation à facettes","blocklayered","override","IndexController","hook","page accueil","avance",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Pourquoi la navigation à facettes ne s'affiche pas en page d'accueil\u003C\u002Fh2>\n\u003Cp>Le module de navigation à facettes de PrestaShop (anciennement \u003Ccode>blocklayered\u003C\u002Fcode>, devenu \u003Ccode>ps_facetedsearch\u003C\u002Fcode> à partir de la version 1.7) est conçu pour fonctionner exclusivement sur les pages catégorie. Il s'enregistre sur des hooks liés au contrôleur \u003Ccode>CategoryController\u003C\u002Fcode> et ne se déclenche tout simplement pas sur le contrôleur \u003Ccode>IndexController\u003C\u002Fcode> qui gère la page d'accueil.\u003C\u002Fp>\n\u003Cp>C'est un choix d'architecture logique : la page d'accueil n'est pas associée à une catégorie spécifique, donc le module n'a aucun contexte de filtrage à exploiter. Pourtant, de nombreux marchands souhaitent offrir une expérience de filtrage dès l'arrivée sur leur boutique, notamment pour les catalogues volumineux.\u003C\u002Fp>\n\u003Cp>Deux approches techniques permettent de contourner cette limitation.\u003C\u002Fp>\n\u003Ch2>Approche 1 : Redirection transparente vers une catégorie\u003C\u002Fh2>\n\u003Ch3>Le principe\u003C\u002Fh3>\n\u003Cp>La méthode la plus rapide consiste à rediriger la page d'accueil vers une page catégorie qui servira de vitrine. Le visiteur arrive sur votre URL racine et se retrouve automatiquement sur une catégorie contenant l'ensemble (ou une sélection) de vos produits, avec la navigation à facettes activée.\u003C\u002Fp>\n\u003Ch3>Implémentation par override\u003C\u002Fh3>\n\u003Cp>Créez un override du contrôleur \u003Ccode>IndexController\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cp>\u003Cstrong>PrestaShop 1.6 — Fichier : \u003Ccode>override\u002Fcontrollers\u002Ffront\u002FIndexController.php\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * Override IndexController — Redirige la page d'accueil vers une catégorie\n * avec navigation à facettes active.\n *\u002F\nclass IndexController extends IndexControllerCore\n{\n    public function initContent()\n    {\n        \u002F\u002F Remplacez 42 par l'ID de votre catégorie principale\n        $idCategory = 42;\n\n        Tools::redirect(\n            $this-&gt;context-&gt;link-&gt;getCategoryLink($idCategory)\n        );\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>PrestaShop 1.7 \u002F 8.x — Fichier : \u003Ccode>override\u002Fcontrollers\u002Ffront\u002FIndexController.php\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\nuse PrestaShop\\PrestaShop\\Adapter\\Presenter\\Category\\CategoryPresenter;\n\nclass IndexController extends IndexControllerCore\n{\n    public function initContent()\n    {\n        $idCategory = (int) Configuration::get('FACETED_HOME_CATEGORY_ID');\n\n        if ($idCategory &gt; 0) {\n            Tools::redirect(\n                $this-&gt;context-&gt;link-&gt;getCategoryLink($idCategory)\n            );\n        }\n\n        \u002F\u002F Fallback : comportement normal si aucune catégorie configurée\n        parent::initContent();\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Dans cette version améliorée, l'ID de catégorie est stocké en configuration plutôt qu'en dur, ce qui permet de le modifier depuis le back-office sans toucher au code.\u003C\u002Fp>\n\u003Ch3>Limites de cette approche\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**L'URL change** : le visiteur se retrouve sur `\u002Fma-categorie` au lieu de `\u002F`. Cela peut poser des problèmes de référencement si votre page d'accueil est bien positionnée.\u003C\u002Fli>\n\u003Cli>**Redirection 302 par défaut** : `Tools::redirect()` envoie une redirection temporaire. Pour le SEO, une 301 serait préférable si la redirection est permanente.\u003C\u002Fli>\n\u003Cli>**Perte du contenu homepage** : bannières, sliders et modules spécifiques à la page d'accueil disparaissent.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Approche 2 : Intégrer la navigation à facettes via un hook personnalisé\u003C\u002Fh2>\n\u003Cp>Cette méthode est plus élégante mais demande davantage de travail. L'idée est de permettre au module de filtrage de s'afficher directement sur la page d'accueil, en lui fournissant le contexte de catégorie dont il a besoin.\u003C\u002Fp>\n\u003Ch3>Étape 1 : Créer un hook personnalisé\u003C\u002Fh3>\n\u003Cp>Enregistrez un hook dédié dans votre thème. Dans le fichier \u003Ccode>index.tpl\u003C\u002Fcode> (PS 1.6) ou le template correspondant en 1.7\u002F8.x :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* PrestaShop 1.6 — index.tpl *}\n{hook h='displayHomeLayeredNavigation'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Pour PrestaShop 1.7 \u002F 8.x avec un thème basé sur Classic, ajoutez dans \u003Ccode>templates\u002Findex.tpl\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{hook h='displayHomeLayeredNavigation'}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 2 : Greffer le module sur ce hook\u003C\u002Fh3>\n\u003Cp>Modifiez le module \u003Ccode>ps_facetedsearch\u003C\u002Fcode> (ou \u003Ccode>blocklayered\u003C\u002Fcode> en 1.6). Dans la méthode \u003Ccode>install()\u003C\u002Fcode>, ajoutez l'enregistrement du hook :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function install()\n{\n    return parent::install()\n        && $this-&gt;registerHook('displayHomeLayeredNavigation')\n        \u002F\u002F ... autres hooks existants\n    ;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Puis créez la méthode de rendu :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookDisplayHomeLayeredNavigation($params)\n{\n    \u002F\u002F Définir la catégorie de contexte pour le filtrage\n    $idCategory = (int) Configuration::get('FACETED_HOME_CATEGORY_ID');\n\n    if (!$idCategory) {\n        $idCategory = (int) Configuration::get('PS_HOME_CATEGORY');\n    }\n\n    \u002F\u002F Simuler le contexte catégorie\n    $this-&gt;context-&gt;controller-&gt;php_self = 'category';\n    $_GET['id_category'] = $idCategory;\n\n    \u002F\u002F Appeler la logique de rendu standard du module\n    return $this-&gt;hookDisplayLeftColumn($params);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 3 : Gérer les requêtes AJAX\u003C\u002Fh3>\n\u003Cp>Le module de navigation à facettes fonctionne en AJAX pour le rechargement des produits. Il faut s'assurer que les appels AJAX passent bien le paramètre \u003Ccode>id_category\u003C\u002Fcode> pour que le filtrage fonctionne sur la page d'accueil.\u003C\u002Fp>\n\u003Cp>Dans le JavaScript du module, vérifiez que l'URL AJAX inclut l'ID de catégorie :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F Ajouter l'id_category aux requêtes AJAX si on est sur la homepage\nif (prestashop.page.page_name === 'index') {\n    var ajaxUrl = prestashop.urls.pages.category\n        + '?id_category=' + homeCategoryId\n        + '&from-xhr';\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Approche recommandée pour PrestaShop 8.x\u003C\u002Fh2>\n\u003Cp>Sur les versions récentes de PrestaShop, la solution la plus propre combine les deux approches :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Créez une catégorie \"Tous nos produits\"** contenant l'ensemble de votre catalogue.\u003C\u002Fli>\n\u003Cli>**Configurez `ps_facetedsearch`** pour cette catégorie avec les filtres souhaités.\u003C\u002Fli>\n\u003Cli>**Utilisez un module dédié** plutôt qu'un override pour intégrer le bloc de filtrage sur la homepage.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F\u002F Module ac_homefaceted — Exemple simplifié\nclass Ac_HomeFaceted extends Module\n{\n    public function install()\n    {\n        return parent::install()\n            && $this-&gt;registerHook('displayHome');\n    }\n\n    public function hookDisplayHome($params)\n    {\n        $idCategory = (int) Configuration::get('AC_HOME_FACETED_CATEGORY');\n\n        if (!$idCategory) {\n            return '';\n        }\n\n        $facetedSearch = Module::getInstanceByName('ps_facetedsearch');\n\n        if (!$facetedSearch || !$facetedSearch-&gt;active) {\n            return '';\n        }\n\n        \u002F\u002F Injecter le contexte catégorie\n        $this-&gt;context-&gt;controller-&gt;php_self = 'category';\n        $_GET['id_category'] = $idCategory;\n\n        return $facetedSearch-&gt;hookDisplayLeftColumn($params);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche modulaire respecte les bonnes pratiques PrestaShop : pas d'override fragile, configuration via le back-office, et compatibilité avec les mises à jour.\u003C\u002Fp>\n\u003Ch2>Bonnes pratiques et pièges à éviter\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>**Ne modifiez jamais le core du module** `ps_facetedsearch` directement. Utilisez un module compagnon ou un override du module.\u003C\u002Fli>\n\u003Cli>**Attention au cache** : le module de navigation à facettes utilise un système de cache agressif. Videz le cache après chaque modification (`Paramètres avancés > Performances > Vider le cache`).\u003C\u002Fli>\n\u003Cli>**SEO** : si vous redirigez la homepage vers une catégorie, configurez la balise canonique correctement pour éviter le contenu dupliqué.\u003C\u002Fli>\n\u003Cli>**Performances** : afficher la navigation à facettes sur la homepage avec un catalogue volumineux peut ralentir significativement le chargement. Limitez le nombre de filtres affichés.\u003C\u002Fli>\n\u003Cli>**Multilingue** : vérifiez que l'URL de redirection utilise `getCategoryLink()` qui gère automatiquement la langue courante, plutôt qu'une URL construite manuellement.\u003C\u002Fli>\n\u003C\u002Ful>",[41,44,47,50,53],{"q":42,"a":43},"Pourquoi le module de navigation à facettes ne fonctionne-t-il pas sur la page d'accueil PrestaShop ?","Le module ps_facetedsearch (anciennement blocklayered) est architecturalement lié au contrôleur CategoryController. Il a besoin d'un contexte de catégorie pour savoir quels produits filtrer et quels attributs proposer. Le contrôleur IndexController de la page d'accueil ne fournit pas ce contexte, ce qui empêche le module de s'initialiser. Pour l'activer, il faut soit rediriger vers une catégorie, soit injecter manuellement un contexte catégorie via un hook personnalisé.",{"q":45,"a":46},"Comment afficher les filtres produits sur la page d'accueil sans redirection ?","Il faut créer un module compagnon qui s'enregistre sur le hook displayHome et injecte un contexte de catégorie avant d'appeler le rendu du module ps_facetedsearch. Concrètement, le module définit l'ID de catégorie dans $_GET et modifie php_self du contrôleur pour simuler un contexte catégorie, puis délègue le rendu au module de filtrage. Cette approche évite la redirection et conserve les autres éléments de la page d'accueil.",{"q":48,"a":49},"La redirection de la page d'accueil vers une catégorie impacte-t-elle le SEO ?","Oui, potentiellement. Une redirection 302 (temporaire, utilisée par défaut par Tools::redirect) indique aux moteurs de recherche que la page d'accueil pourrait revenir. Si la redirection est permanente, utilisez une 301 en passant le paramètre à Tools::redirect. Dans tous les cas, assurez-vous que la balise canonique de la page catégorie cible est correctement configurée et que votre sitemap XML reflète cette architecture. L'idéal reste d'intégrer les facettes directement sur la homepage sans redirection.",{"q":51,"a":52},"Cette technique fonctionne-t-elle avec PrestaShop 8.x et le module ps_facetedsearch ?","Oui, mais avec des adaptations. En PrestaShop 8.x, les overrides de contrôleurs sont toujours supportés mais déconseillés au profit des modules. Créez un module dédié qui utilise le hook displayHome pour injecter le contexte de catégorie. Le module ps_facetedsearch en version 3.x utilise Elasticsearch sur certaines configurations, vérifiez donc que votre implémentation est compatible avec le moteur de recherche configuré.",{"q":54,"a":55},"Comment choisir la catégorie à afficher avec la navigation à facettes en page d'accueil ?","Créez une catégorie dédiée (par exemple « Tous nos produits ») qui contient l'intégralité de votre catalogue, ou choisissez votre catégorie racine (souvent ID 2 par défaut). Stockez cet ID en configuration PrestaShop via Configuration::updateValue() plutôt qu'en dur dans le code. Configurez ensuite les filtres souhaités pour cette catégorie dans les paramètres du module ps_facetedsearch, en limitant le nombre de filtres pour préserver les performances.","Le module de navigation à facettes PrestaShop ne fonctionne pas sur la page d'accueil car il nécessite un contexte de catégorie. Deux solutions : rediriger la homepage vers une catégorie via un override d'IndexController, ou créer un module compagnon qui injecte le contexte catégorie et délègue le rendu au module de filtrage.",5,"2026-03-21T16:47:41.000Z",[],"PrestaShop pour les développeurs",{"columns":62},[63,79,109,130],{"title":64,"links":65},"Plateforme",[66,70,73,76],{"label":67,"href":68,"external":69},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":71,"href":72,"external":69},"Devenir Ambassadeur","\u002Fambassadeur",{"label":74,"href":75,"external":69},"Modules PrestaShop","\u002Fmodules",{"label":77,"href":78,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":80,"links":81},"Le Synedre",[82,85,88,91,94,97,100,103,106],{"label":83,"href":84,"external":69},"L'histoire","\u002Fsynedre",{"label":86,"href":87,"external":69},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":89,"href":90,"external":69},"L'équipe","\u002Fequipe",{"label":92,"href":93,"external":69},"Le réacteur en direct","\u002Freacteur",{"label":95,"href":96,"external":69},"Le Drill (entraînement)","\u002Fdrill",{"label":98,"href":99,"external":69},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":101,"href":102,"external":69},"Les agents IA","\u002Fagents-ia",{"label":104,"href":105,"external":69},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":107,"href":108,"external":69},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":110,"links":111},"Ressources",[112,115,118,121,124,127],{"label":113,"href":114,"external":69},"Blog","\u002Fblog",{"label":116,"href":117,"external":69},"Academy","\u002Facademy",{"label":119,"href":120,"external":69},"Dictionnaire","\u002Fdictionnaire",{"label":122,"href":123,"external":69},"Expertise PrestaShop","\u002Fexpertise",{"label":125,"href":126,"external":69},"Flywheel","\u002Fflywheel",{"label":128,"href":129,"external":69},"Manifeste","\u002Fmanifeste",{"title":131,"links":132},"À propos",[133,136,139],{"label":134,"href":135,"external":69},"Alexandre Carette","\u002Fa-propos",{"label":137,"href":138,"external":69},"Dossier de presse","\u002Fpresse",{"label":140,"href":141,"external":69},"Contact","\u002Fcontact",{"items":143},[144,153,159,165,173,181,186,192],{"id":145,"type":146,"label":147,"href":123,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":150,"children":151,"psChildren":152},41,"link",{"fr":148},"Expertise",null,0,[],[],{"id":154,"type":146,"label":155,"href":114,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":156,"children":157,"psChildren":158},42,{"fr":113},1,[],[],{"id":160,"type":146,"label":161,"href":75,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":162,"children":163,"psChildren":164},43,{"fr":74},2,[],[],{"id":166,"type":146,"label":167,"href":169,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":170,"children":171,"psChildren":172},44,{"fr":168},"Outils IA","\u002Foutils-ia",3,[],[],{"id":174,"type":146,"label":175,"href":68,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":177,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":178,"children":179,"psChildren":180},45,{"fr":176},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":182,"type":146,"label":183,"href":117,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":57,"children":184,"psChildren":185},46,{"fr":116},[],[],{"id":187,"type":146,"label":188,"href":135,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":189,"children":190,"psChildren":191},47,{"fr":131},6,[],[],{"id":193,"type":146,"label":194,"href":141,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":195,"children":196,"psChildren":197},48,{"fr":140},7,[],[],{"academy":199,"blog":200,"expertise":211},[],[201,205,208],{"title":202,"url":203,"score":156,"type":204},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":206,"url":207,"score":156,"type":204},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":209,"url":210,"score":156,"type":204},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":213},{"logo":214,"topBar":219,"contactEmail":222,"features":223,"navBar":149},{"src":215,"alt":216,"text":134,"href":217,"class":218},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":149,"showLanguages":69,"align":220,"languages":221},"left",[],"contact@alexandrecarette.fr",{"showSearch":69,"showWishlist":69,"showLogin":20,"showContact":69,"showCart":69,"stickyHeader":20,"headerLayout":224},"inline",{"footer":226},{"theme":227,"description":149,"hours":149,"logo":228,"contact":229,"social":230,"bottomBar":240},"dark",{"src":215,"href":217,"alt":134},{"email":149,"phone":149,"address":149,"cta":149},[231,234,237],{"platform":232,"href":233,"label":232},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":235,"href":236,"label":235},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":238,"href":239,"label":238},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":149}]