Gestione di combinazioni e attributi di prodotto complessi su larga scala in PrestaShop

Quattro attributi su un prodotto. Diciannove valori sul primo, otto, otto e tre. Ciò equivale a 3,648 varianti di un articolo, e non è una semplice ipotesi: un commerciante ha segnalato esattamente questo sul sistema di tracciamento dei problemi di PrestaShop , per 30 prodotti e oltre 100,000 righe di database.

Le pagine dei loro prodotti sono andate in timeout e il back office ha restituito una schermata bianca vuota. 

Non si era rotto nulla. Il catalogo funzionava esattamente come era stato progettato, su una scala per la quale nessuno aveva previsto un'ottimizzazione.

Il problema che molti proprietari scoprono troppo tardi è che le combinazioni di prodotti PrestaShop sono esponenti, non somme. Dieci valori in un gruppo e dieci in un altro ti danno cento varianti da prezzare, tenere in magazzino e fotografare, non venti. Una gestione efficace delle combinazioni di prodotti PrestaShop inizia da qui.

1.0 Attributi e combinazioni di PrestaShop: qual è la differenza?

Due termini vengono costantemente confusi, e la differenza che emerge è fondamentale per la creazione del catalogo.

Gli attributi del prodotto PrestaShop sono gli elementi che il cliente seleziona: dimensioni, colore, capacità di archiviazione. Una caratteristica , invece , è un testo descrittivo presente sulla pagina e non selezionabile: peso, materiale, paese di origine. La documentazione di PrestaShop lo spiega chiaramente: un cliente può acquistare una variante di iPad in base al colore e alla capacità di archiviazione, ma non in base al peso.

Se si sbaglia in questo, si finisce per pagare caro in entrambi i casi. Trattare una funzionalità come un attributo genera centinaia di varianti tra cui nessuno sceglierà mai, ognuna con righe in cinque tabelle. Il contrario è peggio: i clienti non possono acquistare la versione che desideravano.

La struttura è composta da tre livelli. Un gruppo di attributi, come ad esempio "Taglia", contiene valori quali "Piccolo" e "Medio", e una combinazione rappresenta una singola corrispondenza tra tutti i gruppi. Nel backend, ciò corrisponde a una riga nella tabella "product_attribute" , che contiene il proprio riferimento, la regolazione del prezzo, il peso e la disponibilità in magazzino.

2.0 Perché le combinazioni di prodotti PrestaShop si moltiplicano così rapidamente?

Il prodotto cartesiano completo – ovvero ogni valore di ciascun gruppo considerato insieme a ogni valore di ogni altro gruppo – è ciò che il generatore di combinazioni di PrestaShop produce. Il conteggio delle varianti di prodotto di PrestaShop corrisponde a questi numeri moltiplicati, non sommati.

Osserva con quanta rapidità ti sfugge di mano.

Tre gruppi, sessanta varianti. Un quarto gruppo di tre valori porterebbe il totale a 180.

Gruppi di attributiValori in ciascunoCombinazioni create
2 (Taglia, Colore)5 e 420
3 (Taglia, Colore, Materiale)5, 4 e 360
4 (Dimensioni, Colore, Materiale, Finitura)5, 4, 3 e 3180
4 (come riportato nel numero 12915)19, 8, 8 e 33,648

Aggiungendo un altro gruppo di tre valori, il totale triplica. Non più tre: moltiplicato per tre. Questo singolo dettaglio inganna più commercianti di qualsiasi altra cosa nella gestione delle combinazioni di PrestaShop.

Prima di cliccare su Genera, è bene sapere che la piattaforma non impone alcun limite superiore . Il generatore è ricorsivo e produce combinazioni una alla volta, senza che sia definito alcun limite massimo all'interno della classe.

3.0 Cosa fa il database quando si generano combinazioni

Una singola combinazione non corrisponde mai a una singola riga. Tutt'altro. È questo il dettaglio che sfugge a chi guarda un catalogo sovradimensionato e si chiede da dove derivi una tale mole.

Genera una combinazione e PrestaShop scriverà su cinque tabelle separate:

  • attributo_prodotto detiene la combinazione stessa, con il suo riferimento e l'impatto sul prezzo.
  • Le impostazioni di prezzo e di magazzino specifiche del negozio vanno in negozio_attributo_prodottouna fila per negozio.
  • combinazione_attributo_prodotto collega la combinazione ai suoi valori di attributo. Fondamentalmente, questo è una riga per attributo, quindi una combinazione di quattro attributi scrive da sola quattro righe qui.
  • Stock vive in stock_disponibile, di nuovo per negozio.
  • Infine, il lingua_attributo_prodotto Memorizza le etichette di disponibilità, una riga per lingua.

Cinque tabelle per ogni combinazione, due delle quali si adattano al numero di attributi e lingue.

Ora, eseguiamo i calcoli su quel prodotto con 3,648 combinazioni, ipotizzando quattro attributi, 2 lingue e 1 negozio. Otteniamo 3,648 righe per product_attribute, altre 3,648 per product_attribute_shop, 14,592 per product_attribute_combination, 3,648 per stock_available e 7,296 per product_attribute_lang. In totale, 32,832 righe per un singolo prodotto.

Moltiplicando per 30 prodotti, si arriva a circa un milione di righe. Il commerciante citato in quel numero ne ha riportate oltre 100,000, collocandosi quindi nella fascia più prudente delle stime.

Lingue e negozi moltiplicano ulteriormente il totale, quindi tre lingue su due negozi non sono certo un piccolo onere aggiuntivo per la gestione delle varianti di prodotto di PrestaShop . Molti di questi conteggi si moltiplicano direttamente.

4.0 Prestazioni combinate PrestaShop per cataloghi di grandi dimensioni

Lo spazio di archiviazione è economico e un milione di righe non sono nulla per un database. Allora perché quelle pagine prodotto erano così lente?

La risposta risiede nel controller del front office, ed è più specifica di una semplice lentezza generica.

Aprendo la pagina di un prodotto come cliente, PrestaShop chiama il metodo getAttributesGroups() senza alcun filtro, restringendo la ricerca alla combinazione visualizzata sullo schermo. Vengono restituite tutte le 3,648 righe di combinazioni per quel prodotto. Per ogni visualizzazione di pagina, prima ancora che il visitatore abbia cliccato su qualcosa.

Poi il prezzo aumenta. Il controller scorre le righe e chiama Product::getPriceStatic() una volta per ogni combinazione per stabilire se si applica un prezzo specifico. Quasi quattromila calcoli di prezzo, ognuno con la propria logica di tasse e sconti, per visualizzare una singola pagina.

Qui nulla dipende da ciò che sceglie il visitatore. Il lavoro si svolge comunque.

Gli sviluppatori di PrestaShop ne sono a conoscenza. Proprio sopra quella query, nel codice sorgente della versione 8.2.6, si trova un commento di un manutentore principale che chiede se il codice debba recuperare solo i gruppi anziché tutte le varianti. La domanda è presente nel codice da anni.

Da questo progetto derivano due conseguenze pratiche:

  • Il tempo di caricamento della pagina dipende dal numero di combinazioni possibili, non da ciò che il cliente seleziona effettivamente. Un prodotto con 3,600 varianti risulta lento anche per un visitatore che abbandona la pagina immediatamente.
  • Le regole di prezzo specifiche peggiorano la situazione, perché ognuna aggiunge lavoro all'interno di un ciclo che viene già eseguito migliaia di volte. Questa è la trappola più grande in assoluto. Gestione combinata di cataloghi di grandi dimensioni in PrestaShop.

Da sapere: un negozio senza combinazioni salta completamente la query, poiché Combination::isFeatureActive() restituisce un valore in anticipo.

5.0 Come gestire migliaia di combinazioni di prodotti in PrestaShop

5.1 Riduci il conteggio degli attributi prima di ogni altra cosa

Ogni gruppo che rimuovi divide il tuo totale, quindi questa è la modifica con l'effetto maggiore e, tecnicamente, non costa nulla.

Per ogni gruppo, ponetevi una domanda diretta: un cliente si rifiuterà di acquistare se non può scegliere questa opzione? Finitura, tipo di imballaggio e numero di fili per pollice quadrato solitamente non superano questa prova. Spostateli tra le caratteristiche.

Eliminando un gruppo di tre valori da quel prodotto di 3,648 combinazioni, si arriva a 1,216. Una sola decisione, e due terzi delle righe spariscono.

5.2 Suddividere in prodotti separati quando una variante è in realtà un prodotto

Per le varianti autentiche di un articolo, gli attributi sono appropriati. Quando le opzioni differiscono a tal punto che i clienti le cercano separatamente, o quando si desiderano fotografie e URL distinti, si tratta di prodotti separati che indossano una veste da variante.

I prodotti separati vengono indicizzati meglio, poiché ognuno ha il proprio URL e la propria meta descrizione. Una combinazione di prodotti non ha né l'uno né l'altro.

5.3 Generare e poi modificare in blocco

Per le combinazioni di prodotti in blocco su PrestaShop , il generatore è più efficace della creazione manuale delle varianti. Genera l'intero set, quindi elimina ciò che non hai in magazzino: questo è il fulcro pratico della gestione delle combinazioni di prodotti in blocco su PrestaShop . Durante la generazione, PrestaShop disattiva specifiche regole di prezzo e le applica in un'unica passata alla fine, quindi la prima esecuzione è più veloce di quanto sembri.

La rigenerazione su un set esistente si comporta in modo diverso. Prima di creare ogni combinazione, PrestaShop interroga il database per verificare se quella coppia di attributi esiste già. Migliaia di combinazioni, migliaia di ricerche. Per questo motivo, una seconda esecuzione risulta molto più lenta della prima.

5.4 Quando una combinazione è lo strumento completamente sbagliato

Eliminare i gruppi di attributi solleva una domanda ovvia: che fine fa l'opzione appena rimossa? A volte diventa una funzionalità. A volte non è la soluzione ideale.

Incisione di testo, monogramma, data di consegna, logo caricato. Nessuno di questi elementi può essere una combinazione, perché una combinazione richiede un elenco finito di valori definiti in anticipo.

Questi elementi appartengono a un campo prodotto personalizzato, che PrestaShop chiama personalizzazione:

  • Una combinazione è finita, definita in anticipo e ha un valore predefinito. Ciascuna costa righe su cinque tabelle.
  • Aperto e compilato dal cliente: il campo personalizzato non occupa spazio nel magazzino e ha lo stesso costo sia per prodotti con 3 varianti che con 3000.

I due elementi lavorano insieme. Una t-shirt può riportare taglia e colore come combinazioni, accettando al contempo un nome stampato come campo personalizzato, e la riga dell'ordine mostra entrambi.

Prima di iniziare, è bene sapere che c'è un aspetto da tenere presente. PrestaShop identifica una riga del carrello in base al prodotto e alla combinazione, quindi due clienti che ordinano la stessa tazza con un'incisione diversa verrebbero raggruppati in un'unica riga con quantità due. I moduli che risolvono questo problema sovrascrivono i metodi Cart::updateQty , Cart::getProducts e Cart::deleteProduct , quindi applicano una funzione hash ai valori inviati per mantenere separate le righe.

5.5 Due problemi che si presentano solo dopo aver effettuato un ordine

L'ordine memorizza la combinazione all'interno del nome del prodotto. Quando viene effettuato un ordine, PrestaShop non conserva un riferimento alla combinazione per recuperarla in seguito. Scrive la combinazione nel nome e memorizza quella stringa, quindi order_detail.product_name finisce per contenere qualcosa come T-shirt con stampa Colibrì (Taglia: S – Colore: Bianco ).

Con ogni attributo che imposti per un campo, la stringa si allunga di un elemento poiché ogni valore e gruppo viene aggiunto. Quattro gruppi, ad esempio, creano una coda lunghissima su un nome già di per sé lungo.

Il problema risiede nella larghezza della colonna, che varia a seconda della versione di PrestaShop in uso.

PrestaShop 1.7, la larghezza della colonna è varchar(255). Le versioni 8 e 9 utilizzano MEDIUMTEXT, e sembra anche che la dimensione varchar per questo campo nella versione 1.7 non sia dichiarata e la lunghezza non venga verificata prima dell'inserimento, ma venga semplicemente troncata da MySQL dopo 255 caratteri.

Nessuno si accorge dell'errore. L'ordine viene salvato e la perdita si manifesta in seguito nella fattura o nell'elenco degli ordini, dove due varianti possono sembrare identiche perché il componente che le distingue è proprio quello che è stato tagliato. L'aggiornamento a una versione superiore alla 1.7 elimina questo limite.

Il testo di personalizzazione viene trasmesso all'email di conferma come stringa e PrestaShop genera dinamicamente questo testo all'interno di PHP con il markup desiderato, con le etichette inserite all'interno e le voci delimitate da <br />. Il template dell'email quindi riproduce il valore senza utilizzare tag contrassegnati come sicuri e, poiché i template delle email vengono eseguiti con la funzionalità di escape di Smarty abilitata, tutti questi tag vengono trasformati in entità.

Il cliente legge le etichette invece di vedere un'etichetta in grassetto e un'interruzione di riga. Inviati un ordine di prova con un prodotto personalizzato, poiché lo stesso ordine può essere visualizzato correttamente nella fattura PDF mentre nell'e-mail mostra il markup grezzo.

5.6 Osserva l'andamento di prezzi specifici

Ogni regola di prezzo specifica aggiunge lavoro all'interno di quel ciclo per combinazione, ed è per questo che una manciata di regole non costa nulla su un catalogo piccolo ma diventa il problema principale su uno grande. Ricordate il commerciante del numero 12915: un prezzo personalizzato diverso per ognuna delle 3,600 varianti.

Quando una differenza di prezzo si applica a un intero gruppo, utilizzare il campo "Impatto del prezzo combinato" anziché una regola di prezzo specifica. Si trova direttamente nella riga della combinazione e la sua consultazione non comporta costi aggiuntivi.

6.0 Cosa è cambiato tra PrestaShop 1.7 e 9?

Ce ne sono parecchie, e le differenze sono importanti se stai seguendo un tutorial più vecchio.

In PrestaShop 9, la vecchia pagina prodotto non è più disponibile. La pagina ricostruita introdotta con la versione 1.7 e perfezionata nelle versioni successive (8.x) è ora l'unica opzione a tua disposizione. Le note per gli sviluppatori della versione 9.0 confermano che la vecchia pagina non è più raggiungibile. Pertanto, ogni screenshot presente nei tutorial precedenti mostra un'interfaccia che non è più disponibile.

Gli autori dei moduli hanno più cose da verificare. Ogni elemento collegato alla vecchia pagina del prodotto è stato rimosso nella versione 9.0, insieme alla famiglia actionAdminProductsController . Se vi affidate a uno di questi per la gestione delle combinazioni, quel modulo deve essere riscritto.

Anche due modifiche ai dati possono trarre in inganno gli utenti. L'attributo `price` è stato rimosso da `Product::getProductProperties` e le funzionalità non sono più incluse di default in `getProductsProperties`. Entrambe le modifiche non generano alcun errore.

Sul fronte delle prestazioni, ci sono buone notizie recenti. PrestaShop 9.1 ha introdotto, secondo le note di rilascio, un significativo miglioramento delle prestazioni del carrello per i negozi con molte combinazioni di prodotti . Gestisci un ampio catalogo di varianti con la versione 9.0? Già solo questo giustifica l'aggiornamento.

Se utilizzi ancora la versione 1.7, una modifica allo schema è rilevante. La colonna order_detail.product_name era di tipo varchar(255) in quella versione, mentre nelle versioni 8 e 9 è di tipo MEDIUMTEXT; pertanto, l'aggiornamento elimina il troncamento silenzioso descritto in precedenza.

Il comportamento fondamentale, tuttavia, non è cambiato. Le combinazioni restano un prodotto cartesiano, illimitato, distribuito sulle stesse cinque tabelle, e contare prima di generare è importante tanto su 9 quanto lo era su 1.7.

7.0 Un ordine pratico per lavorare in

Di fronte a un catalogo diventato ingestibile, è consigliabile seguire questi passaggi in ordine. Ecco una breve guida su come gestire le varianti di prodotto su larga scala in PrestaShop.

  1. Prima di tutto, conta. Moltiplica i valori degli attributi prima di cliccare su Genera. Se superi qualche centinaio per un singolo prodotto, fermati e riconsidera la situazione.
  2. Un qualsiasi gruppo di attributi potrebbe essere invece una funzionalità o un campo personalizzato aperto?
  3. Quali varianti meritano una pagina prodotto a sé stante? Tutto ciò che desideri venga trovato separatamente nei risultati di ricerca.
  4. Verifica le regole di prezzo specifiche per i prodotti con molte varianti, sostituendo, ove possibile, il campo relativo all'impatto del prezzo combinato.
  5. Effettua un ordine di prova per un prodotto con diversi attributi e una personalizzazione, quindi leggi la riga dell'ordine e l'e-mail di conferma. I nomi lunghi vengono troncati nella versione 1.7 e l'e-mail non viene formattata correttamente.
  6. Utilizzi PrestaShop 9.0 con un catalogo di varianti di grandi dimensioni? Aggiorna alla versione 9.1 per migliorare le prestazioni del carrello.

8.0 La versione breve

Le combinazioni si moltiplicano e questa moltiplicazione ha un impatto sul database più rapido di quanto la maggior parte dei commercianti si aspetti. Cinque tabelle per ogni combinazione. Un prodotto con quattro attributi e qualche migliaio di varianti può contenere 30,000 righe.

Il problema di prestazioni si riscontra nella pagina del prodotto, non nello storage. PrestaShop carica ogni combinazione e ne calcola il prezzo singolarmente, in ogni visualizzazione, indipendentemente dal fatto che il visitatore apra o meno il menu a tendina.

La soluzione più efficace rimane la più semplice. Un minor numero di gruppi di attributi significa un numero esponenzialmente inferiore di combinazioni, quindi è meglio eseguire la moltiplicazione prima di generare qualsiasi cosa.

Grazie per la lettura.

Se hai domande o necessiti di assistenza per le prestazioni o la migrazione del tuo sito web, i nostri esperti sono a tua disposizione. Contatta oggi stesso il team di Knowband all'indirizzo [email protected] per plugin eCommerce affidabili e personalizzati in base alle tue esigenze.

Lascia un Commento