Afficher l'ancien prix unitaire dans PrestaShop avec Smarty
Comment afficher le prix unitaire avant réduction dans PrestaShop : calcul Smarty, ratio unit_price_ratio et bonnes pratiques pour les fiches produit.
En bref : Pour afficher l'ancien prix unitaire barré dans PrestaShop, divisez le prix sans réduction par le unit_price_ratio via le plugin Smarty {math}, en déclarant toujours les variables comme paramètres nommés pour éviter les erreurs de calcul silencieuses.
Comprendre le prix unitaire et le ratio dans PrestaShop
Le prix unitaire est une obligation légale pour de nombreux produits vendus au poids, au litre ou à la pièce. PrestaShop gère cette notion via le champ unit_price_ratio, qui représente le rapport entre le prix du produit et le prix à l'unité de référence.
Concrètement, si vous vendez un lot de 6 bouteilles à 30 €, le unit_price_ratio sera de 6, et le prix unitaire affiché sera de 5 € la bouteille.
Le problème survient lorsqu'une réduction est appliquée au produit : PrestaShop affiche bien le nouveau prix unitaire réduit, mais n'affiche pas par défaut l'ancien prix unitaire barré. Pour les marchands soumis à la réglementation sur l'affichage des prix (directive Omnibus notamment), c'est un manque qu'il faut combler.
Vérifier que le ratio est bien disponible dans le template
Avant toute modification de template, la première étape est de s'assurer que la variable unit_price_ratio est bien assignée et accessible dans Smarty.
Activer le mode debug Smarty
Dans le back-office PrestaShop, activez le mode debug pour inspecter les variables disponibles :
- **PrestaShop 1.6/1.7** : Préférences avancées → Performance → Mode debug
- **PrestaShop 8.x** : Paramètres avancés → Performances → Mode debug
Vous pouvez aussi ajouter temporairement dans votre template :
{* Debug : afficher toutes les variables produit disponibles *}
{$product|print_r}
Vérifiez que unit_price_ratio contient bien une valeur numérique supérieure à 0. Si ce n'est pas le cas, le prix unitaire n'a pas été configuré dans la fiche produit (onglet Prix → Prix par unité).
Calculer et afficher l'ancien prix unitaire (PrestaShop 1.6)
Dans PrestaShop 1.6, les templates utilisent Smarty. Le calcul de l'ancien prix unitaire se fait avec le plugin {math} de Smarty.
Le principe du calcul
Le prix unitaire avant réduction se calcule ainsi :
ancien_prix_unitaire = prix_sans_réduction / unit_price_ratio
Où :
- `prix_sans_réduction` correspond à `$product.price_without_reduction` (prix TTC avant réduction)
- `unit_price_ratio` correspond à `$product.unit_price_ratio`
Implémentation Smarty
Voici le code à intégrer dans votre template product.tpl (ou le fichier correspondant de votre thème), à l'endroit où vous souhaitez afficher l'ancien prix unitaire :
{if $product.unit_price_ratio|intval && $product.reduction|intval}
{* Calcul de l'ancien prix unitaire avant réduction *}
{math equation="price / ratio"
price=$product.price_without_reduction
ratio=$product.unit_price_ratio
assign=oldUnitPrice}
<span class="old-unit-price" style="text-decoration: line-through;">
{convertPrice price=$oldUnitPrice}
</span>
{/if}
Points importants :
- **Déclarez toujours vos variables avant l'équation** dans le tag `{math}`. Passer directement les variables Smarty dans l'attribut `equation` sans les déclarer via des paramètres nommés provoque des erreurs de calcul silencieuses.
- **Le filtre `|intval`** sur `unit_price_ratio` permet de vérifier que la valeur est un entier non nul, évitant ainsi une division par zéro.
- **`{convertPrice}`** formate automatiquement le montant selon la devise active de la boutique.
- Vider le cache Smarty (Paramètres avancés → Performances → Vider le cache)
- Désactiver temporairement le cache pendant le développement
- Vérifier en navigation privée pour éviter le cache navigateur
Variante avec prix HT et TTC
Si vous devez gérer les deux affichages (HT et TTC), déclarez les variables séparément :
{if $product.unit_price_ratio|intval && $product.reduction|intval}
{* Ancien prix unitaire TTC *}
{math equation="price / ratio"
price=$product.price_without_reduction
ratio=$product.unit_price_ratio
assign=oldUnitPriceTTC}
{* Ancien prix unitaire HT *}
{math equation="price / ratio"
price=$product.price_without_reduction_without_tax
ratio=$product.unit_price_ratio
assign=oldUnitPriceHT}
<span class="old-unit-price">
<del>{convertPrice price=$oldUnitPriceTTC}</del>
<small>TTC</small>
</span>
{/if}
Adaptation pour PrestaShop 1.7 et 8.x
À partir de PrestaShop 1.7, le moteur de template reste Smarty mais la structure des données produit a changé. Les variables sont accessibles différemment.
PrestaShop 1.7
Dans les templates 1.7, le prix unitaire est accessible via le tableau $product.unit_price_full :
{if $product.has_discount && $product.unit_price_ratio > 0}
{math equation="price / ratio"
price=$product.price_without_reduction
ratio=$product.unit_price_ratio
assign=oldUnitPrice}
<span class="regular-price">
{convertPrice price=$oldUnitPrice}
{if $product.unity}
/ {$product.unity}
{/if}
</span>
{/if}
PrestaShop 8.x
PrestaShop 8.x conserve la compatibilité Smarty mais encourage la migration vers des approches plus modernes. Le calcul reste identique, mais vérifiez la structure de données dans votre version spécifique :
{* Compatible PrestaShop 8.x *}
{if isset($product.unit_price_ratio) && $product.unit_price_ratio > 1 && $product.has_discount}
{math equation="price / ratio"
price=$product.price_without_reduction
ratio=$product.unit_price_ratio
assign=oldUnitPrice}
<div class="old-unit-price">
<del>{convertPrice price=$oldUnitPrice}</del>
{if isset($product.unity) && $product.unity}
<span class="unity">/ {$product.unity}</span>
{/if}
</div>
{/if}
Bonnes pratiques et pièges à éviter
1. Division par zéro
Toujours vérifier que unit_price_ratio est supérieur à 0 avant de l'utiliser comme diviseur. Un ratio à 0 signifie que le prix unitaire n'est pas configuré.
2. Déclaration des variables dans `{math}`
Le plugin Smarty {math} exige que les variables soient passées comme paramètres nommés, pas directement dans l'équation. Cette syntaxe est incorrecte :
{* ❌ NE PAS FAIRE *}
{math equation="$product.price_without_reduction / $product.unit_price_ratio"}
Utilisez toujours des alias :
{* ✅ CORRECT *}
{math equation="a / b" a=$product.price_without_reduction b=$product.unit_price_ratio assign=result}
3. Cache et recalcul
Si vous modifiez un template lié aux prix, pensez à :
4. Conformité directive Omnibus (UE)
Depuis janvier 2022, la directive Omnibus impose d'afficher le prix le plus bas pratiqué dans les 30 derniers jours avant toute annonce de réduction. Le prix unitaire barré doit refléter cette règle. PrestaShop 8.x intègre nativement un module de gestion Omnibus — vérifiez sa configuration si vous êtes concerné.
Approche alternative : override du ProductPresenter
Pour une solution plus propre et maintenable, notamment sur PrestaShop 1.7+, vous pouvez créer un override du ProductPresenter pour ajouter l'ancien prix unitaire directement dans les données du produit :
<?php
// override/classes/ProductPresenterFactory.php
// ou via un module custom
use PrestaShop\PrestaShop\Adapter\Presenter\Product\ProductPresenter;
class ProductPresenterOverride extends ProductPresenter
{
public function present($product)
{
$presented = parent::present($product);
if (isset($presented['unit_price_ratio'])
&& $presented['unit_price_ratio'] > 0
&& isset($presented['has_discount'])
&& $presented['has_discount']) {
$presented['old_unit_price'] =
$presented['price_without_reduction']
/ $presented['unit_price_ratio'];
}
return $presented;
}
}
Cette approche sépare la logique métier du template et facilite la maintenance lors des mises à jour de PrestaShop.
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.