Trouver les produits PrestaShop sans image, description ou EAN (requêtes SQL)

5 min de lecture Autres langues : PL EN

Un catalogue de quelques centaines de produits se surveille à la main. Avec plusieurs milliers, plus les déclinaisons et les imports fournisseurs, des manques apparaissent que personne ne voit dans le back-office : un produit avec une seule photo, une description de deux lignes, une taille sans code-barres, une marque vide. Voici des requêtes SQL prêtes à l’emploi qui listent chaque type de manque, pour savoir exactement quoi corriger et dans quel ordre.

Avant de commencer

  • Toutes les requêtes ne font que lire les données (SELECT). Exécutez-les dans phpMyAdmin, Adminer ou n’importe quel client MySQL.
  • Remplacez le préfixe ps_ par celui de vos tables.
  • id_lang = 1 et id_shop = 1 désignent votre langue et votre boutique par défaut – modifiez-les si besoin (voir ps_lang et ps_shop).
  • La plupart des requêtes filtrent p.active = 1. Supprimez cette ligne pour contrôler aussi les produits pas encore publiés – une bonne habitude avant de les activer.

1. Produits sans marque

Google a besoin d’une marque pour presque tous les produits, et les clients filtrent par marque. Dans PrestaShop, la marque correspond au manufacturer (fabricant).

SELECT p.id_product, p.reference, pl.name
FROM ps_product p
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
  AND p.id_manufacturer = 0;

2. Produits avec moins de 3 images

Une seule photo vend rarement. Remplacez 3 par votre minimum.

SELECT p.id_product, pl.name, COUNT(i.id_image) AS images
FROM ps_product p
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
LEFT JOIN ps_image i ON i.id_product = p.id_product
WHERE p.active = 1
GROUP BY p.id_product, pl.name
HAVING images < 3
ORDER BY images, p.id_product;

3. Descriptions courtes ou vides

La requête retire les balises HTML et compte les caractères restants. Elle nécessite MySQL 8 ou MariaDB 10.0.5+ (REGEXP_REPLACE).

SELECT p.id_product, pl.name,
       CHAR_LENGTH(TRIM(REGEXP_REPLACE(COALESCE(pl.description, ''), '<[^>]*>', ''))) AS caracteres
FROM ps_product p
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
HAVING caracteres < 300
ORDER BY caracteres;

Lancez-la pour chaque langue (id_lang). Les descriptions non traduites sont un manque caché fréquent dans les boutiques multilingues.

4. Produits et déclinaisons sans EAN

-- produits simples
SELECT p.id_product, pl.name
FROM ps_product p
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
  AND NOT EXISTS (SELECT 1 FROM ps_product_attribute pa WHERE pa.id_product = p.id_product)
  AND COALESCE(p.ean13, '') = '';

-- déclinaisons
SELECT p.id_product, pl.name, pa.id_product_attribute, pa.reference
FROM ps_product_attribute pa
JOIN ps_product p ON p.id_product = pa.id_product
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
  AND COALESCE(pa.ean13, '') = '';

Plus d’informations sur le GTIN et Google Merchant Center : Trouver tous les produits PrestaShop sans GTIN.

5. Déclinaisons sans image associée

Quand le client choisit « rouge », la photo doit passer au rouge. Cela ne fonctionne que si des images sont associées aux déclinaisons.

SELECT p.id_product, pl.name, pa.id_product_attribute, pa.reference
FROM ps_product_attribute pa
JOIN ps_product p ON p.id_product = pa.id_product
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
LEFT JOIN ps_product_attribute_image pai
  ON pai.id_product_attribute = pa.id_product_attribute
WHERE p.active = 1
  AND pai.id_image IS NULL;

À noter : si la boutique ne distingue que des tailles, l’absence d’images par déclinaison peut être normale. Cela compte surtout pour les couleurs et les matières.

6. Ruptures de stock

SELECT p.id_product, pl.name, sa.id_product_attribute, sa.quantity
FROM ps_stock_available sa
JOIN ps_product p ON p.id_product = sa.id_product
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1
  AND sa.quantity <= 0
  AND (
    sa.id_product_attribute > 0
    OR NOT EXISTS (SELECT 1 FROM ps_product_attribute pa WHERE pa.id_product = p.id_product)
  );

7. Poids nul, prix nul, balise titre vide

-- produits physiques sans poids (frais de port faussés)
SELECT id_product, reference FROM ps_product
WHERE active = 1 AND is_virtual = 0 AND weight = 0;

-- prix nul ou négatif
SELECT ps.id_product, pl.name, ps.price
FROM ps_product_shop ps
JOIN ps_product_lang pl
  ON pl.id_product = ps.id_product AND pl.id_lang = 1 AND pl.id_shop = ps.id_shop
WHERE ps.id_shop = 1 AND ps.active = 1 AND ps.price <= 0;

-- balise titre (meta title) vide
SELECT p.id_product, pl.name
FROM ps_product p
JOIN ps_product_lang pl
  ON pl.id_product = p.id_product AND pl.id_lang = 1 AND pl.id_shop = 1
WHERE p.active = 1 AND COALESCE(pl.meta_title, '') = '';

Par quoi commencer

Dix listes de plusieurs centaines de lignes ne font pas un plan. Un ordre simple qui fonctionne pour la plupart des boutiques :

  1. Les produits que vous faites en publicité. Prix, stock, images et GTIN de tout ce qui est dans Google Shopping ou Meta – les erreurs y coûtent chaque jour.
  2. Les meilleures ventes. Triez par ventes et corrigez d’abord descriptions et images du top 50.
  3. Tout ce qui est nouveau. Ajoutez un contrôle avant publication pour que les manques cessent d’augmenter.
  4. La longue traîne, par lots.

Les limites du SQL

Les requêtes fonctionnent, mais elles donnent dix listes séparées, un problème par ligne. Il faut encore les croiser dans un tableur, décider quel produit est le pire, et tout relancer le mois suivant. Elles traitent aussi tous les catalogues de la même façon, alors qu’une boutique de meubles n’a pas besoin des mêmes règles qu’une boutique de t-shirts.

Un scan au lieu de dix requêtes

Product Data Guardian effectue tous ces contrôles en un seul scan et attribue à chaque produit un score de 0 à 100. Les principaux problèmes s’affichent sur un tableau de bord, un clic donne la liste exacte des produits, et chaque produit s’ouvre avec une courte explication de ce qui manque. Règles et pondérations peuvent varier selon la catégorie, les scans peuvent être planifiés, et les produits non publiés peuvent être contrôlés avant leur mise en ligne.

Découvrir Product Data Guardian

← Tous les articles

Formulaire de contact

Module concerné : Product Data Guardian – score qualité du catalogue et flux publicitaires