Telefono: +39 392 33 73 731

Prestashop: esportare in CSV tutti i prodotti e relative combinazioni

Se sei in questa pagina è probabile che tu abbia già provato ad usare il bottone "ESPORTA" di Prestashop, quello nella lista prodotti. Purtroppo avrai notato che il file CSV risultato non contiene le varianti dei prodotti (cioè le combinazioni), ed è molto scarno anche di altre informazioni (la marca, gli sconti, le descrizioni). Forse va bene per un riepilogo veloce o per i negozi che hanno prodotti molto semplici, ma non è sufficiente se abbiamo bisogno di sapere le quantità di ogni singola combinazione. Per ottenere questo dobbiamo usare la funzione Sql Manager, come illustrato nell'immagine seguente.


Bisogna aggiungere una nuova istruzione SQL con il bottone "Aggiungi Nuova Query SQL", inserire un nome a piacere nel primo campo, e incollare il codice seguente come query SQL.

SELECT p.active 'Attivo', m.name AS 'Marca', p.id_product AS 'ID', p.reference AS 'Rif.', pl.name AS 'Nome', GROUP_CONCAT(DISTINCT(al.name) SEPARATOR ", ") AS 'Combinazione', s.quantity AS 'Quantità', p.price AS 'Prezzo', IF(pr.reduction_type='amount',pr.reduction,'') AS 'Sconto valuta', IF(pr.reduction_type='percentage',pr.reduction,'') AS 'Sconto percento', pr.from AS 'Sconto da (yyyy-mm-dd)', pr.to AS 'Sconto a (yyyy-mm-dd)', p.weight AS 'Peso', GROUP_CONCAT(DISTINCT(cl.name) SEPARATOR ",") AS 'Categorie', pl.description_short AS 'Desc. breve', pl.description AS 'Desc. lunga'
FROM ps_product p
LEFT JOIN ps_product_lang pl ON (p.id_product = pl.id_product)
LEFT JOIN ps_manufacturer m ON (p.id_manufacturer = m.id_manufacturer)
LEFT JOIN ps_category_product cp ON (p.id_product = cp.id_product)
LEFT JOIN ps_category_lang cl ON (cp.id_category = cl.id_category)
LEFT JOIN ps_category c ON (cp.id_category = c.id_category)
LEFT JOIN ps_product_tag pt ON (p.id_product = pt.id_product)
LEFT JOIN ps_product_attribute pa ON (p.id_product = pa.id_product)
LEFT JOIN ps_specific_price pr ON (p.id_product = pr.id_product)
LEFT JOIN ps_stock_available s ON (p.id_product = s.id_product AND pa.id_product_attribute = s.id_product_attribute)
LEFT JOIN ps_product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute)
LEFT JOIN ps_attribute_lang al ON (al.id_attribute = pac.id_attribute)
WHERE pl.id_lang = 1
AND cl.id_lang = 1
AND p.id_shop_default = 1
AND c.id_shop_default = 1
GROUP BY pac.id_product_attribute

Fatto questo avrai una nuova funzionalità in Prestashop, puoi esportare il file CSV completo (oppure puoi vedere direttamente una tabella con i dati selezionando "vedi" invece di "esporta").

La tabella che risulta ha le seguenti colonne: stato (i prodotti attivi hanno 1), marca (il produttore), ID, codice riferimento, nome, combinazione, quantità, prezzo, sconto in valuta, sconto percentuale, sconto dal (yyyy-mm-dd), sconto al (yyyy-mm-dd), peso, categorie, descrizione breve, descrizione lunga. Nel file CSV le descrizioni sono già ripulite dai tag html.

Con piccole modifiche alla query è possibile ottenere altri dati.

Lunedì 13 Marzo 2017
(6 commenti)

Commento di Pasquale

Sabato 24 Giugno 2017

Ciao ragazzi, scusatemi, per quale motivo su alcuni siti mi esporta tutti i prodotti e su altri soltanto il primo? Grazie!

Risposta di Marco

E' difficile rispondere con poche informazioni. Potrebbe esserci un errore di interpretazione SQL (versione diversa di MySql nel server), oppure qualcosa non va nei dati esportati (descrizioni troppo lunghe, caratteri speciali, apici che rompono la stringa). Indagherei nel log errori.

Potrebbe anche essere un problema di memoria o tempo di esecuzione script, dovrebbe sempre apparire in log errori, se ciò non fosse sentirei l'hosting.

Commento di Francesca

Lunedì 27 Novembre 2017

Ciao ragazzi.
ho trovato utilissimo questo articolo che mi ha facilitato molto determinate attività.
Ma se avessi bisogno di esportare tutte queste info di un'unica categoria prodotto?
In che punto e cosa va inserito nello script?
Grazie!

Risposta di Marco

Ciao Francesca, devi aggiungere una istruzione WHERE. Quindi alla fine della lista di condizioni aggiungi:

AND cp.id_category = 12

Dove "12" è un ID ipotetico che mi sono inventato, devi mettere quello della categoria che stai filtrando. Non ho testato ma dovrebbe funzionare.

 

Commento di mirko

Martedì 16 Gennaio 2018

Ciao ragazzi, intanto faccio i complimenti per l'utilissimo articolo. Mi chiedo se c'è la possibilità di "amplificare" anche i dati di esportazione degli ordini. Il base è molto scarno, vorrei vedere per ogni ordine anche l'articolo acquistato.
Attualmente i campi sono questi:
Id Riferimento Nuovo cliente Consegna Cliente Azienda Totale Pagamento Stato Data

Grazie a tutti per le risposte

Risposta di Marco

Avevo fatto una SQL per esportare gli ordini in dettaglio, cioè con i dati dei prodotti acquistati, nel mio caso ogni prodotto crea una riga, quindi per gli ordini con vari prodotti ci saranno varie righe con ID ordine identico, sta a te poi filtrare il foglio di calcolo raggruppando per ID ordine e fare somme. I campi esportati sono:

ID ordine, Rif. ordine, Stato, Data ordine, prodotto, Cod. rif. (del prodotto), Qt., In stock, Prezzo, Pagamento, Cliente (nome e cognome), Spedizione (indirizzo), Fatturazione (indirizzo), Email, Gruppo cliente.

Non ho un articolo in blog, il codice MySql è questo.

Commento di Emilio

Mercoledì 24 Gennaio 2018

E se dovessi ricavare anche il link alla pagina del prodotto, il codice ean e il link alla immagine?
Se aggiungessi queste altre tre righe sarebbe perfetto per esportare un file da editare e dare in pasto a google merchant centre.

Please help!

Risposta di Marco

Puoi aggiungere il codice EAN mettendo nel SELECT un'altra variabile con "p.ean13 AS 'EAN13'," ad esempio dopo "p.reference AS 'Rif.',".

Per quanto riguarda invece l'URL del prodotto dipende molto da come stai facendo il friendly URL nelle impostazioni SEO, se hai tutto default (cioè con ID prodotto, trattino, alias con i trattini) postresti fare aggiungendo nel SELECT un CONCAT come il seguente, devi correggere le stringhe statiche con il path del tuo negozio.

CONCAT('https://tuosito.com/', p.id_product,'-', pl.link_rewrite, '.html') AS 'Prod. URL',

Mentre l'immagine è più complessa, serve aggiungere delle LEFT JOIN per ottenere altre informazioni e poi fare un CONCAT, non ho provato (non so nemmeno se si può fare tutto solo tramite query al DB, ad esempio se imposti supporto per PNG e JPG in base all'immagine originale, è sbagliato forzare l'estensione a ".jpg"), può aiutarti vedere questo esempio ma sarà da modificare: https://www.prestashop.com/forums/topic/554913-sql-query-for-export-all-images-url/

Commento di Giuseppe Errico

Martedì 30 Gennaio 2018

Ciao! Cercando in rete la soluzione al mio problema sono capitato in questa tua guida. La mia necessità è creare un csv del mio catalogo suddiviso nei seguenti campi:

categoria
reference
nome
ean
descrizione breve
fornitore
url_immagine (basta una)
prezzo
quantità

Potresti aiutarmi a scrivere la query in modo corretto per arrivare a questo risultato? Grazie

Risposta di Marco

Puoi cambiare a piacere l'ordine dei campi del SELECT.
Per l'immagine, come ho risposto in precedenza, la query si complica e non sono sicuro sia possibile ricavare un path corretto senza usare la logica contenuta nelle php che gestiscono e manipolano le immagini. Per gli altri campi, si può fare così:

SELECT GROUP_CONCAT(DISTINCT(cl.name) SEPARATOR ",") AS 'Categorie', p.reference AS 'Rif.', pl.name AS 'Nome', p.ean13 AS 'EAN', pl.description_short AS 'Desc. breve', p.supplier_reference AS 'Rif. fornitore', p.id_supplier AS 'ID fornitore', p.price AS 'Prezzo', s.quantity AS 'Quantità'

Per quanto riguarda i fornitori (supplier) ho messo due campi (id e riferimento), ma se ti serve la descrzione in lingua bisogna usare un altro campo:

sl.description AS 'Fornitore',

Però, in questo caso bisogna aggiungere anche una join più in basso:
LEFT JOIN ps_supplier_lang sl ON (p.id_supplier = sl.id_supplier)

Non l'ho provata, è sempre in teoria, fai una prova.

Commento di Giuseppe Errico

Lunedì 12 Febbraio 2018

Ciao , ho seguito la tua guida e creato l'istruzione SQL. Il problema è che quando avvio l'esportazione mi genera un file CSV contenente un solo prodotto (in catalogo ce ne sono 80mila).
Copio la query che ho inserito:

SELECT p.active 'Attivo', m.name AS 'Marca', p.id_product AS 'ID', p.reference AS 'Rif.', p.ean13 AS 'EAN13', pl.name AS 'Nome', GROUP_CONCAT(DISTINCT(al.name) SEPARATOR ", ") AS 'Combinazione', s.quantity AS 'Quantità', p.price AS 'Prezzo', IF(pr.reduction_type='amount',pr.reduction,'') AS 'Sconto valuta', IF(pr.reduction_type='percentage',pr.reduction,'') AS 'Sconto percento', pr.from AS 'Sconto da (yyyy-mm-dd)', pr.to AS 'Sconto a (yyyy-mm-dd)', GROUP_CONCAT(DISTINCT(cl.name) SEPARATOR ",") AS 'Categorie'
FROM ps_product p
LEFT JOIN ps_product_lang pl ON (p.id_product = pl.id_product)
LEFT JOIN ps_manufacturer m ON (p.id_manufacturer = m.id_manufacturer)
LEFT JOIN ps_category_product cp ON (p.id_product = cp.id_product)
LEFT JOIN ps_category_lang cl ON (cp.id_category = cl.id_category)
LEFT JOIN ps_category c ON (cp.id_category = c.id_category)
LEFT JOIN ps_product_tag pt ON (p.id_product = pt.id_product)
LEFT JOIN ps_product_attribute pa ON (p.id_product = pa.id_product)
LEFT JOIN ps_specific_price pr ON (p.id_product = pr.id_product)
LEFT JOIN ps_stock_available s ON (p.id_product = s.id_product AND pa.id_product_attribute = s.id_product_attribute)
LEFT JOIN ps_product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute)
LEFT JOIN ps_attribute_lang al ON (al.id_attribute = pac.id_attribute)
WHERE pl.id_lang = 1
AND cl.id_lang = 1
AND p.id_shop_default = 1
AND c.id_shop_default = 1
GROUP BY pac.id_product_attribute

Risposta di Marco

Ciao Giuseppe, non sei il primo ad averlo chiesto. Mi viene un sospetto, forse nelle vostre installazioni gli ID nella condizione "WHERE" non corrispondono a 1, magari erano installazioni in inglese a cui è stato aggiunto l'italiano dopo. Oppure è l'ID shop ad essere errato.

WHERE pl.id_lang = 1
AND cl.id_lang = 1
AND p.id_shop_default = 1
AND c.id_shop_default = 1

Prova ad aprire il database con PHPMyAdmin, eseguirei la query li dentro. Se ottieni lo stesso risultato allora è confermato che non dipende da Prestashop, invece è un problema di query, dovresti verificare nelle tabelle che valori di ID hai, ed eventualmente correggerli (intendo nella query, non nel tuo DB, non toccare gli ID che trovi). Quando la query è a posto la puoi riportarla in Prestashop.

PS: ti confermo che la tua query, nel mio caso funziona, restituisce molti record.
PS2: ho notato che non hai usato il link al prodotto, e neanche i supplier, forse quando dicevi "fornitori" intendevi i produttori? In quel caso il campo è un altro: ps_manufacturer non ps_supplier.

Aggiungi un commento

Nome
E-mail (non verrà pubblicata)
Sito Web
Commento