Afficher delivery_out_stock dans le panier PrestaShop
Comment ajouter et afficher la variable delivery_out_stock dans le panier PrestaShop. Override Cart.php, requête SQL et piège classique des langues.
En bref : Pour afficher delivery_out_stock dans le panier PrestaShop, il faut overrider Cart.php pour ajouter ce champ à la requête SQL de getProducts(). Le piège principal est un décalage d'id_lang qui rend la variable vide — vérifiez que le contenu est rempli pour toutes les langues actives.
Le besoin : afficher le délai de livraison hors stock dans le panier
Par défaut, PrestaShop stocke deux informations de livraison pour chaque produit : le délai en stock (delivery_in_stock) et le délai hors stock (delivery_out_stock). Ces champs sont enregistrés dans la table ps_product_lang car ils sont traduisibles.
Sur la fiche produit, ces informations s'affichent nativement. En revanche, dans le panier, la variable {$product.delivery_out_stock} n'est pas disponible par défaut. Pour l'exposer, il faut intervenir sur la classe Cart via un override.
Étape 1 : créer l'override de Cart.php
La méthode à surcharger est getProducts(), qui construit la requête SQL récupérant les produits du panier. Il faut y ajouter le champ delivery_out_stock dans le SELECT.
Créez le fichier override/classes/Cart.php :
<?php
/**
* @author Alexandre Carette <contact@alexandrecarette.fr>
* @copyright 2026 Alexandre Carette
* @license Propriétaire et Confidentiel
*/
class Cart extends CartCore
{
public function getProducts($refresh = false, $id_product = false, $id_country = null, $fullInfos = true)
{
// Appel de la méthode parente
$products = parent::getProducts($refresh, $id_product, $id_country, $fullInfos);
if (!empty($products)) {
foreach ($products as &$product) {
// Récupération du champ delivery_out_stock depuis product_lang
$delivery = Db::getInstance()->getValue(
'SELECT `delivery_out_stock`
FROM `' . _DB_PREFIX_ . 'product_lang`
WHERE `id_product` = ' . (int) $product['id_product'] . '
AND `id_lang` = ' . (int) $this->id_lang . '
AND `id_shop` = ' . (int) Context::getContext()->shop->id
);
$product['delivery_out_stock'] = $delivery ?: '';
}
}
return $products;
}
}
PrestaShop 8.x : le mécanisme d'override reste fonctionnel mais Symfony encourage les décorateurs de service. Pour un champ simple comme celui-ci, l'override reste la solution la plus pragmatique.
Après création du fichier, supprimez le cache des classes :
rm var/cache/prod/class_index.php
rm var/cache/dev/class_index.php
Étape 2 : utiliser la variable dans le template du panier
Une fois l'override en place, la variable est accessible dans les templates Smarty du panier :
{if $product.delivery_out_stock}
<span class="delivery-out-stock">
{$product.delivery_out_stock}
</span>
{/if}
Le fichier à modifier dépend de votre thème. Dans le thème classic, c'est typiquement :
themes/votre-theme/templates/checkout/_partials/cart-detailed-product-line.tpl
Le piège classique : l'id_lang incorrect
C'est le problème le plus fréquent lors de cet override, et il est particulièrement vicieux : la variable reste vide alors que le code semble correct.
Pourquoi ça arrive
La table ps_product_lang stocke les traductions avec un id_lang. Si votre requête SQL utilise un id_lang qui ne correspond pas à celui où le contenu a été saisi, le résultat sera vide.
Ce décalage survient typiquement quand :
- **Plusieurs langues sont installées** mais le contenu n'est rempli que dans une seule
- **L'id_lang par défaut n'est pas 1** — sur certaines installations, le français peut être `id_lang = 2` ou `3` selon l'historique d'installation
- **La langue active du contexte** ne correspond pas à celle attendue dans la jointure SQL
Comment diagnostiquer
Pour vérifier quel id_lang est utilisé dans votre contexte :
// Dans votre override, temporairement :
error_log('Cart id_lang: ' . $this->id_lang);
error_log('Context id_lang: ' . Context::getContext()->language->id);
Puis vérifiez en base quelles langues contiennent effectivement la donnée :
SELECT id_lang, delivery_out_stock
FROM ps_product_lang
WHERE id_product = 123;
Si le champ est vide pour certaines langues, c'est la source du problème.
La solution
Deux approches :
- **Remplir le champ pour toutes les langues actives** dans le back-office (Catalogue > Produits > onglet Livraison). C'est la solution propre.
- **Forcer un fallback** dans le code si le champ est vide pour la langue courante :
$delivery = Db::getInstance()->getValue(
'SELECT `delivery_out_stock`
FROM `' . _DB_PREFIX_ . 'product_lang`
WHERE `id_product` = ' . (int) $product['id_product'] . '
AND `id_lang` = ' . (int) $this->id_lang . '
AND `id_shop` = ' . (int) Context::getContext()->shop->id
);
// Fallback : langue par défaut si vide
if (empty($delivery)) {
$delivery = Db::getInstance()->getValue(
'SELECT `delivery_out_stock`
FROM `' . _DB_PREFIX_ . 'product_lang`
WHERE `id_product` = ' . (int) $product['id_product'] . '
AND `id_lang` = ' . (int) Configuration::get('PS_LANG_DEFAULT') . '
AND `id_shop` = ' . (int) Context::getContext()->shop->id
);
}
Approche alternative : modifier directement la requête SQL de getProducts
Si vous préférez éviter les requêtes supplémentaires dans une boucle, vous pouvez copier intégralement la méthode getProducts() dans votre override et ajouter pl.delivery_out_stock dans le SELECT de la requête principale.
Cette approche est plus performante (une seule requête au lieu de N+1) mais plus fragile : chaque mise à jour de PrestaShop risque de modifier la méthode originale, rendant votre override obsolète.
// Dans la requête SQL de getProducts(), ajoutez dans le SELECT :
// pl.delivery_out_stock,
Conseil : si vous choisissez cette voie, documentez la version de PrestaShop sur laquelle l'override a été créé pour faciliter la maintenance lors des mises à jour.
Vérification en base de données
Avant de toucher au code, vérifiez toujours que vos données sont cohérentes :
-- Vérifier les langues actives
SELECT id_lang, iso_code, name, active
FROM ps_lang
WHERE active = 1;
-- Vérifier que delivery_out_stock est rempli pour toutes les langues
SELECT pl.id_product, pl.id_lang, l.iso_code, pl.delivery_out_stock
FROM ps_product_lang pl
JOIN ps_lang l ON l.id_lang = pl.id_lang
WHERE pl.id_product = 123
ORDER BY pl.id_lang;
Récapitulatif des fichiers impactés
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.