Activer la navigation à facettes sur la page d'accueil PrestaShop
Comment intégrer le module de navigation à facettes sur la page d'accueil PrestaShop : override, redirection catégorie et hook personnalisé.
En bref : 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.
Pourquoi la navigation à facettes ne s'affiche pas en page d'accueil
Le module de navigation à facettes de PrestaShop (anciennement blocklayered, devenu ps_facetedsearch à 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 CategoryController et ne se déclenche tout simplement pas sur le contrôleur IndexController qui gère la page d'accueil.
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.
Deux approches techniques permettent de contourner cette limitation.
Approche 1 : Redirection transparente vers une catégorie
Le principe
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.
Implémentation par override
Créez un override du contrôleur IndexController :
PrestaShop 1.6 — Fichier : override/controllers/front/IndexController.php
<?php
/**
* Override IndexController — Redirige la page d'accueil vers une catégorie
* avec navigation à facettes active.
*/
class IndexController extends IndexControllerCore
{
public function initContent()
{
// Remplacez 42 par l'ID de votre catégorie principale
$idCategory = 42;
Tools::redirect(
$this->context->link->getCategoryLink($idCategory)
);
}
}
PrestaShop 1.7 / 8.x — Fichier : override/controllers/front/IndexController.php
<?php
use PrestaShop\PrestaShop\Adapter\Presenter\Category\CategoryPresenter;
class IndexController extends IndexControllerCore
{
public function initContent()
{
$idCategory = (int) Configuration::get('FACETED_HOME_CATEGORY_ID');
if ($idCategory > 0) {
Tools::redirect(
$this->context->link->getCategoryLink($idCategory)
);
}
// Fallback : comportement normal si aucune catégorie configurée
parent::initContent();
}
}
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.
Limites de cette approche
- **L'URL change** : le visiteur se retrouve sur `/ma-categorie` au lieu de `/`. Cela peut poser des problèmes de référencement si votre page d'accueil est bien positionnée.
- **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.
- **Perte du contenu homepage** : bannières, sliders et modules spécifiques à la page d'accueil disparaissent.
Approche 2 : Intégrer la navigation à facettes via un hook personnalisé
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.
Étape 1 : Créer un hook personnalisé
Enregistrez un hook dédié dans votre thème. Dans le fichier index.tpl (PS 1.6) ou le template correspondant en 1.7/8.x :
{* PrestaShop 1.6 — index.tpl *}
{hook h='displayHomeLayeredNavigation'}
Pour PrestaShop 1.7 / 8.x avec un thème basé sur Classic, ajoutez dans templates/index.tpl :
{hook h='displayHomeLayeredNavigation'}
Étape 2 : Greffer le module sur ce hook
Modifiez le module ps_facetedsearch (ou blocklayered en 1.6). Dans la méthode install(), ajoutez l'enregistrement du hook :
public function install()
{
return parent::install()
&& $this->registerHook('displayHomeLayeredNavigation')
// ... autres hooks existants
;
}
Puis créez la méthode de rendu :
public function hookDisplayHomeLayeredNavigation($params)
{
// Définir la catégorie de contexte pour le filtrage
$idCategory = (int) Configuration::get('FACETED_HOME_CATEGORY_ID');
if (!$idCategory) {
$idCategory = (int) Configuration::get('PS_HOME_CATEGORY');
}
// Simuler le contexte catégorie
$this->context->controller->php_self = 'category';
$_GET['id_category'] = $idCategory;
// Appeler la logique de rendu standard du module
return $this->hookDisplayLeftColumn($params);
}
Étape 3 : Gérer les requêtes AJAX
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 id_category pour que le filtrage fonctionne sur la page d'accueil.
Dans le JavaScript du module, vérifiez que l'URL AJAX inclut l'ID de catégorie :
// Ajouter l'id_category aux requêtes AJAX si on est sur la homepage
if (prestashop.page.page_name === 'index') {
var ajaxUrl = prestashop.urls.pages.category
+ '?id_category=' + homeCategoryId
+ '&from-xhr';
}
Approche recommandée pour PrestaShop 8.x
Sur les versions récentes de PrestaShop, la solution la plus propre combine les deux approches :
- **Créez une catégorie "Tous nos produits"** contenant l'ensemble de votre catalogue.
- **Configurez `ps_facetedsearch`** pour cette catégorie avec les filtres souhaités.
- **Utilisez un module dédié** plutôt qu'un override pour intégrer le bloc de filtrage sur la homepage.
- **Ne modifiez jamais le core du module** `ps_facetedsearch` directement. Utilisez un module compagnon ou un override du module.
- **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`).
- **SEO** : si vous redirigez la homepage vers une catégorie, configurez la balise canonique correctement pour éviter le contenu dupliqué.
- **Performances** : afficher la navigation à facettes sur la homepage avec un catalogue volumineux peut ralentir significativement le chargement. Limitez le nombre de filtres affichés.
- **Multilingue** : vérifiez que l'URL de redirection utilise `getCategoryLink()` qui gère automatiquement la langue courante, plutôt qu'une URL construite manuellement.
<?php
// Module ac_homefaceted — Exemple simplifié
class Ac_HomeFaceted extends Module
{
public function install()
{
return parent::install()
&& $this->registerHook('displayHome');
}
public function hookDisplayHome($params)
{
$idCategory = (int) Configuration::get('AC_HOME_FACETED_CATEGORY');
if (!$idCategory) {
return '';
}
$facetedSearch = Module::getInstanceByName('ps_facetedsearch');
if (!$facetedSearch || !$facetedSearch->active) {
return '';
}
// Injecter le contexte catégorie
$this->context->controller->php_self = 'category';
$_GET['id_category'] = $idCategory;
return $facetedSearch->hookDisplayLeftColumn($params);
}
}
Cette approche modulaire respecte les bonnes pratiques PrestaShop : pas d'override fragile, configuration via le back-office, et compatibilité avec les mises à jour.
Bonnes pratiques et pièges à éviter
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

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.