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.', 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)', p.weight AS 'Peso', GROUP_CONCAT(DISTINCT(cl.name) SEPARATOR ", ") AS 'Categorie', pl.description_short AS 'Desc. breve', pl.description AS 'Desc. lunga', GROUP_CONCAT( DISTINCT( pts.name) SEPARATOR ", " ) AS 'Tags' 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_tag pts ON (pt.id_tag = pts.id_tag) 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 p.id_product, 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, codice EAN, 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, tags. 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 però funzionano in PHPMyAdmin). 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 questi esperimenti ma dovrebbe funzionare.
Note dai commenti ricevuti
E se volessi esportare solo i prodotti di una categoria?
Dopo il Where, aggiungi una condizione come questa
AND cp.id_category = 12
Dove “12” è un ID ipotetico che mi sono inventato, devi mettere quello della categoria che stai filtrando.
E se volessi esportare gli ordini con i prodotti acquistati?
Per fare questo serve una Query diversa, l’ho messa qui, attenzione che 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 le righe per ID ordine e fare le 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.
E se dovessi ricavare anche il link alla pagina del prodotto, il codice ean e il link alla immagine?
Puoi aggiungere il codice EAN mettendo nel SELECT un’altra variabile scrivendo “p.ean13 AS ‘EAN13’,”
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è 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, non si riesce a ricavare solo con una query al database, serve la logica di Prestashop, quindi niente immagine.
E se mi servisse importare ed esportare i prodotti con tutti i dati?
Non puoi farlo con questi metodi semplici via Query, devi usare moduli specifici. Io uso due moduli di MyPresta.
Comments (0)