DF Faceted SEO — Ricerca a faccette e SEO PrestaShop
Indicizzazione intelligente delle URL a faccette, landing SEO e motore di filtri ad alte prestazioni per PrestaShop 8 e 9.
DF Faceted SEO trasforma la ricerca a faccette di PrestaShop in una leva SEO duratura e accelera le pagine di categoria da 10 a 30 volte grazie a un indice denormalizzato. Questa documentazione copre installazione, configurazione delle regole di indicizzazione, creazione di landing SEO e analisi delle statistiche delle combinazioni popolari.
Panoramica
Il modulo nativo ps_facetedsearch genera meccanicamente un URL per ogni combinazione di filtri possibile. Su un catalogo di alcune migliaia di prodotti con cinque faccette, sono milioni di URL che Google scansiona, diluendo il tuo crawl budget e il PageRank tra pagine quasi identiche.
DF Faceted SEO risolve questo problema in due modi paralleli:
- Indicizzazione intelligente: regole di business decidono quali combinazioni sono indicizzabili, quali ricevono
noindex followe dove punta il canonical. - Landing SEO dedicate: per combinazioni con forte potenziale commerciale (es. «scarpe rosse taglia 42»), crea landing con URL pulito, H1 personalizzato, meta personalizzati e contenuto editoriale per lingua.
Come bonus, il motore di ricerca del modulo sostituisce il motore nativo con un sistema molto più veloce basato su un indice denormalizzato e una cache a due livelli.
Requisiti
- PrestaShop 8.0 a 9.x
- PHP 8.1 o superiore
- MySQL 5.7 o MariaDB 10.3 minimo
- URL semplificate attivate (Preferenze → SEO e URL)
- Permessi MySQL standard per creare tabelle
Installazione
- Carica l’archivio ZIP da Moduli → Module Manager → Carica un modulo.
- Clicca su Installa. Il modulo crea automaticamente 10 tabelle
ps_dffacetedseo_*e 5 schede sotto Migliorare. - Vai a Migliorare → DF Faceted SEO → Dashboard.
- Clicca su Ricostruisci l’indice. Questo passaggio è obbligatorio la prima volta: senza indice, il motore di ricerca non ha dati.
- Svuota la cache PrestaShop: Parametri avanzati → Performance → Svuota la cache.
Su un catalogo da 50.000 prodotti, la ricostruzione dell’indice richiede tipicamente da 2 a 5 minuti. Il modulo inserisce le righe in lotti da 500.
Primi passi — Dashboard
La dashboard (Migliorare → DF Faceted SEO) mostra sei tasselli statistici:
- Regole attive: numero di regole di indicizzazione abilitate
- Landing: numero di landing SEO create
- Prodotti nell’indice: numero di prodotti indicizzati (dovrebbe essere vicino al totale catalogo)
- Righe nell’indice: numero di coppie (prodotto, valore di filtro) — la tabella denormalizzata
- Entrate in cache: numero di query in cache
- Combinazioni popolari: numero di combinazioni osservate
Sotto i tasselli, due blocchi di operazioni:
- Ricostruisci l’indice: utile dopo una grande modifica del catalogo (importazione massiva, modifica della struttura degli attributi)
- Svuota la cache: utile dopo una modifica di regola o impostazione
Regole di indicizzazione
Le regole decidono, per ogni combinazione di filtri visitata, quale tag robots e quale canonical vengono inviati al browser e a Google. Una regola ha uno scope (zona di applicazione) e una policy (decisione).
Scope disponibili
- Globale: si applica a tutte le pagine a faccette del catalogo
- Categoria specifica: si applica solo alle pagine di una categoria data
- Gruppo di attributi: si applica a combinazioni contenenti un gruppo specifico (es. tutte le pagine con Colore filtrato)
- Caratteristica: idem, per una caratteristica di prodotto
- Marca: idem, per un marchio
- Fascia di prezzo: si applica a pagine filtrate su una fascia di prezzo data
Policy disponibili
- Index, follow: pagina indicizzabile, canonical su se stessa normalizzato
- Noindex, follow: pagina non indicizzata, ma i link sono seguiti (raccomandato per combinazioni rare)
- Canonical parent: pagina accessibile ma il canonical punta alla categoria padre (il valore SEO viene trasferito)
- Canonical self normalizzato: canonical sulla pagina stessa con i filtri ordinati e raggruppati (elimina duplicati di URL per la stessa combinazione)
Catena di priorità
Il modulo valuta le regole dalla più specifica alla più generica. Concretamente, per una pagina della categoria Scarpe filtrata per colore:
- Il modulo cerca prima una regola scope
categorysu Scarpe - Se esiste e matcha, viene applicata
- Altrimenti cerca una regola scope
attribute_groupsu Colore - Altrimenti risale alla regola globale
- Se nessuna regola matcha, si applica la policy predefinita della dashboard
Campi avanzati di una regola
- Massimo filtri indicizzabili: se la combinazione contiene più filtri di questo limite, la policy scende automaticamente a
noindex follow. Esempio: 2 filtri massimo su scarpe (colore + taglia indicizzabili, ma non colore + taglia + materiale + stagione). - Whitelist di valori: ID di valori ammessi (separati da virgola). Una combinazione che contiene solo valori in whitelist è indicizzabile. Esempio: whitelist colori rosso, nero, bianco, blu — colori rari come «verde mela» non saranno indicizzati.
- Blacklist di valori: l’opposto. Ogni combinazione che contiene un valore in blacklist cade automaticamente a
noindex. - Minimo prodotti: se la combinazione non restituisce almeno questo numero di prodotti, passa a
noindex. Evita di indicizzare pagine quasi vuote. - Priorità: intero. In caso di conflitto tra due regole dello stesso scope, vince la priorità più alta.
Strategia di avvio consigliata: crea una regola globale con policy canonical parent e massimo 1 filtro indicizzabile, poi aggiungi progressivamente regole più specifiche per aprire l’indicizzazione di combinazioni ad alto potenziale.
Landing SEO
Le landing sono pagine dedicate a combinazioni di filtri strategiche. Hanno il proprio URL pulito, il proprio H1, i propri meta e contenuto editoriale per lingua.
Creare una landing
- Vai a Migliorare → DF Faceted SEO → Landing
- Clicca su Aggiungi
- Sezione Targeting: scegli la categoria ed eventualmente il marchio
- Sezione Visualizzazione: ordinamento di default, direzione, attivazione, indicizzazione, priorità
- Sezione Combinazione di filtri: aggiungi i filtri che compongono la combinazione (gruppo di attributi e valori, caratteristica o marca). Esempio: Colore = Rosso E Taglia = 42.
- Schede multilingua: per ogni lingua compila il nome interno, lo slug, l’H1, il meta title, la meta description, il contenuto intro e outro.
- Salva
Struttura dell’URL
L’URL di una landing segue lo schema:
https://tuo-dominio.com/landing/tuo-slug
https://tuo-dominio.com/en/landing/tuo-slug
https://tuo-dominio.com/fr/landing/tuo-slug
Il prefisso di lingua è gestito automaticamente dal router di PrestaShop non appena le URL semplificate sono attive e più lingue sono attive nel negozio.
Se ricevi un 404 sull’URL di una landing, verifica in quest’ordine: URL semplificate attive, .htaccess rigenerato (pulsante Salva in fondo a SEO e URL), cache svuotata, landing attiva nel modulo, hook moduleRoutes correttamente collegato al modulo in Moduli → Posizioni.
Contenuto editoriale
Per ogni lingua hai due blocchi HTML ricchi:
- Intro: mostrato sopra la griglia di prodotti. Ideale per un paragrafo SEO di 150-300 parole con le tue parole chiave target.
- Outro: mostrato sotto la griglia. Ideale per elementi di rassicurazione, guide all’acquisto, FAQ.
JSON-LD automatico
Ogni landing inietta automaticamente due blocchi JSON-LD nella pagina:
- BreadcrumbList: Home → Categoria → Landing
- Product: un blocco Product per prodotto mostrato (nome, prezzo, immagine, URL, disponibilità)
Ottieni automaticamente i rich snippet Google senza configurazione aggiuntiva.
Statistiche delle combinazioni popolari
Il modulo registra automaticamente, nella tabella ps_dffacetedseo_combination_log, ogni combinazione di filtri realmente visitata dai tuoi clienti: firma, numero di hit, ultima visita.
Sfruttare le statistiche
- Vai a Migliorare → DF Faceted SEO → Statistiche
- Filtra per categoria, hit minimi, limite di visualizzazione
- Ordina per hit decrescenti
- Identifica le combinazioni con più di 50 hit settimanali
- Clicca su Promuovi nella colonna azione
- Il modulo di landing si apre precompilato con la combinazione di filtri
- Devi solo compilare il contenuto editoriale e salvare
Manutenzione
In fondo alla pagina Statistiche c’è un pulsante Purga vecchi dati con un campo «giorni da conservare». Consigliato: purgare ogni 90 giorni per evitare crescita illimitata della tabella.
Parametri globali
La dashboard offre 11 parametri globali raggruppati in 3 sezioni.
Indicizzazione
- Policy predefinita: policy applicata quando nessuna regola matcha
- Massimo filtri indicizzabili: valore globale (può essere sovrascritto per regola)
- Minimo prodotti per combinazione: soglia globale
Performance
- TTL della cache (secondi): durata di un’entry in cache. Default: 3600 (1 ora). Aumenta a 86400 (24 h) in produzione stabile.
- Nascondi filtri vuoti: se attivato, i valori con 0 risultati sono nascosti
- Limite risultati per pagina: paginazione prodotti
URL
- Prefisso URL delle landing: default
landing. Lo schema della rotta è definito in duro nell’hookmoduleRoutese usa questo prefisso.
Canonical intelligente
Su ogni pagina a faccette, il modulo calcola il canonical ottimale:
- Combinazione che matcha una landing esistente: canonical = URL pretty della landing
- Combinazione indicizzabile secondo le regole: canonical = self normalizzato
- Combinazione non indicizzabile secondo le regole: canonical = categoria padre
- Pagina di categoria senza filtro: canonical = self standard
Motore di filtri ad alte prestazioni
Il motore si appoggia sulla tabella ps_dffacetedseo_index: una riga per coppia (prodotto, tipo di filtro, valore). La query diventa una semplice intersezione di insiemi di ID prodotto.
Cache a due livelli
- Livello 1: memoria (in-process). Evita di ripetere la stessa query due volte nella stessa pagina.
- Livello 2: database (tabella
ps_dffacetedseo_cache). Persiste i risultati tra le richieste con TTL.
Invalidazione automatica
Il modulo ascolta gli hook actionProductSave, actionProductDelete e actionCategoryUpdate. Ogni volta che un prodotto viene salvato, la sua entry nell’indice viene rigenerata e tutte le entry in cache collegate vengono invalidate.
AJAX e UX
Il pannello dei filtri front è interamente gestito in AJAX:
- Debounce di 250 ms sui cambi di filtri
pushStateper aggiornare l’URL senza reload- Aggiornamento in tempo reale dei tag
canonicalerobots - Scorrimento fluido verso la griglia di prodotti dopo l’aggiornamento
- Chip attivi cliccabili per rimuovere un singolo filtro
- Slider di prezzo con campi numerici e pulsante Applica
- Swatch colore visibili su attributi di tipo Colore
Multinegozio e multilingua
Il modulo è nativamente multinegozio e multilingua:
- Ogni landing ha traduzioni per lingua (tabella
ps_dffacetedseo_landing_page_lang) - Ogni landing può essere ristretta a uno o più negozi (tabella
ps_dffacetedseo_landing_page_shop) - Le regole di indicizzazione si applicano di default a tutti i negozi
- L’indice è partizionato per negozio
- Le traduzioni dell’interfaccia sono fornite in francese e inglese (XLIFF in
translations/)
Architettura tecnica
Hook utilizzati
displayHeader: canonical e meta robots dinamiciactionFrontControllerSetMedia: CSS e JS frontendmoduleRoutes: rotta pulita per le landingdisplayLeftColumn: iniezione del pannello filtridisplayBeforeBodyClosingTag: JSON-LD sulle landingactionProductSearchProviderRunQuery: integrazione con il motore PSactionProductSaveeactionProductDelete: reindicizzazione incrementaleactionCategoryUpdate: invalidazione della cache di categoriadisplayBackOfficeHeader: CSS e JS admin
Tabelle create
| Tabella | Ruolo |
|---|---|
dffacetedseo_rule |
Regole di indicizzazione per scope |
dffacetedseo_landing_page |
Landing (dati di business) |
dffacetedseo_landing_page_lang |
Traduzioni delle landing |
dffacetedseo_landing_page_shop |
Collegamenti multinegozio |
dffacetedseo_landing_filter |
Filtri associati alle landing |
dffacetedseo_combination_log |
Statistiche di visita |
dffacetedseo_cache |
Cache dei risultati |
dffacetedseo_filter_template |
Template di filtri riutilizzabili |
dffacetedseo_index |
Indice denormalizzato (chiave di performance) |
dffacetedseo_setting |
Parametri interni |
Convenzione URL dei filtri
?attribute_group__{id_group}=v1,v2&feature__{id_feature}=v3&manufacturer__0=5&price=10-50&s=needle
Viene calcolata una firma SHA-1 stabile per confrontare le combinazioni (matching landing, chiave di cache, log).
Performance attese
Misurazioni effettuate su un catalogo di riferimento (50.000 prodotti, 8 faccette attive):
| Motore | Tempo medio |
|---|---|
ps_facetedsearch nativo |
800 ms a 1,4 s per query |
| DF Faceted SEO senza cache | 50 a 120 ms |
| DF Faceted SEO con cache | meno di 10 ms |
Guadagno tipico: ×10 a ×30
FAQ tecnica
Bisogna disinstallare ps_facetedsearch?
No, il modulo si integra tramite gli hook ufficiali. Puoi testarlo in parallelo. Una volta validato, disinstalla ps_facetedsearch per evitare la duplicazione del pannello filtri.
È compatibile HTTPS e URL canonical assoluti?
Sì. Il modulo usa Context::getContext()->link->getPageLink() e getModuleLink() che rispettano la configurazione HTTPS di PrestaShop.
Come aggiungere una nuova lingua lato modulo?
Copia il file translations/fr-FR.xlf in translations/xx-XX.xlf e traduci le voci trans-unit. Nessun altro intervento necessario.
Supporta gli attributi combinati?
Sì. L’indice denormalizzato indicizza le declinazioni tramite i loro attributi. Il motore filtra i prodotti in cui almeno una declinazione corrisponde a tutti i filtri attivi.
Come debuggare una regola che non si applica?
Attiva i log PrestaShop (Parametri avanzati → Log) e consulta la sezione dffacetedseo.
Risoluzione dei problemi
Fatal error su una chiamata a getBySlug
Sintomo: Call to a member function getBySlug() on false. Causa: vecchio helper get() che restituiva false invece dell’oggetto servizio. Corretto in v1.0.1. Aggiorna il modulo.
404 sull’URL di una landing
Sintomo: https://tuo-sito/en/landing/tuo-slug restituisce 404. Causa tipica: l’hook moduleRoutes non è registrato o la cache delle rotte PrestaShop è obsoleta.
- Verifica che Preferenze → SEO e URL → Attiva URL semplificate sia su SÌ
- Salva questa pagina (rigenera l’
.htaccess) - Svuota la cache PrestaShop due volte
- Vai a Moduli → Posizioni, verifica che
dffacetedseosia collegato amoduleRoutes - Fallback di test:
https://tuo-sito/index.php?fc=module&module=dffacetedseo&controller=landing&slug=tuo-slug
Il motore di ricerca non restituisce alcun prodotto
L’indice è probabilmente vuoto. Vai alla dashboard e clicca su Ricostruisci l’indice.
I filtri non si mostrano nella colonna
Verifica in Moduli → Posizioni che dffacetedseo sia collegato all’hook displayLeftColumn.
Performance degradate dopo importazione massiva di prodotti
L’invalidazione incrementale funziona bene per modifiche singole. Dopo un’importazione massiva, è più veloce ricostruire l’indice intero dalla dashboard e svuotare la cache.
Aggiornamenti
Il modulo segue il versionamento MAJOR.MINOR.PATCH. Le correzioni critiche vengono fornite come patch; le nuove funzionalità attivano un bump minore. Ogni aggiornamento include uno script upgrade/upgrade-X.Y.Z.php che viene eseguito automaticamente.
Supporto
Per qualsiasi domanda o segnalazione di bug, contatta support@datafirefly.com indicando la versione PrestaShop, PHP, modulo e i log PHP/PrestaShop.