Afficher des produits associés sur la fiche produit PrestaShop
Comment afficher des produits associés, accessoires ou complémentaires sur la fiche produit PrestaShop. Module natif, module custom et hooks expliqués.
En bref : PrestaShop propose nativement les accessoires pour associer des produits manuellement. Pour un affichage automatique par catégorie, développez un module dédié hookable sur displayFooterProduct avec une requête filtrant les produits de la même catégorie.
Afficher des produits associés sur la fiche produit PrestaShop
Lorsqu'un visiteur consulte une fiche produit, lui proposer des articles complémentaires ou issus de la même catégorie est un levier de conversion redoutable. PrestaShop offre plusieurs mécanismes natifs pour y parvenir, mais certains cas d'usage exigent un développement sur mesure. Voici un tour d'horizon complet des solutions disponibles.
La fonctionnalité native « Accessoires »
Avant de se lancer dans du code, il faut connaître la fonctionnalité Accessoires intégrée nativement dans PrestaShop. Elle permet d'associer manuellement des produits entre eux depuis le back-office.
Configuration dans le back-office
- Rendez-vous dans **Catalogue > Produits** et éditez le produit concerné.
- Dans l'onglet **Associations** (PrestaShop 8.x) ou **Accessoires** (versions antérieures), recherchez les produits à associer.
- Sélectionnez-les et sauvegardez.
- Vous avez un catalogue de taille modeste (moins de 500 produits).
- Les associations sont stables et ne changent pas souvent.
- Vous souhaitez un contrôle éditorial précis sur chaque association.
- Catalogue volumineux avec des milliers de références.
- Besoin d'afficher automatiquement les produits d'une catégorie spécifique.
- Logique de cross-selling dynamique basée sur des règles métier.
- **Dupliquer le module** en le renommant (par exemple `myrelatedproducts`).
- **Modifier la requête SQL** pour filtrer les produits par catégorie.
- **Hooker le module sur la fiche produit** au lieu de la page d'accueil.
- **Limitez le nombre de suggestions** : 4 à 8 produits maximum pour ne pas diluer l'attention.
- **Privilégiez la pertinence** : les produits de la même catégorie ne sont pas toujours les plus pertinents. Combinez catégorie + attributs communs si possible.
- **Mesurez l'impact** : suivez le taux de clic sur les produits associés via Google Analytics ou un outil équivalent.
- **Cachez les résultats** : la requête `ORDER BY RAND()` est coûteuse sur de gros catalogues. Utilisez un cache module ou le cache Smarty.
- **Responsive** : assurez-vous que la grille de produits associés s'adapte correctement sur mobile (2 colonnes) et desktop (4 colonnes).
Les produits associés s'affichent automatiquement sur la fiche produit, dans un bloc dédié piloté par le template product-accessories.tpl (PrestaShop 1.6) ou le composant correspondant dans le thème (1.7 / 8.x).
Quand cette solution suffit
Quand elle montre ses limites
Développer un module d'affichage personnalisé
Pour des besoins plus avancés — par exemple afficher automatiquement tous les produits d'une catégorie donnée sur chaque fiche produit —, la solution la plus propre consiste à développer un module dédié.
Approche rapide : dupliquer et adapter un module existant
Sur PrestaShop 1.6, le module homefeatured (devenu ps_featuredproducts sur 1.7+) constitue une base de départ intéressante. L'idée est de :
Cette approche « bricolage » fonctionne, mais elle génère une dette technique importante. Privilégiez un module propre.
Approche recommandée : module dédié
Voici la structure d'un module PrestaShop 8.x pour afficher les produits d'une catégorie sur la fiche produit :
<?php
// modules/myrelatedproducts/myrelatedproducts.php
use PrestaShop\PrestaShop\Adapter\Presenter\Product\ProductPresenter;
class MyRelatedProducts extends Module
{
public function __construct()
{
$this->name = 'myrelatedproducts';
$this->version = '1.0.0';
$this->author = 'Alexandre Carette';
$this->tab = 'front_office_features';
$this->need_instance = 0;
parent::__construct();
$this->displayName = $this->l('Produits associés par catégorie');
$this->description = $this->l('Affiche les produits de la même catégorie sur la fiche produit.');
}
public function install()
{
return parent::install()
&& $this->registerHook('displayFooterProduct')
&& $this->registerHook('displayProductAdditionalInfo');
}
public function hookDisplayFooterProduct($params)
{
$product = new Product((int) $params['product']->id);
$categoryId = (int) $product->id_category_default;
$relatedProducts = $this->getProductsByCategory(
$categoryId,
(int) $product->id,
8
);
$this->context->smarty->assign([
'related_products' => $relatedProducts,
'category_name' => (new Category($categoryId, $this->context->language->id))->name,
]);
return $this->display(__FILE__, 'views/templates/hook/related.tpl');
}
private function getProductsByCategory(int $categoryId, int $excludeId, int $limit): array
{
$sql = new DbQuery();
$sql->select('p.id_product');
$sql->from('product', 'p');
$sql->innerJoin('category_product', 'cp', 'cp.id_product = p.id_product');
$sql->where('cp.id_category = ' . $categoryId);
$sql->where('p.id_product != ' . $excludeId);
$sql->where('p.active = 1');
$sql->orderBy('RAND()');
$sql->limit($limit);
$results = Db::getInstance()->executeS($sql);
if (!$results) {
return [];
}
$assembler = new ProductAssembler($this->context);
$presenterFactory = new ProductPresenterFactory($this->context);
$presenter = $presenterFactory->getPresenter();
$presentationSettings = $presenterFactory->getPresentationSettings();
$products = [];
foreach ($results as $row) {
$products[] = $presenter->present(
$presentationSettings,
$assembler->assembleProduct(['id_product' => $row['id_product']]),
$this->context->language
);
}
return $products;
}
}
Le template Smarty associé
{* views/templates/hook/related.tpl *}
{if $related_products|count > 0}
<section class="related-products">
<h2>{l s='Autres produits dans' mod='myrelatedproducts'} {$category_name}</h2>
<div class="products row">
{foreach from=$related_products item=product}
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach}
</div>
</section>
{/if}
Les hooks disponibles sur la fiche produit
Le choix du hook détermine l'emplacement du bloc. Voici les principaux hooks disponibles sur la fiche produit :
Sur PrestaShop 8.x, le système de hooks est identique mais le rendu passe par le thème classic (ou votre thème custom) qui utilise des templates Smarty restructurés.
Déboguer l'affichage des variables produit
Si vos produits associés ne s'affichent pas, la première étape de diagnostic consiste à vérifier les variables disponibles dans le template.
Activer le mode debug Smarty
Dans le back-office, activez le mode debug via Paramètres avancés > Performances > Mode debug (ou ajoutez _PS_MODE_DEV_ à true dans config/defines.inc.php).
Ensuite, dans votre template, inspectez les variables disponibles :
{debug}
Ou pour une variable spécifique :
{$related_products|print_r}
Utiliser la console du navigateur
Sur PrestaShop 1.7+, ouvrez la console JavaScript de votre navigateur. En mode debug, PrestaShop expose certaines données produit dans l'objet prestashop global :
console.log(prestashop.product);
Bonnes pratiques de cross-selling
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.