[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":22,"footer-db":103,"$fsEOPGbtSJGYc3zlQYmtgrWEgJnf_NLhx0lLy2682JiI":122,"megamenu":161,"header-db":216,"$fkCIhFSKz6TW2cNzd-Z6YcqDiR3X-tUWLQpslWwHUSXk":227},{"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",{"footer":104},{"theme":105,"description":106,"hours":106,"logo":107,"contact":110,"social":111,"bottomBar":121},"dark",null,{"src":108,"href":109,"alt":95},"\u002Flogo-ac.svg","\u002F",{"email":106,"phone":106,"address":106,"cta":106},[112,115,118],{"platform":113,"href":114,"label":113},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":116,"href":117,"label":116},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":119,"href":120,"label":119},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":106},{"title":123,"slug":124,"metaDescription":125,"category":126,"tags":127,"difficulty":134,"psVersions":135,"content":139,"faq":140,"tldr":156,"readingTime":157,"generatedAt":158,"publishDate":158,"relatedArticles":159,"sourceCategory":160},"Afficher le fabricant sur les meilleures ventes PrestaShop","afficher-fabricant-manufacturer-module-meilleures-ventes-prestashop","Comment afficher le nom du fabricant (manufacturer) dans le module des meilleures ventes PrestaShop. Méthode complète avec modification SQL et template.","developpement",[128,129,130,131,132,133],"manufacturer","blockbestsellers","module","smarty","SQL","override","intermediaire",[136,137,138],"1.6","1.7","8.x","\u003Ch2>Le problème : des meilleures ventes sans identité de marque\u003C\u002Fh2>\n\u003Cp>Le module des meilleures ventes de PrestaShop affiche par défaut le nom du produit, son prix et son image — mais pas le fabricant. C'est un manque important pour les boutiques multi-marques : le nom du fabricant est un facteur de réassurance et de décision d'achat majeur.\u003C\u002Fp>\n\u003Cp>Voici comment ajouter cette information en comprenant la chaîne complète du code, de la requête SQL jusqu'au template.\u003C\u002Fp>\n\u003Ch2>Comprendre le flux de données du module\u003C\u002Fh2>\n\u003Cp>Avant de modifier quoi que ce soit, il faut tracer le parcours des données. C'est une compétence fondamentale en développement PrestaShop : chaque module suit un schéma similaire.\u003C\u002Fp>\n\u003Ch3>Étape 1 : identifier la méthode principale du module\u003C\u002Fh3>\n\u003Cp>Dans le module \u003Ccode>blockbestsellers\u003C\u002Fcode> (PrestaShop 1.6) ou \u003Ccode>ps_bestsellers\u003C\u002Fcode> (1.7+), la méthode \u003Ccode>getBestSellers()\u003C\u002Fcode> récupère les produits :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nprotected function getBestSellers($params)\n{\n    if (Configuration::get('PS_CATALOG_MODE')) {\n        return false;\n    }\n\n    $result = ProductSale::getBestSalesLight(\n        (int) $params['cookie']-&gt;id_lang,\n        0,\n        (int) Configuration::get('PS_BLOCK_BESTSELLERS_TO_DISPLAY')\n    );\n\n    if (!$result) {\n        return Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY') ? [] : false;\n    }\n\n    \u002F\u002F Enrichissement des données (prix, etc.)\n    $currency = new Currency($params['cookie']-&gt;id_currency);\n    $usetax = (Product::getTaxCalculationMethod((int) $this-&gt;context-&gt;customer-&gt;id) != PS_TAX_EXC);\n\n    foreach ($result as &$row) {\n        $row['price'] = Tools::displayPrice(\n            Product::getPriceStatic((int) $row['id_product'], $usetax),\n            $currency\n        );\n    }\n\n    return $result;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le point clé ici : les données produit proviennent de \u003Ccode>ProductSale::getBestSalesLight()\u003C\u002Fcode>. C'est cette méthode qu'il faut enrichir.\u003C\u002Fp>\n\u003Ch3>Étape 2 : analyser la requête SQL source\u003C\u002Fh3>\n\u003Cp>Dans \u003Ccode>classes\u002FProductSale.php\u003C\u002Fcode>, la méthode \u003Ccode>getBestSalesLight()\u003C\u002Fcode> exécute une requête SQL qui sélectionne les colonnes de base du produit. Par défaut, elle ne joint pas la table \u003Ccode>manufacturer\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Voici la requête d'origine simplifiée :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nSELECT p.id_product, pl.name, p.id_manufacturer, \u002F* ... *\u002F\nFROM ps_product p\nLEFT JOIN ps_product_lang pl ON (p.id_product = pl.id_product)\nINNER JOIN ps_product_sale ps ON (p.id_product = ps.id_product)\nWHERE pl.id_lang = {id_lang}\nORDER BY ps.quantity DESC\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La colonne \u003Ccode>p.id_manufacturer\u003C\u002Fcode> est parfois présente, mais \u003Cstrong>le nom du fabricant n'est jamais récupéré\u003C\u002Fstrong> car il n'y a pas de jointure sur la table \u003Ccode>ps_manufacturer_lang\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Solution : override de ProductSale\u003C\u002Fh2>\n\u003Cp>La bonne pratique PrestaShop est de ne jamais modifier les fichiers core. On utilise le système d'override.\u003C\u002Fp>\n\u003Ch3>Créer l'override\u003C\u002Fh3>\n\u003Cp>Créez le fichier \u003Ccode>override\u002Fclasses\u002FProductSale.php\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * @author Alexandre Carette &lt;contact@alexandrecarette.fr&gt;\n * @copyright 2026 Alexandre Carette\n * @license Propriétaire et Confidentiel\n *\u002F\n\nclass ProductSale extends ProductSaleCore\n{\n    public static function getBestSalesLight($idLang, $pageNumber = 0, $nbProducts = 10)\n    {\n        $context = Context::getContext();\n\n        if ($pageNumber &lt; 0) {\n            $pageNumber = 0;\n        }\n        if ($nbProducts &lt; 1) {\n            $nbProducts = 10;\n        }\n\n        \u002F\u002F Groupes clients pour le filtrage des prix\n        $groups = FrontController::getCurrentCustomerGroups();\n        $sqlGroups = implode(',', array_map('intval', $groups));\n\n        $sql = new DbQuery();\n        $sql-&gt;select('p.id_product, p.id_manufacturer,\n            pl.name, pl.link_rewrite,\n            m.name AS manufacturer_name,\n            ps.quantity AS sales_quantity,\n            i.id_image, il.legend');\n        $sql-&gt;from('product_sale', 'ps');\n        $sql-&gt;leftJoin('product', 'p', 'p.id_product = ps.id_product');\n        $sql-&gt;leftJoin('product_lang', 'pl',\n            'p.id_product = pl.id_product\n            AND pl.id_lang = ' . (int) $idLang . '\n            AND pl.id_shop = ' . (int) $context-&gt;shop-&gt;id);\n        $sql-&gt;leftJoin('manufacturer', 'm', 'p.id_manufacturer = m.id_manufacturer');\n        $sql-&gt;leftJoin('image_shop', 'i',\n            'i.id_product = p.id_product\n            AND i.cover = 1\n            AND i.id_shop = ' . (int) $context-&gt;shop-&gt;id);\n        $sql-&gt;leftJoin('image_lang', 'il',\n            'i.id_image = il.id_image\n            AND il.id_lang = ' . (int) $idLang);\n        $sql-&gt;innerJoin('category_product', 'cp', 'cp.id_product = p.id_product');\n        $sql-&gt;innerJoin('category_group', 'cg',\n            'cp.id_category = cg.id_category\n            AND cg.id_group IN (' . $sqlGroups . ')');\n        $sql-&gt;where('p.active = 1');\n        $sql-&gt;where('p.visibility != \"none\"');\n        $sql-&gt;groupBy('p.id_product');\n        $sql-&gt;orderBy('ps.quantity DESC');\n        $sql-&gt;limit((int) $nbProducts, (int) $pageNumber * (int) $nbProducts);\n\n        return Db::getInstance(_PS_USE_SQL_SLAVE_)-&gt;executeS($sql);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La jointure clé ajoutée :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nLEFT JOIN ps_manufacturer m ON (p.id_manufacturer = m.id_manufacturer)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cela rend disponible \u003Ccode>manufacturer_name\u003C\u002Fcode> dans le tableau de résultats.\u003C\u002Fp>\n\u003Ch3>Vider le cache des classes\u003C\u002Fh3>\n\u003Cp>Après avoir créé l'override, supprimez le fichier de cache :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nrm -f var\u002Fcache\u002Fprod\u002Fclass_index.php\nrm -f var\u002Fcache\u002Fdev\u002Fclass_index.php\n# Sur PrestaShop 1.6 :\nrm -f cache\u002Fclass_index.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sans cette étape, PrestaShop continuera d'utiliser la classe originale.\u003C\u002Fp>\n\u003Ch2>Afficher le fabricant dans le template\u003C\u002Fh2>\n\u003Ch3>PrestaShop 1.6 (Smarty)\u003C\u002Fh3>\n\u003Cp>Dans le template du module (\u003Ccode>blockbestsellers.tpl\u003C\u002Fcode> ou votre thème), ajoutez :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{foreach from=$best_sellers item=product}\n    &lt;div class=\"product-container\"&gt;\n        &lt;h5&gt;{$product.name|escape:'html':'UTF-8'}&lt;\u002Fh5&gt;\n        {if $product.manufacturer_name}\n            &lt;span class=\"product-manufacturer\"&gt;\n                {$product.manufacturer_name|escape:'html':'UTF-8'}\n            &lt;\u002Fspan&gt;\n        {\u002Fif}\n        &lt;span class=\"price\"&gt;{$product.price}&lt;\u002Fspan&gt;\n    &lt;\u002Fdiv&gt;\n{\u002Fforeach}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>PrestaShop 1.7 \u002F 8.x (approche moderne)\u003C\u002Fh3>\n\u003Cp>Sur PrestaShop 1.7+, le module \u003Ccode>ps_bestsellers\u003C\u002Fcode> utilise \u003Ccode>ProductPresenter\u003C\u002Fcode> qui gère déjà le fabricant. La solution est plus simple — il suffit d'exploiter les données déjà disponibles dans le template :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{block name='product_manufacturer'}\n    {if $product.manufacturer_name}\n        &lt;div class=\"product-manufacturer\"&gt;\n            &lt;a href=\"{$product.manufacturer_name|escape:'html':'UTF-8'}\"&gt;\n                {$product.manufacturer_name|escape:'html':'UTF-8'}\n            &lt;\u002Fa&gt;\n        &lt;\u002Fdiv&gt;\n    {\u002Fif}\n{\u002Fblock}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sur PrestaShop 8.x, vérifiez d'abord si le \u003Ccode>ProductPresenter\u003C\u002Fcode> enrichit déjà vos données. Dans la majorité des cas sur les versions récentes, le fabricant est inclus nativement dans les listes de produits si votre thème l'exploite.\u003C\u002Fp>\n\u003Ch2>Méthode alternative sans override (PrestaShop 1.7+)\u003C\u002Fh2>\n\u003Cp>Si vous souhaitez éviter l'override, vous pouvez enrichir les données côté module via le hook :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionProductSearchComplete($params)\n{\n    $products = $params['result']-&gt;getProducts();\n\n    foreach ($products as &$product) {\n        if (!empty($product['id_manufacturer'])) {\n            $manufacturer = new Manufacturer(\n                (int) $product['id_manufacturer'],\n                (int) $this-&gt;context-&gt;language-&gt;id\n            );\n            $product['manufacturer_name'] = $manufacturer-&gt;name;\n        }\n    }\n\n    $params['result']-&gt;setProducts($products);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche est plus propre car elle ne touche pas au core, mais elle ajoute une requête par produit. Pour un bloc de 8 à 10 meilleures ventes, l'impact est négligeable.\u003C\u002Fp>\n\u003Ch2>Bonnes pratiques\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>**Toujours échapper les données** avec `escape:'html':'UTF-8'` dans Smarty ou `htmlspecialchars()` en PHP\u003C\u002Fli>\n\u003Cli>**Utiliser `LEFT JOIN`** et non `INNER JOIN` pour le fabricant : certains produits peuvent ne pas avoir de fabricant assigné\u003C\u002Fli>\n\u003Cli>**Tester en multiboutique** : la requête doit filtrer par `id_shop` pour éviter les doublons\u003C\u002Fli>\n\u003Cli>**Penser au cache** : si le module utilise un cache (fichier ou Smarty), purgez-le après modification\u003C\u002Fli>\n\u003Cli>**Préférer les overrides** aux modifications directes : vos changements survivront aux mises à jour du module\u003C\u002Fli>\n\u003C\u002Ful>",[141,144,147,150,153],{"q":142,"a":143},"Comment afficher le fabricant dans les meilleures ventes PrestaShop sans modifier le core ?","La méthode recommandée est de créer un override de la classe ProductSale dans override\u002Fclasses\u002FProductSale.php. Vous y ajoutez une jointure LEFT JOIN sur la table ps_manufacturer dans la méthode getBestSalesLight(), ce qui rend le nom du fabricant disponible dans vos templates via la variable manufacturer_name. N'oubliez pas de supprimer le fichier class_index.php dans le cache après avoir créé l'override.",{"q":145,"a":146},"Le nom du fabricant ne s'affiche pas après modification de la requête SQL, que faire ?","Trois causes fréquentes : 1) Le cache des classes n'a pas été vidé (supprimez var\u002Fcache\u002Fprod\u002Fclass_index.php), 2) Le cache Smarty n'a pas été purgé (Administration > Performances > Vider le cache), 3) L'alias SQL utilisé dans la requête ne correspond pas à la variable utilisée dans le template. Vérifiez que votre SELECT contient bien m.name AS manufacturer_name et que votre template utilise $product.manufacturer_name.",{"q":148,"a":149},"La modification du module meilleures ventes sera-t-elle conservée après une mise à jour PrestaShop ?","Si vous avez modifié directement le fichier du module ou la classe core, vos changements seront écrasés lors de la prochaine mise à jour. C'est pourquoi il faut utiliser le système d'override de PrestaShop : le fichier override\u002Fclasses\u002FProductSale.php est préservé lors des mises à jour du core. Attention toutefois : lors d'une mise à jour majeure (passage en 8.x par exemple), vérifiez la compatibilité de votre override avec la nouvelle signature de la méthode.",{"q":151,"a":152},"Comment ajouter un lien cliquable vers la page du fabricant dans le bloc meilleures ventes ?","Une fois le manufacturer_name récupéré via la requête SQL modifiée, ajoutez également l'id_manufacturer dans votre SELECT. Dans le template Smarty, construisez le lien avec : \u003Ca href=\"{$link->getManufacturerLink($product.id_manufacturer)}\">{$product.manufacturer_name}\u003C\u002Fa>. Sur PrestaShop 8.x, vous pouvez aussi utiliser le LinkCore pour générer des URLs propres avec réécriture.",{"q":154,"a":155},"Peut-on afficher le logo du fabricant à la place de son nom dans les meilleures ventes ?","Oui. PrestaShop stocke les logos fabricants dans le dossier img\u002Fm\u002F{id_manufacturer}.jpg. Dans votre template, ajoutez : \u003Cimg src=\"{$img_manu_dir}{$product.id_manufacturer}-medium_default.jpg\" alt=\"{$product.manufacturer_name}\" \u002F>. Assurez-vous que le format d'image medium_default est bien régénéré dans Préférences > Images. Sur PrestaShop 8.x, les formats WebP sont supportés nativement pour de meilleures performances.","Pour afficher le fabricant dans le module meilleures ventes PrestaShop, créez un override de ProductSale::getBestSalesLight() ajoutant un LEFT JOIN sur ps_manufacturer, puis exploitez la variable manufacturer_name dans votre template Smarty.",5,"2026-03-21T16:14:52.000Z",[],"PrestaShop pour les développeurs",{"items":162},[163,171,177,183,191,199,204,210],{"id":164,"type":165,"label":166,"href":84,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":168,"children":169,"psChildren":170},41,"link",{"fr":167},"Expertise",0,[],[],{"id":172,"type":165,"label":173,"href":75,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":174,"children":175,"psChildren":176},42,{"fr":74},1,[],[],{"id":178,"type":165,"label":179,"href":36,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":180,"children":181,"psChildren":182},43,{"fr":35},2,[],[],{"id":184,"type":165,"label":185,"href":187,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":188,"children":189,"psChildren":190},44,{"fr":186},"Outils IA","\u002Foutils-ia",3,[],[],{"id":192,"type":165,"label":193,"href":29,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":195,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":196,"children":197,"psChildren":198},45,{"fr":194},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":200,"type":165,"label":201,"href":78,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":157,"children":202,"psChildren":203},46,{"fr":77},[],[],{"id":205,"type":165,"label":206,"href":96,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":207,"children":208,"psChildren":209},47,{"fr":92},6,[],[],{"id":211,"type":165,"label":212,"href":102,"icon":106,"description":106,"badge":106,"groupTitle":106,"style":106,"gridColumns":106,"cssClass":106,"psCategoryId":106,"showPsChildren":30,"position":213,"children":214,"psChildren":215},48,{"fr":101},7,[],[],{"header":217},{"logo":218,"topBar":221,"contactEmail":224,"features":225,"navBar":106},{"src":108,"alt":219,"text":95,"href":109,"class":220},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":106,"showLanguages":30,"align":222,"languages":223},"left",[],"contact@alexandrecarette.fr",{"showSearch":30,"showWishlist":30,"showLogin":20,"showContact":30,"showCart":30,"stickyHeader":20,"headerLayout":226},"inline",{"academy":228,"blog":229,"expertise":240},[],[230,234,237],{"title":231,"url":232,"score":174,"type":233},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":235,"url":236,"score":174,"type":233},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":238,"url":239,"score":174,"type":233},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[]]