DF Faceted SEO: wyszukiwanie fasetowe i SEO w PrestaShop
Inteligentne indeksowanie fasetowych adresów URL, landing pages SEO i wysokowydajny silnik filtrów dla PrestaShop 8 i 9.
DF Faceted SEO zamienia wyszukiwanie fasetowe PrestaShop w trwałą dźwignię SEO i przyspiesza strony kategorii 10 do 30 razy dzięki zdenormalizowanemu indeksowi. Ta dokumentacja obejmuje instalację, konfigurację reguł indeksowania, tworzenie landing pages SEO i wykorzystanie statystyk popularnych kombinacji.
Prezentacja
Natywny moduł ps_facetedsearch mechanicznie generuje adres URL dla każdej możliwej kombinacji filtrów. Na katalogu kilku tysięcy produktów z pięcioma fasetami daje to miliony adresów, które Google eksploruje, rozcieńczając budżet crawlowania i PageRank między niemal identycznymi stronami.
DF Faceted SEO rozwiązuje ten problem równolegle na dwa sposoby:
- Inteligentne indeksowanie: reguły biznesowe decydują, które kombinacje są indeksowalne, które otrzymują
noindex followi gdzie wskazuje canonical. - Dedykowane landing pages SEO: dla kombinacji o wysokim potencjale komercyjnym (na przykład „czerwone buty rozmiar 42″) twórz strony docelowe z czystym adresem, H1, meta i własnymi treściami per język.
Dodatkowo silnik wyszukiwania modułu zastępuje silnik natywny systemem znacznie szybszym, opartym na zdenormalizowanym indeksie i dwupoziomowym cache.
Wymagania
- PrestaShop 8.0 do 9.x
- PHP 8.1 lub nowsze
- MySQL 5.7 lub MariaDB 10.3 minimum
- Włączone przyjazne adresy URL (Preferencje / SEO i adresy URL)
- Standardowe uprawnienia do tworzenia tabel MySQL
Instalacja
- Wgraj archiwum ZIP przez Moduły / Menedżer modułów / Wgraj moduł.
- Kliknij Zainstaluj. Moduł automatycznie tworzy 10 tabel
ps_dffacetedseo_*i 5 zakładek w menu Ulepszenia. - Przejdź do Ulepszenia / DF Faceted SEO / Pulpit.
- Kliknij Odbuduj indeks. Ten krok jest obowiązkowy za pierwszym razem: bez indeksu silnik wyszukiwania modułu nie ma żadnych danych do wykorzystania.
- Wyczyść cache PrestaShop: Parametry zaawansowane / Wydajność / Wyczyść cache.
Na katalogu 50 000 produktów odbudowa indeksu trwa typowo od 2 do 5 minut. Moduł wstawia wiersze partiami po 500.
Pierwsze kroki: pulpit
Pulpit (Ulepszenia / DF Faceted SEO) wyświetla sześć kafelków statystycznych:
- Aktywne reguły: liczba włączonych reguł indeksowania
- Landing pages: liczba utworzonych stron docelowych SEO
- Produkty w indeksie: liczba zaindeksowanych produktów (powinna być zbliżona do sumy katalogu)
- Wiersze w indeksie: liczba par (produkt, wartość filtra), czyli tabela zdenormalizowana
- Wpisy w cache: liczba zapytań w pamięci podręcznej
- Popularne kombinacje: liczba zaobserwowanych kombinacji filtrów
Pod kafelkami znajdują się dwa bloki operacji:
- Odbuduj indeks: przydatne po dużej modyfikacji katalogu (import masowy, zmiana struktury atrybutów)
- Wyczyść cache: przydatne po modyfikacji reguł lub ustawień
Reguły indeksowania
Reguły decydują, dla każdej odwiedzonej kombinacji filtrów, jaki znacznik robots i jaki canonical są wysyłane do przeglądarki i do Google. Reguła ma zakres (obszar zastosowania) i politykę (decyzję).
Dostępne zakresy
- Globalny: obowiązuje na wszystkich stronach fasetowych katalogu
- Konkretna kategoria: obowiązuje wyłącznie na stronach danej kategorii
- Grupa atrybutów: obowiązuje na kombinacjach zawierających konkretną grupę (na przykład wszystkie strony, gdzie filtrowany jest Kolor)
- Cecha: analogicznie, dla cechy produktu
- Marka: analogicznie, dla marki (producenta)
- Przedział cenowy: obowiązuje na stronach filtrowanych po danym zakresie cen
Dostępne polityki
- Index, follow: strona indeksowalna, canonical wskazujący na nią samą w postaci znormalizowanej
- Noindex, follow: strona nieindeksowana, ale linki są podążane (zalecane dla rzadkich kombinacji)
- Canonical do rodzica: strona dostępna, ale canonical wskazuje na kategorię nadrzędną (wartość SEO jest przenoszona)
- Znormalizowany canonical self: canonical na samą stronę z posortowanymi i pogrupowanymi filtrami (eliminuje duplikaty adresów dla tej samej kombinacji)
Łańcuch priorytetów
Moduł ocenia reguły od najbardziej szczegółowej do najbardziej ogólnej. Konkretnie, dla strony kategorii Buty filtrowanej po kolorze:
- Moduł szuka najpierw reguły o zakresie
categorydla Butów - Jeśli istnieje i pasuje, zostaje zastosowana
- W przeciwnym razie szuka reguły o zakresie
attribute_groupdla Koloru - W przeciwnym razie wspina się do reguły globalnej
- Jeśli żadna reguła nie pasuje, stosowana jest polityka domyślna z pulpitu
Zaawansowane pola reguły
- Maksimum indeksowalnych filtrów: jeśli kombinacja zawiera więcej filtrów niż ten limit, polityka automatycznie przechodzi w
noindex follow. Przykład: maksymalnie 2 filtry na butach (kolor i rozmiar indeksowane, ale nie kolor plus rozmiar plus materiał plus sezon). - Whitelista wartości: ID dozwolonych wartości (oddzielone przecinkami). Kombinacja zawierająca wyłącznie wartości z whitelisty jest indeksowalna. Przykład: whitelista dla kolorów czerwonego, czarnego, białego i niebieskiego, przez co rzadkie kolory typu „zielone jabłko” nie będą indeksowane.
- Blacklista wartości: odwrotność. Każda kombinacja zawierająca wartość z blacklisty automatycznie trafia w
noindex. - Minimum produktów: jeśli kombinacja nie zwraca co najmniej tej liczby produktów, przechodzi w
noindex. Zapobiega indeksowaniu niemal pustych stron. - Priorytet: liczba całkowita. W razie konfliktu między dwiema regułami o tym samym zakresie wygrywa wyższy priorytet.
Zalecana strategia na start: utwórz regułę globalną z polityką canonical do rodzica i maksymalnie 1 indeksowalnym filtrem, następnie stopniowo dodawaj bardziej szczegółowe reguły, aby otworzyć indeksowanie kombinacji o wysokim potencjale.
Landing pages SEO
Landing pages to strony docelowe dedykowane strategicznym kombinacjom filtrów. Mają własny czysty adres, własny H1, własne meta i treść redakcyjną per język.
Tworzenie landing page
- Przejdź do Ulepszenia / DF Faceted SEO / Landing pages
- Kliknij Dodaj
- Sekcja Celowanie: wybierz kategorię i ewentualnie odpowiednią markę
- Sekcja Wyświetlanie: sortowanie domyślne, kierunek, aktywacja, indeksowanie, priorytet
- Sekcja Kombinacja filtrów: dodaj filtry składające się na kombinację (grupa atrybutów i wartości, cecha lub marka). Przykład: Kolor = Czerwony ORAZ Rozmiar = 42.
- Zakładki wielojęzyczne: uzupełnij dla każdego języka nazwę wewnętrzną, slug adresu, H1, meta title, meta description, treść intro i treść outro.
- Zapisz
Struktura adresu URL
Adres landing page ma następujący wzorzec:
https://twoja-domena.pl/landing/twoj-slug
https://twoja-domena.pl/en/landing/twoj-slug
https://twoja-domena.pl/pl/landing/twoj-slug
Prefiks języka jest obsługiwany automatycznie przez router PrestaShop, gdy tylko włączone są przyjazne adresy URL, a w sklepie aktywnych jest kilka języków.
Jeśli otrzymujesz 404 na adresie landingu, sprawdź w tej kolejności: włączone przyjazne adresy URL, zregenerowany .htaccess (przycisk Zapisz na dole strony SEO i adresy URL), wyczyszczony cache, aktywny landing w formularzu, hook moduleRoutes poprawnie podpięty do modułu w Moduły / Pozycje.
Treść redakcyjna
Dla każdego języka dostępne są dwa bogate bloki HTML:
- Intro: wyświetlany nad siatką produktów. Idealny na akapit wprowadzający SEO liczący 150 do 300 słów z Twoimi docelowymi słowami kluczowymi.
- Outro: wyświetlany pod siatką. Idealny na elementy budujące zaufanie, poradniki zakupowe i FAQ.
Automatyczny JSON-LD
Każda landing page automatycznie wstrzykuje na stronę dwa bloki JSON-LD:
- BreadcrumbList: Strona główna, Kategoria, Landing
- Product: jeden blok Product na każdy wyświetlany produkt (nazwa, cena, zdjęcie, adres, dostępność)
Otrzymujesz automatycznie rich snippety Google bez dodatkowej konfiguracji.
Statystyki popularnych kombinacji
Moduł automatycznie zapisuje w tabeli ps_dffacetedseo_combination_log każdą kombinację filtrów realnie odwiedzoną przez klientów: sygnaturę, liczbę trafień, ostatnie wyświetlenie.
Wykorzystanie statystyk
- Przejdź do Ulepszenia / DF Faceted SEO / Statystyki
- Przefiltruj po kategorii, minimalnej liczbie trafień i limicie wyświetlania
- Posortuj malejąco po trafieniach
- Wychwyć kombinacje z ponad 50 trafieniami tygodniowo
- Kliknij Awansuj w kolumnie akcji
- Formularz landing page otwiera się wstępnie wypełniony kombinacją filtrów
- Pozostaje tylko uzupełnić treść redakcyjną i zapisać
Utrzymanie
Na dole strony Statystyki znajduje się przycisk Wyczyść stare dane z polem „liczba dni do zachowania”. Zalecane: czyszczenie co 90 dni, aby uniknąć nieograniczonego wzrostu tabeli.
Ustawienia globalne
Pulpit udostępnia 11 ustawień globalnych pogrupowanych w 3 sekcje.
Indeksowanie
- Polityka domyślna: polityka stosowana, gdy żadna reguła nie pasuje
- Maksimum indeksowalnych filtrów: wartość globalna (może być nadpisana przez regułę)
- Minimum produktów na kombinację: globalny próg uznania strony za indeksowalną
Wydajność
- TTL cache (sekundy): czas życia wpisu w cache. Domyślnie: 3600 (1 godzina). Zwiększ do 86400 (24 h) na stabilnej produkcji.
- Ukryj puste filtry: jeśli włączone, wartości z 0 wynikami są ukrywane w panelu filtrów
- Limit wyników na stronę: paginacja produktów
Adresy URL
- Prefiks adresów landingów: domyślnie
landing. Wzorzec trasy jest zdefiniowany na sztywno w hookumoduleRoutesmodułu i używa tego prefiksu.
Inteligentny canonical
Na każdej stronie fasetowej moduł wylicza optymalny canonical:
- Kombinacja pasująca do istniejącego landingu: canonical równy pretty URL landingu
- Kombinacja indeksowalna według reguł: canonical równy znormalizowanemu self (filtry posortowane i pogrupowane)
- Kombinacja nieindeksowalna według reguł: canonical równy kategorii nadrzędnej
- Strona kategorii bez filtra: canonical równy standardowemu self
Normalizacja grupuje wartości według grupy i sortuje grupy po ID. Dwa adresy wizualnie różne, ale semantycznie identyczne (na przykład inna kolejność parametrów GET) otrzymują ten sam canonical.
Wysokowydajny silnik filtrów
Silnik opiera się na tabeli ps_dffacetedseo_index: jeden wiersz na parę (produkt, typ filtra, wartość). Wyszukiwanie zamienia się w przecięcie zbiorów identyfikatorów produktów.
Cache dwupoziomowy
- Poziom 1: pamięć (in-process). Unika dwukrotnego wykonania tego samego zapytania w obrębie jednej strony.
- Poziom 2: baza danych (tabela
ps_dffacetedseo_cache). Utrwala wyniki między żądaniami z TTL.
Automatyczne unieważnianie
Moduł nasłuchuje hooków actionProductSave, actionProductDelete i actionCategoryUpdate. Za każdym razem, gdy produkt zostaje zapisany, jego wpis w indeksie jest regenerowany, a wszystkie wpisy cache powiązane z tym produktem są unieważniane.
AJAX i UX
Frontowy panel filtrów jest w całości sterowany przez AJAX:
- Debounce 250 ms na zmianach filtrów
pushStatedo aktualizacji adresu bez przeładowania strony- Aktualizacja w czasie rzeczywistym znaczników
canonicalirobotsw nagłówku dokumentu - Płynne przewijanie do siatki produktów po aktualizacji
- Klikalne aktywne chipy pozwalające usunąć pojedynczy filtr
- Suwak cen z polami liczbowymi i przyciskiem Zastosuj
- Swatche kolorów widoczne na atrybutach typu Kolor
Multisklep i wielojęzyczność
Moduł jest natywnie multisklepowy i wielojęzyczny:
- Każda landing page ma tłumaczenia per język (tabela
ps_dffacetedseo_landing_page_lang) - Każdy landing może być ograniczony do jednego lub kilku sklepów (tabela
ps_dffacetedseo_landing_page_shop) - Reguły indeksowania domyślnie obowiązują we wszystkich sklepach
- Indeks jest partycjonowany per sklep
- Tłumaczenia interfejsu są dostarczone po francusku i angielsku (XLIFF w katalogu
translations/)
Architektura techniczna
Używane hooki
displayHeader: dynamiczne canonical i meta robotsactionFrontControllerSetMedia: CSS i JS frontendumoduleRoutes: czysta trasa dla landing pagesdisplayLeftColumn: wstrzykiwanie panelu filtrówdisplayBeforeBodyClosingTag: JSON-LD na landingachactionProductSearchProviderRunQuery: integracja z silnikiem PSactionProductSaveiactionProductDelete: przyrostowa reindeksacjaactionCategoryUpdate: unieważnienie cache kategoriidisplayBackOfficeHeader: CSS i JS admina
Tworzone tabele
| Tabela | Rola |
|---|---|
dffacetedseo_rule |
Reguły indeksowania per zakres |
dffacetedseo_landing_page |
Landingi (dane biznesowe) |
dffacetedseo_landing_page_lang |
Tłumaczenia landingów |
dffacetedseo_landing_page_shop |
Powiązania multisklepowe |
dffacetedseo_landing_filter |
Filtry powiązane z landingami |
dffacetedseo_combination_log |
Statystyki odwiedzin |
dffacetedseo_cache |
Cache wyników zapytań |
dffacetedseo_filter_template |
Szablony filtrów wielokrotnego użytku |
dffacetedseo_index |
Zdenormalizowany indeks (klucz wydajności) |
dffacetedseo_setting |
Ustawienia wewnętrzne |
Konwencja adresów filtrów
?attribute_group__{id_group}=v1,v2&feature__{id_feature}=v3&manufacturer__0=5&price=10-50&s=needle
Stabilna sygnatura SHA-1 jest wyliczana do porównywania kombinacji (dopasowanie landingu, klucz cache, log).
Oczekiwana wydajność
Pomiary wykonane na katalogu referencyjnym (50 000 produktów, 8 aktywnych faset):
| Silnik | Średni czas |
|---|---|
Natywny ps_facetedsearch |
800 ms do 1,4 s na zapytanie |
| DF Faceted SEO bez cache | 50 do 120 ms |
| DF Faceted SEO z cache | poniżej 10 ms |
Typowy zysk: x10 do x30
FAQ techniczne
Czy trzeba odinstalować ps_facetedsearch
Nie, moduł integruje się przez oficjalne hooki. Możesz przetestować go równolegle. Po walidacji odinstaluj ps_facetedsearch, aby uniknąć zdublowania panelu filtrów.
Czy moduł jest zgodny z HTTPS i absolutnymi adresami canonical
Tak. Moduł używa Context::getContext()->link->getPageLink() i getModuleLink(), które respektują konfigurację HTTPS PrestaShop.
Jak dodać nowy język po stronie modułu
Skopiuj plik translations/fr-FR.xlf jako translations/xx-XX.xlf i przetłumacz elementy trans-unit. Żadna inna interwencja nie jest potrzebna.
Czy moduł obsługuje atrybuty złożone (kombinacje atrybutów)
Tak. Zdenormalizowany indeks indeksuje warianty przez ich atrybuty. Silnik wyszukiwania filtruje produkty, których co najmniej jeden wariant odpowiada wszystkim aktywnym filtrom.
Jak debugować regułę, która się nie stosuje
Włącz logi PrestaShop (Parametry zaawansowane / Logi) i sprawdź sekcję dffacetedseo. Każde rozstrzygnięcie dyrektywy zapisuje dopasowaną regułę i powód.
Rozwiązywanie problemów
Fatal error przy wywołaniu getBySlug
Objaw: Call to a member function getBySlug() on false. Przyczyna: dawny helper get(), który zwracał false zamiast obiektu usługi. Poprawione w v1.0.1. Zaktualizuj moduł.
404 na adresie landing page
Objaw: https://twoja-strona/en/landing/twoj-slug zwraca 404. Typowa przyczyna: hook moduleRoutes nie jest zarejestrowany albo cache tras PrestaShop jest nieaktualny.
- Sprawdź, czy Preferencje / SEO i adresy URL / Włącz przyjazne adresy URL jest ustawione na TAK
- Zapisz tę stronę (regeneruje
.htaccess) - Wyczyść cache PrestaShop dwukrotnie
- Przejdź do Moduły / Pozycje i sprawdź, czy
dffacetedseojest podpięty domoduleRoutes - Fallback testowy:
https://twoja-strona/index.php?fc=module&module=dffacetedseo&controller=landing&slug=twoj-slug
Silnik wyszukiwania nie zwraca żadnego produktu
Indeks jest prawdopodobnie pusty. Przejdź do pulpitu i kliknij Odbuduj indeks.
Filtry nie wyświetlają się w kolumnie
Sprawdź w Moduły / Pozycje, czy dffacetedseo jest podpięty do hooka displayLeftColumn. W zależności od motywu możesz go też podpiąć do displayRightColumn lub displayHome.
Spadek wydajności po masowym imporcie produktów
Przyrostowe unieważnianie sprawdza się przy modyfikacjach jednostkowych. Po imporcie masowym szybciej jest odbudować cały indeks z pulpitu i wyczyścić cache.
Aktualizacje
Moduł stosuje wersjonowanie GŁÓWNA.POBOCZNA.PATCH. Krytyczne poprawki (bezpieczeństwo, fatal errors) są dostarczane jako patch; nowe funkcje wywołują podbicie wersji pobocznej. Każda aktualizacja główna zawiera skrypt upgrade/upgrade-X.Y.Z.php, który uruchamia się automatycznie przy instalacji nowej wersji.
Wsparcie
W razie pytań lub zgłoszenia błędu skontaktuj się z support@datafirefly.com, podając wersję PrestaShop, wersję PHP, wersję modułu oraz logi PHP i PrestaShop.