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.

Errore "checkedForm"

Per qualche motivo nelle versioni più recenti di Prestashop PHPSQLparser da sempre presenza di errore anche se è un falso positivo (le query funzionano in PHPMyAdmin). Ma non possono portare la libreria indietro di versione, viene usata diffusamente in Prestashop. Hanno messo il bug in milestone per Prestashop 1.7.6.0 (che sarà rilasciata 25/02/2019), mentre per PS 1.6 non so cosa faranno: https://github.com/PrestaShop/PrestaShop/issues/10908

Il workaround sarebbe non validare le query, anche se è sconsigliato. È a tuo rischio e pericolo. Credo sia da modificare la funzione validateSql in classes/RequestSql.php togliendo tutta la parte dei controlli, e lasciando sempre return true, eventualmente, se funziona, poi ripristina ogni signolo controllo fino a scoprire quale da fastidio: https://github.com/PrestaShop/PrestaShop/blob/develop/classes/RequestSql.php#L159

Non ho provato ma dovrebbe funzionare, i miei Prestashop sono di una versione meno recente e li sto lasciando fermi.

Lunedì 13 Marzo 2017
(15 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.

Commento di Dario

Mercoledì 04 Aprile 2018

La query riportata nell'esempio è un ottimo punto di partenza, ma non completa purtroppo.
Infatti non esporta il prezzo della combinazione, se quest'ultimo (il prezzo) viene inserito direttamente nella combinazione e non nella scheda prezzi. In questo caso come è possibile completare la query?? Grazie in anticipo!

Commento di Selene

Giovedì 16 Agosto 2018

Ciao, scusami per il disturbo ma ho bisogno di un tuo piccolo aiuto. Il codice che ai presentato va l’inserito direttamente in SQL Manager e poi in Query SQL al posto di quello che è già presente? Bisogna aggiungere qualche altra stringa o basta fare copia incolla? Grazie mille per il tuo aiuto, purtroppo non sono molto esperta

Risposta di Marco

Ciao Selene, non so perché vedi del codice all'interno del campo "Query SQL", in realtà dovrebbe essere vuoto. Credo che tu stia modificando una query messa da qualcuno in precedenza. Tu puoi in ogni caso farne una nuova, di query ne aggiungi fin che vuoi: pigia il bottone a forma di [+] per aggiungere una nuova query (i due campi dovrebbero essere vuoti), e poi incolla il mio codice dentro Query SQL. Puoi anche modificarlo se ti serve un risultato differente, ma devi imparare come funziona. Ulteriori istruzioni qui: http://doc.prestashop.com/display/PS16/SQL+Manager

 

Commento di Alessio

Mercoledì 22 Agosto 2018

Buonasera e grazie per tutte le info.

C’è possibilità di esportare anche tutti gli attibbuti e tutte le caratteristiche relativi a ogni singolo prodotto.

Grazie mille per l’aiuto

Risposta di Marco

Ciao Alessio, per gli attributi hai le combinazioni, quindi questa query è sufficiente. Mentre per le caratteristiche credo serva un'altra query. Per fare cose più complicate, con più query e con elaborazioni (tipo il path delle immagini) bisogna utilizzare del codice PHP, prova ad usare Prestools Suite che è uno script gratuito presente nel forum. È molto spartano ma potente, tra le altre cose permette di filtrare i prodotti anche con le caratteristiche (features), poi hai l'esportazione CSV.

Commento di francesco

Lunedì 10 Settembre 2018

io vorrei ricostruire il file per importare i prodotti , partendo da quello che ho già sul catalogo prodotti del sito, e quindi con tutti i campi della tabella prodotti sql, (compresi attivi e non attivi, tutti , si può avere la query grazie?

Risposta di Marco

Per fare questo prova a usare un modulo, ce n'è uno free nel forum: https://www.prestashop.com/forums/topic/37900-free-module-products-export-module-v261-updated-05042018/

Commento di EMANUELE

Lunedì 08 Ottobre 2018

quando inserisco la query, mi da il seguente errore:
Errore "checkedForm" indefinito

Risposta di Marco

Non mi risulta un errore del genere, un post in francese dice che si tratta della mancanza di AS nei parametri del SELECT, forse lo hai rimosso modificando la query.

Commento di Selene

Venerdì 19 Ottobre 2018

Ciao Marco, innanzitutto ti ringrazio per la tua precedente risposta. Ho provato a creare una nuova query che mi servirà poi per esportare un file CSV da inserire su Facebook. Ho inserito la stringa che hai creato peró quando salvo mi da errore “La tabella "ps_product" non esiste“, mi sai per caso dire come mai? Poi il nome della Query posso inserire tranquillamente anche solo la parola “Facebook”? Grazie mille ☺️

Risposta di Marco

Ciao Selene, se ti da quell'errore significa che il tuo database ha probabilmente un diverso prefisso per le tabelle, infatti "ps_" è default, ma niente vieta che all'atto dell'installazione sia stato usato qualcos'altro (lo stesso vale per Wordpress e altri CMS). Per verificare il nome corretto devi aprire il database attraverso un tool di amministrazione, te lo fornisce l'hosting, ad esempio PHPMyAdmin.

In Prestashop puoi nominare le tue query come preferisci, anche "Facebook".

Commento di giacomo

Sabato 24 Novembre 2018

ciao, ottima query ma nel mio caso la descrizione e la descrizione breve rimangono vuoti, su presta 1.6.1.0

Risposta di Marco

Non c'è motivo per cui siano vuote, forse i prodotti non hanno descrizioni. Controlla in database se la tabella ps_product_lang ha valori nei campi descritpion e description_short.

Commento di Fabio

Mercoledì 12 Dicembre 2018

Anche a me da l'errore Errore "checkedForm" indefinito. su phpadmin invece esuguo la tua query è funziona.

gli "AS" ci sono tutti.

che può essere?

Risposta di Marco

Sembra sia dovuto a un problema con il diverso modo di controllare gli errori di PHPSQLparser, per qualche motivo ora da sempre presenza di errore anche se è un falso positivo. Ma non possono portarlo indietro di versione, viene usato diffusamente in Prestashop, e hanno messo il bug in milestone per Prestashop 1.7.6.0 (25/02/2019), mentre per PS 1.6 non so cosa faranno: https://github.com/PrestaShop/PrestaShop/issues/10908

Il workaround sarebbe non validare le query, anche se questo è sconsigliato, bisogna sapere cosa stai facendo, ed è a tuo rischio e pericolo. Credo sia da modificare la funzione validateSql in classes/RequestSql.php togliendo tutta la parte dei controlli, e lasciando sempre return true: https://github.com/PrestaShop/PrestaShop/blob/develop/classes/RequestSql.php#L159

Non ho provato, i miei Prestashop sono di una versione funzionante e li sto lasciando così.

Commento di Vincenzo

Martedì 15 Gennaio 2019

Ciao ho un grosso problema, per me, che non riesco a risolvere..
Ho caricato articoli con diverse combinazioni, ad ogni combinazione c'è inserito un codice EAN e riferimento (che è uguale).

La mia esigenza è di aggiornare solamente le quantità di queste combinazioni usando una tabella con solo due colonne ossia riferimento/ean e quantità.

Se carico il file come prodotto non mi trova il codice della combinazione e mi crea un nuovo prodotto, se lo carico come combinazione non succede nulla.

Purtroppo non ho conoscenze di programmazione.

Per favore aiutatemi è davvero urgente. Grazie in anticipo!

Risposta di Marco

Per il tuo problema prova a seguire bene le istruzioni:

  1. Devono essere caricati primai  prodotti
  2. i codici REFERENCE di prodotti e di combinazioni devono essere tutti univoci
  3. Attenzione a come è il formato di attributi e valori, serve quello che vogliono con i separatori a due punti.

Importi seguendo queste istruzioni: https://support.prestashop.com/hc/en-us/articles/115000637291-8-5-Importing-combinations

Cioè va fatta una tabella con tutte le combinazioni così:

ID PRODOTTO / REFERENCE COMBINAZIONE / ATTRIBUTO / VALORE / QUANTITÀ  / REFERENCE PRODOTTO

1020 / REFCOMBI_01 / Taglia:select:2; Colore:color:1 / XL:1; red:1 / 10 / REFPROD

1020 / REFCOMBI_02 / Taglia:select:1; Colore:color:1 / L:1; black:1 / 7 / REFPROD

  • ID è il numero progressivo del prodotto.
  • REFERENCE della combinazione è importante, deve essere diverso per ognuna, se non lo trova da un errore di duplicazione.
  • Combinazione devi scrivere tre valori separati da :, e sono il nome, il tipo di attributo (va select, color, o radio), la posizione è quella nel menu (esempio, se hai tre combinazioni con attributi della taglia, li ordini per mettere S, M e L).
  • Valore è ancora con due valori separati da :, e va l'attributo e posizione (ma questa non importa, metti 1). I colori vanno con il nome in inglese. Il radio è booleano.
  • Quantità è un numero intero.
  • REFERENCE prodotto è il codice generico.

Qui spiegano ancora sul fatto di usare i due punti: https://www.prestashop.com/forums/topic/195033-product-combination-csv-import/

Altrimenti usa un modulo che possa fare al caso tuo, ad esempio: https://addons.prestashop.com/it/data-import-export/3141-import-and-syncronize-products-quantities.html

Aggiungi un commento

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