prestashop catalogue produits mysql
Accueil » Conseils & tutoriels sites internet » Tutos Prestashop » Prestashop : requêtes SQL pour les produits

Prestashop : requêtes SQL pour les produits

Posté dans : Tutos Prestashop 11

Travailler les produits sous Prestashop peut se révéler lent et contraignant, surtout lorsque vous avez beaucoup de données à traiter (catalogue produit volumineux, beaucoup de catégories…). La Team travaille beaucoup en base de données SQL pour traiter les données plus rapidement, grâce à de subtiles requêtes SQL.

 

N’oubliez pas que vous êtes entièrement responsable de votre base de données, pensez systématiquement à sauvegarder vos données !

 

Supprimer les images et ne conserver que celle en première position

Cela permet de résoudre en partie un souci d’import d’image depuis un fichier CSV. En effet, si vous soumettez trop souvent le même fichier (parfois dû à une limite serveur), vous allez dupliquer vos images et vos fiches produits auront la même image, dont une seule sera à la une. Autant supprimer toutes les images pour ne conserver que celle à la une, puis effectuer un second import si d’aventure vous avez d’autres médias

DELETE pi.*, pil.*, pis.* 
FROM `ps_image` pi 
LEFT JOIN `ps_image_lang` pil ON pi.id_image = pil.id_image 
LEFT JOIN `ps_image_shop` pis ON pi.id_image = pis.id_image 
WHERE pi.position != 1

 

Trouver les produits qui n’ont pas d’image, ou pas d’image à la une

Si votre catalogue est volumineux, ces requêtes SQL vous permettront non seulement de détecter quels sont les produits sans image, mais également de trouver quels sont les produits sans image à la une. Pratique !

#Recherche des produits sans aucune image
SELECT * FROM ps_product pp WHERE pp.id_product NOT IN (SELECT pi.id_product FROM ps_image pi);

#Recherche des produits sans image à la une
SELECT * FROM ps_product pp WHERE pp.id_product NOT IN (SELECT pi.id_product FROM ps_image pi WHERE pi.cover = "1");

 

Ranger les produits dans une catégorie précise selon un terme utilisé sur la fiche produit

De l’utilité des mots-clés ! Ces requêtes sont décomposées en trois, selon l’emplacement du terme recherché. Dans les exemples, l’identifiant de la catégorie est le 3017, pensez donc à le modifier pour y mettre celui de la catégorie souhaitée. Un gain de temps extraordinaire !

#Associer tous les produits dans une catégorie précise, en se basant sur un mot (présent dans le nom du produit)
INSERT INTO `ps_category_product` 
SELECT 3017, `id_product`, 0 
FROM `ps_product_lang` 
WHERE INSTR(name, 'MotSeTrouvantDansLeNomDesProduits') > 0
LIMIT 1;
#Associer tous les produits dans une catégorie précise, en se basant sur un mot (présent dans le résumé du produit)
INSERT INTO `ps_category_product` 
SELECT 3017, `id_product`, 0 
FROM `ps_product_lang` 
WHERE INSTR(description_short, 'MotSeTrouvantDansLeNomDesProduits') > 0
LIMIT 1;
#Associer tous les produits dans une catégorie précise, en se basant sur un mot (présent dans la description du produit)
INSERT INTO `ps_category_product` 
SELECT 3017, `id_product`, 0 
FROM `ps_product_lang` 
WHERE INSTR(description, 'MotSeTrouvantDansLeNomDesProduits') > 0
LIMIT 1;

 

Ranger tous les produits dans la catégorie Accueil

DELETE FROM `sldr_category_product` 
WHERE `id_category` = 2;

INSERT INTO `sldr_category_product` 
SELECT 2, `id_product`, 0 
FROM `sldr_product`;

 

 

Mettre le prix des produits égal à la déclinaison au prix le plus bas

Cette requête s’est révélée très utile surtout couplée à celle qui suit.

Sur des catalogues comme ceux de Sol’s, les produits n’ont pas forcément de prix de base, ce sont toutes les déclinaisons qui en ont. Ainsi, afin d’avoir le meilleur affichage possible (notamment en terme de dégressivité), il est impératif que le produit initial ait un prix, et que les déclinaisons le majorent.

Nous avons donc par exemple un t-shirt Regent à partir de 4,17€, et les tailles 3XL majorent ce prix. Le prix initial du produit est donc celui de la déclinaison la plus basse, les autres déclinaisons majorant ce prix. Notez qu’il faudra par la suite rectifier les prix des déclinaisons, ce qui est la requête juste après.

UPDATE ps_product_shop ps SET ps.price = (SELECT MIN(pas.price) FROM ps_product_attribute_shop pas WHERE pas.id_product = ps.id_product)

 

Mettre le prix des déclinaisons égal au prix des produits moins le prix de la déclinaison

Maintenant que nous disposons d’un prix de base, il va falloir rectifier les prix des déclinaisons. Le prix des déclinaisons est donc à présent le prix de base moins le prix de la déclinaison.

Il suffit donc via SQL de soustraire le prix de base du produit, du prix de la déclinaison. Ce qui donne :

UPDATE ps_product_attribute_shop pas SET pas.price = pas.price - (SELECT ps.price FROM ps_product_shop ps WHERE pas.id_product = ps.id_product)

 

Ajouter des prix dégressifs sur tout le catalogue

Partons du principe qu’à partir de 501 exemplaires, sur tout votre catalogue, vous appliquez une réduction de 46%.

Plutôt que de passer manuellement sur tout le catalogue, nous allons faire cela via SQL. La structure de la table ps_specific_price vous permettra de voir les autres informations, par exemple dans le cas où vous souhaiteriez proposer des prix dégressifs autres que sur une base de pourcentage.

Attention si vous avez déjà des prix dégressifs renseignés, cette requête bloquera. Il est important que la table ps_specific_price soit vide.

La requête est donc la suivante :

INSERT INTO ps_specific_price (id_product, id_shop, price, from_quantity, reduction, reduction_tax, reduction_type)
SELECT ps_product.id_product, 1, -1.000000, 501, 0.460000, 1, "percentage"
FROM ps_product

 

Associer un fichier joint à un produit

Ici nous allons nous baser sur le nom du fichier joint, qui doit impérativement être la référence du produit. Vous pouvez également insérer la référence du produit directement dans le champ description du fichier joint, cela revient peu ou prou au même.

INSERT INTO ps_product_attachment
SELECT 
pp.id_product,
pal.id_attachment 
FROM ps_attachment_lang pal, ps_product pp 
WHERE pal.name = pp.reference

Pensez ensuite à mettre à jour vos fiches produits avec cette requête :

UPDATE ps_product SET cache_has_attachments = 1

Si vous n’avez pas de fichier joint sur tous vos produits, faites plutôt ceci :

UPDATE ps_product pp SET pp.cache_has_attachments = 1 WHERE pp.id_product = (SELECT pal.id_product FRON ps_attachment_lang pal)

 

Mettre le nom du produit en tag, sans espaces, pour la recherche

Par défaut, la recherche de Prestashop ne permet pas de retrouver un produit si son nom est saisi sans espaces. Afin de pallier à ça, servons-nous des tags, en ajoutant en tant que tag le nom du produit sans espaces.

Attention, je démarre mes requêtes, avec un truncate, pensez à sauvegarder vos tables

Modifiez aussi l’id_lang pour mettre celui souhaité, ou modifiez la requête selon votre gestion de multilingue

TRUNCATE ps_tag
TRUNCATE ps_product_tag

INSERT INTO ps_tag
(id_lang, name)
SELECT 2, REPLACE(name, ' ', '') FROM ps_product_lang WHERE id_lang = 2

INSERT INTO ps_product_tag
(id_product, id_tag, id_lang)
SELECT pl.id_product, t.id_tag, 2
FROM ps_product_lang pl
LEFT JOIN ps_tag t
ON (
    t.name = REPLACE(pl.name, ' ', '')
)
WHERE pl.id_lang = 2

 

Mettre un produit associé sur toute une catégorie, ou plusieurs

Ceci va nous permettre d’associer un produit bien précis à un ensemble de produits selon leur catégorie. Dans mon exemple, j’ai un produit « impression » avec l’identifiant 446, qui doit être associé à tous les produits de catégories bien spécifiques.

La table à renseigner est ps_accessory, que j’ai pris soin de vider au préalable (mais à vous de juger, attention aux entrées dupliquées). Comme d’habitude, attention aussi au préfixe de table.

INSERT INTO ps_accessory (id_product_1, id_product_2)
SELECT id_product, 446
FROM ps_product
WHERE id_category_default IN
(
35,
38,
44,
52,
56,
58,
59
)

Renseignez entre les parenthèses les identifiants de vos catégories (vous pouvez tout-à-fait n’en mettre qu’un seul) et modifiez l’identifiant 446 par le produit qui sera associé.

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

Je cherche à display errors le monde, vous auriez pas la doc' ? Follow me on Twitter !

11 Responses

  1. Webbax
    | Répondre

    Hello,

    Intéressant cette manière de faire j’ai bien aimé la dernière procédure pour remettre des produits dans les bonnes catégories associées. C’est vraiment des requêtes types qui peuvent servir au quotidien… je m’étais déjà dit une fois que ça serait sympa un site qui regroupe des requêtes SQL pratiques à exécuter sur son Prestashop (à méditer).

    A bientôt !

    • Cyril CHALAMON
      | Répondre

      Merci !
      Cet article sera régulièrement alimenté, de manière à lister encore plus de requêtes utiles avec le temps. A suivre donc 🙂

  2. site prestashop
    | Répondre

    Bonjour,
    Merci pour cette démo. J’ai une question mais qui n’a rien avoir avec les requêtes sql. Si un site prestashop a une url qui n’est pas canonique, genre avec /categorie_63 et autres types. Une url qui n’est pas propre je dirai. Et que le site a déjà marché depuis au moins un an. Est-ce qu’on peut quand même réécrire les url sans perdre le référencement. Merci de votre réponse et encore désolé de poser cette question sur cet article.

    • Cyril CHALAMON
      | Répondre

      Bonjour,
      En fait, dans tous les cas il est préférable de faire des redirections de l’ancienne URL vers la nouvelle, via un htaccess par exemple. Il faudra également regénérer le sitemap et le renvoyer à Search Console, pour que le contenu modifié soit le plus rapidement pris en compte. Cela évitera des pages 404 et remettra en place un référencement naturel.
      La syntaxe pour le htaccess est la suivante :

      RewriteRule ^ancienneURL//?$ $1/nouvelleURL$2 [R=301,L]
  3. manu
    | Répondre

    Bonjour je tente de lancer une requete SQL pour trouver les produits sans image, j ai donc suivi votre code, mais lorsque je le mets en action, il me retourne l’erreur suivante : L’attribut « EXISTS » n’existe pas dans la table « gwwm_product ».
    Comment puis je corriger cela ? merci beaucoup de vos tuto 😉

    • Cyril CHALAMON
      | Répondre

      Mea culpa, la syntaxe était NOT IN au lieu de NOT EXISTS.
      C’est corrigé dans le tuto, cela devrait fonctionner à présent. Merci à vous !

      • manu
        | Répondre

        merci beaucoup, j avais pense que cela venait de la mais je preferais avoir une confirmation 😉 par contre je sais je suis penible lol j ai une nouvelle erreur : L’opérateur « * » ne peut pas être utilisé pour les requêtes imbriquées.

  4. manu
    | Répondre

    oups desolé de mon nouveau com, le code fonctionne parfaitement dans phpmyadmin, alors que sous l interface presta 1.7 il ne passe pas, sans doute un bug presta, encore merci de vos tutos 🙂

    • Cyril CHALAMON
      | Répondre

      Pas de soucis 🙂
      En général, nous passons par PhpMyAdmin ou directement en SSH, par habitude. Je dois même avouer ne jamais avoir utilisé l’interface SQL de Prestashop

  5. Olivier
    | Répondre

    Bonjour,
    Je souhaiterais effectuer une petite modification sql sur la table ps_adresss le champs phone dans le champs phone_mobile avec condition seulement si elle vide et le champs phone_mobile dans le champs phone avec condition seulement si elle vide, quel serait la requête sql pour cela ?

    • Cyssoo
      | Répondre

      Bonjour
      Essayez avec ceci :
      UPDATE ps_address SET phone = phone_mobile WHERE phone IS NULL OR phone = '';
      Bien évidemment, faites une sauvegarde de la table au préalable

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.