# DF Faceted SEO — Facettensuche und SEO für PrestaShop

> DF Faceted SEO verwandelt die Facettensuche von PrestaShop in einen nachhaltigen SEO-Hebel und beschleunigt Ihre Kategorieseiten 10 bis 30 mal dank eines denormalisierten Index. Diese Dokumentation deckt Installation, Konfiguration der…

- Seite: <https://www.datafirefly.com/de/documentation/dffacetedseo/>
- Sprache: de
- Aktualisiert am: 2026-06-29
- Weitere Sprachen: [fr](https://www.datafirefly.com/documentation/dffacetedseo/index.md), [en](https://www.datafirefly.com/en/documentation/dffacetedseo/index.md), [es](https://www.datafirefly.com/es/documentation/dffacetedseo/index.md), [it](https://www.datafirefly.com/it/documentation/dffacetedseo/index.md), [pl](https://www.datafirefly.com/pl/documentation/dffacetedseo/index.md), [pt](https://www.datafirefly.com/pt/documentation/dffacetedseo/index.md), [nl](https://www.datafirefly.com/nl/documentation/dffacetedseo/index.md)
- Index: <https://www.datafirefly.com/de/documentation/llms.txt>

DF Faceted SEO verwandelt die Facettensuche von PrestaShop in einen nachhaltigen SEO-Hebel und beschleunigt Ihre Kategorieseiten 10 bis 30 mal dank eines denormalisierten Index. Diese Dokumentation deckt Installation, Konfiguration der Indexierungsregeln, Erstellung von SEO-Landingpages und Auswertung der Statistiken beliebter Kombinationen ab.

## Überblick

Das native `ps_facetedsearch`-Modul erzeugt mechanisch eine URL für jede mögliche Filterkombination. Bei einem Katalog mit einigen tausend Produkten und fünf Facetten sind das Millionen von URLs, die Google crawlt, was Ihr Crawl-Budget und Ihren PageRank zwischen nahezu identischen Seiten verdünnt.

DF Faceted SEO löst dieses Problem auf zwei parallelen Wegen:

- **Intelligente Indexierung**: Geschäftsregeln entscheiden, welche Kombinationen indexierbar sind, welche `noindex follow` erhalten und wohin das Canonical zeigt.
- **Dedizierte SEO-Landingpages**: Für Kombinationen mit starkem kommerziellem Potenzial (z. B. „rote Schuhe Größe 42") erstellen Sie Landingpages mit sauberer URL, eigenem H1, eigenen Meta-Tags und redaktionellen Inhalten pro Sprache.

Als Bonus ersetzt die Suchmaschine des Moduls die native Engine durch ein deutlich schnelleres System auf Basis eines denormalisierten Index und eines zweistufigen Caches.

## Voraussetzungen

- PrestaShop 8.0 bis 9.x
- PHP 8.1 oder höher
- MySQL 5.7 oder MariaDB 10.3 minimum
- Sprechende URLs aktiviert (_Einstellungen → SEO und URLs_)
- Standard-MySQL-Berechtigungen zur Erstellung von Tabellen

## Installation

1. Laden Sie das ZIP-Archiv über _Module → Modulmanager → Modul hochladen_ hoch.
2. Klicken Sie auf **Installieren**. Das Modul erstellt automatisch 10 `ps_dffacetedseo_*`-Tabellen und 5 Tabs unter _Verbessern_.
3. Gehen Sie zu _Verbessern → DF Faceted SEO → Dashboard_.
4. Klicken Sie auf **Index neu aufbauen**. _Dieser Schritt ist beim ersten Mal verpflichtend_: ohne Index hat die Suchmaschine keine Daten.
5. Leeren Sie den PrestaShop-Cache: _Erweiterte Parameter → Leistung → Cache leeren_.

Bei einem 50.000-Produkte-Katalog dauert der Index-Neuaufbau typischerweise 2 bis 5 Minuten. Das Modul fügt Zeilen in Batches von 500 ein.

## Erste Schritte — Dashboard

Das Dashboard (_Verbessern → DF Faceted SEO_) zeigt sechs Statistikkacheln:

- **Aktive Regeln**: Anzahl aktivierter Indexierungsregeln
- **Landingpages**: Anzahl erstellter SEO-Landingpages
- **Produkte im Index**: Anzahl indexierter Produkte (sollte nahe am Katalog-Total liegen)
- **Zeilen im Index**: Anzahl (Produkt, Filterwert)-Paare — die denormalisierte Tabelle
- **Cache-Einträge**: Anzahl gecachter Abfragen
- **Beliebte Kombinationen**: Anzahl beobachteter Filterkombinationen

Unter den Kacheln gibt es zwei Operations-Blöcke:

- **Index neu aufbauen**: nützlich nach einer großen Katalogänderung (Massenimport, Änderung der Attributstruktur)
- **Cache leeren**: nützlich nach einer Regel- oder Einstellungsänderung

## Indexierungsregeln

Regeln entscheiden für jede besuchte Filterkombination, welches `robots`-Tag und welches `canonical` an den Browser und an Google gesendet werden. Eine Regel hat einen **Scope** (Geltungsbereich) und eine **Policy** (Entscheidung).

### Verfügbare Scopes

- **Global**: gilt für alle facettierten Seiten des Katalogs
- **Spezifische Kategorie**: gilt nur für Seiten einer bestimmten Kategorie
- **Attributgruppe**: gilt für Kombinationen, die eine bestimmte Gruppe enthalten (z. B. alle Seiten, auf denen Farbe gefiltert ist)
- **Merkmal**: ebenso für ein Produktmerkmal
- **Marke**: ebenso für einen Hersteller
- **Preisspanne**: gilt für Seiten, die nach einer bestimmten Preisspanne gefiltert sind

### Verfügbare Policies

- **Index, follow**: Seite indexierbar, Canonical auf sich selbst normalisiert
- **Noindex, follow**: Seite nicht indexiert, Links werden aber verfolgt (empfohlen für seltene Kombinationen)
- **Canonical parent**: Seite zugänglich, aber Canonical zeigt auf die Elternkategorie (SEO-Wert wird übertragen)
- **Canonical self normalisiert**: Canonical auf der Seite selbst mit sortierten und gruppierten Filtern (eliminiert URL-Duplikate für dieselbe Kombination)

### Prioritätskette

Das Modul wertet Regeln **vom spezifischsten zum generischsten** aus. Konkret für eine Schuhe-Kategorieseite mit Farbfilter:

1. Das Modul sucht zuerst eine `category`-Regel auf Schuhe
2. Existiert sie und matcht, wird sie angewendet
3. Sonst sucht es eine `attribute_group`-Regel auf Farbe
4. Sonst fällt es zurück auf die globale Regel
5. Matcht keine Regel, gilt die Standard-Policy aus dem Dashboard

### Erweiterte Regelfelder

- **Maximal indexierbare Filter**: enthält die Kombination mehr Filter als dieses Limit, fällt die Policy automatisch auf `noindex follow`. Beispiel: 2 Filter maximal bei Schuhen (Farbe + Größe indexierbar, aber nicht Farbe + Größe + Material + Saison).
- **Wert-Whitelist**: erlaubte Wert-IDs (kommagetrennt). Eine Kombination, die nur Whitelist-Werte enthält, ist indexierbar. Beispiel: Whitelist der Farben Rot, Schwarz, Weiß, Blau — seltene Farben wie „Apfelgrün" werden nicht indexiert.
- **Wert-Blacklist**: das Gegenteil. Jede Kombination, die einen Blacklist-Wert enthält, fällt automatisch auf `noindex`.
- **Mindestproduktzahl**: liefert die Kombination nicht mindestens diese Anzahl Produkte, geht sie auf `noindex`. Verhindert die Indexierung fast leerer Seiten.
- **Priorität**: Ganzzahl. Bei Konflikt zwischen zwei Regeln gleichen Scopes gewinnt die höhere Priorität.

Empfohlene Einstiegsstrategie: Erstellen Sie eine _globale_ Regel mit Policy `canonical parent` und maximal 1 indexierbarem Filter, dann fügen Sie schrittweise spezifischere Regeln hinzu, um die Indexierung für Kombinationen mit hohem Potenzial zu öffnen.

## SEO-Landingpages

Landingpages sind dedizierte Seiten für strategische Filterkombinationen. Sie haben ihre eigene saubere URL, ihr eigenes H1, ihre eigenen Meta-Tags und redaktionellen Inhalt pro Sprache.

### Eine Landingpage erstellen

1. Gehen Sie zu _Verbessern → DF Faceted SEO → Landingpages_
2. Klicken Sie auf **Hinzufügen**
3. Abschnitt **Targeting**: wählen Sie die Kategorie und optional die betroffene Marke
4. Abschnitt **Anzeige**: Standardsortierung, Richtung, aktiv, indexierbar, Priorität
5. Abschnitt **Filterkombination**: fügen Sie die Filter hinzu, die die Kombination bilden (Attributgruppe und Werte, Merkmal oder Marke). Beispiel: Farbe = Rot UND Größe = 42.
6. Mehrsprachige Tabs: füllen Sie für jede Sprache den internen Namen, URL-Slug, H1, Meta-Title, Meta-Description, Intro- und Outro-Inhalt aus.
7. Speichern

### URL-Struktur

Eine Landingpage-URL folgt dem Schema:

```
https://ihre-domain.com/landing/ihr-slug
https://ihre-domain.com/en/landing/ihr-slug
https://ihre-domain.com/fr/landing/ihr-slug
```

Das Sprachpräfix wird automatisch vom PrestaShop-Router behandelt, sobald sprechende URLs aktiviert sind und mehrere Sprachen im Shop aktiv sind.

Erhalten Sie auf einer Landing-URL einen 404, prüfen Sie in dieser Reihenfolge: sprechende URLs aktiv, `.htaccess` neu generiert (Speichern-Button am Ende von SEO und URLs), Cache geleert, Landing im Formular aktiv, `moduleRoutes`-Hook korrekt an das Modul gebunden unter _Module → Positionen_.

### Redaktioneller Inhalt

Pro Sprache haben Sie zwei reichhaltige HTML-Blöcke:

- **Intro**: oberhalb des Produktrasters angezeigt. Ideal für einen 150- bis 300-Wörter-SEO-Einleitungsabsatz mit Ihren Zielkeywords.
- **Outro**: unter dem Raster angezeigt. Ideal für Vertrauenselemente, Kaufratgeber, FAQs.

### Automatisches JSON-LD

Jede Landingpage injiziert automatisch zwei JSON-LD-Blöcke in die Seite:

- **BreadcrumbList**: Startseite → Kategorie → Landing
- **Product**: ein Product-Block pro angezeigtem Produkt (Name, Preis, Bild, URL, Verfügbarkeit)

Sie erhalten automatisch Google Rich Snippets ohne weitere Konfiguration.

## Statistiken beliebter Kombinationen

Das Modul protokolliert automatisch in der Tabelle `ps_dffacetedseo_combination_log` jede tatsächlich besuchte Filterkombination Ihrer Kunden: Signatur, Trefferzahl, zuletzt gesehen.

### Statistiken nutzen

1. Gehen Sie zu _Verbessern → DF Faceted SEO → Statistiken_
2. Filtern Sie nach Kategorie, Mindesttreffer, Anzeigegrenze
3. Sortieren Sie absteigend nach Treffern
4. Identifizieren Sie Kombinationen mit mehr als 50 Treffern pro Woche
5. Klicken Sie auf **Befördern** in der Aktionsspalte
6. Das Landing-Formular öffnet sich **vorausgefüllt** mit der Filterkombination
7. Sie müssen nur noch den redaktionellen Inhalt eintragen und speichern

### Wartung

Am Fuß der Statistikseite gibt es einen Button _Alte Daten löschen_ mit einem Feld „Tage zum Aufbewahren". Empfehlung: alle 90 Tage löschen, um unbegrenztes Tabellenwachstum zu vermeiden.

## Globale Einstellungen

Das Dashboard bietet 11 globale Einstellungen in 3 Abschnitten.

### Indexierung

- **Standard-Policy**: angewendete Policy, wenn keine Regel matcht
- **Maximal indexierbare Filter**: globaler Wert (kann pro Regel überschrieben werden)
- **Mindestprodukte pro Kombination**: globaler Schwellenwert

### Leistung

- **Cache-TTL (Sekunden)**: Lebensdauer eines Cache-Eintrags. Standard: 3600 (1 Stunde). Erhöhen Sie auf 86400 (24 h) in stabiler Produktion.
- **Leere Filter ausblenden**: wenn aktiviert, werden Werte mit 0 Ergebnissen ausgeblendet
- **Ergebnisgrenze pro Seite**: Produkt-Paginierung

### URLs

- **URL-Präfix der Landings**: Standard `landing`. Das Routenschema ist im `moduleRoutes`-Hook fest definiert und verwendet dieses Präfix.

## Intelligenter Canonical

Auf jeder facettierten Seite berechnet das Modul das optimale Canonical:

- Kombination, die einer existierenden Landing entspricht: Canonical = Pretty-URL der Landing
- Kombination laut Regeln indexierbar: Canonical = normalisiertes Self
- Kombination laut Regeln nicht indexierbar: Canonical = Elternkategorie
- Kategorieseite ohne Filter: Canonical = Standard-Self

## Hochleistungs-Filter-Engine

Die Engine stützt sich auf die Tabelle `ps_dffacetedseo_index`: eine Zeile pro (Produkt, Filtertyp, Wert)-Tupel. Die Abfrage wird zu einem einfachen Mengenschnitt von Produkt-IDs.

### Zweistufiger Cache

- **Stufe 1: Speicher (In-Process)**. Verhindert dieselbe Abfrage zweimal auf derselben Seite.
- **Stufe 2: Datenbank (Tabelle ps_dffacetedseo_cache)**. Persistiert Ergebnisse zwischen Anfragen mit TTL.

### Automatische Invalidierung

Das Modul lauscht auf die Hooks `actionProductSave`, `actionProductDelete` und `actionCategoryUpdate`. Jedes Mal, wenn ein Produkt gespeichert wird, wird sein Index-Eintrag neu erzeugt und alle damit verknüpften Cache-Einträge invalidiert.

### AJAX und UX

Das Frontend-Filterpanel wird vollständig per AJAX gesteuert:

- 250 ms Debounce bei Filteränderungen
- `pushState` zur Aktualisierung der URL ohne Reload
- Echtzeit-Update der Tags `canonical` und `robots`
- Sanftes Scrollen zum Produktraster nach Update
- Aktive Chips zum Entfernen einzelner Filter
- Preis-Slider mit Zahlenfeldern und Anwenden-Button
- Farb-Swatches bei Farbe-Attributen

## Multishop und mehrsprachig

Das Modul ist nativ multishop- und mehrsprachfähig:

- Jede Landingpage hat Übersetzungen pro Sprache (Tabelle `ps_dffacetedseo_landing_page_lang`)
- Jede Landing kann auf einen oder mehrere Shops beschränkt werden (Tabelle `ps_dffacetedseo_landing_page_shop`)
- Indexierungsregeln gelten standardmäßig für alle Shops
- Der Index ist nach Shop partitioniert
- Interface-Übersetzungen sind in Französisch und Englisch enthalten (XLIFF in `translations/`)

## Technische Architektur

### Verwendete Hooks

- `displayHeader`: dynamisches Canonical und Meta-Robots
- `actionFrontControllerSetMedia`: Frontend-CSS und JS
- `moduleRoutes`: saubere Route für Landingpages
- `displayLeftColumn`: Injektion des Filterpanels
- `displayBeforeBodyClosingTag`: JSON-LD auf Landings
- `actionProductSearchProviderRunQuery`: Integration mit der PS-Engine
- `actionProductSave` und `actionProductDelete`: inkrementelle Reindexierung
- `actionCategoryUpdate`: Invalidierung des Kategorie-Caches
- `displayBackOfficeHeader`: Admin-CSS und JS

### Erstellte Tabellen

| Tabelle | Rolle |
| --- | --- |
| `dffacetedseo_rule` | Indexierungsregeln nach Scope |
| `dffacetedseo_landing_page` | Landings (Geschäftsdaten) |
| `dffacetedseo_landing_page_lang` | Landing-Übersetzungen |
| `dffacetedseo_landing_page_shop` | Multishop-Links |
| `dffacetedseo_landing_filter` | An Landings angehängte Filter |
| `dffacetedseo_combination_log` | Besuchsstatistiken |
| `dffacetedseo_cache` | Ergebnis-Cache |
| `dffacetedseo_filter_template` | Wiederverwendbare Filter-Templates |
| `dffacetedseo_index` | Denormalisierter Index (Performance-Schlüssel) |
| `dffacetedseo_setting` | Interne Einstellungen |

### Filter-URL-Konvention

```
?attribute_group__{id_group}=v1,v2&feature__{id_feature}=v3&manufacturer__0=5&price=10-50&s=needle
```

Eine stabile SHA-1-Signatur wird zum Vergleich von Kombinationen berechnet (Landing-Matching, Cache-Schlüssel, Log).

## Erwartete Leistung

Messungen auf einem Referenzkatalog (50.000 Produkte, 8 aktive Facetten):

| Engine | Durchschnittliche Zeit |
| --- | --- |
| `ps_facetedsearch` nativ | 800 ms bis 1,4 s pro Abfrage |
| DF Faceted SEO ohne Cache | 50 bis 120 ms |
| DF Faceted SEO mit Cache | weniger als 10 ms |

Typischer Gewinn: **×10 bis ×30**

## Technische FAQ

### Muss ich ps_facetedsearch deinstallieren?

Nein, das Modul integriert sich über die offiziellen Hooks. Sie können es parallel testen. Nach Validierung deinstallieren Sie `ps_facetedsearch`, um eine Verdopplung des Filterpanels zu vermeiden.

### Ist das Modul HTTPS-kompatibel und nutzt es absolute Canonical-URLs?

Ja. Das Modul nutzt `Context::getContext()->link->getPageLink()` und `getModuleLink()`, die die HTTPS-Konfiguration von PrestaShop respektieren.

### Wie füge ich eine neue Sprache auf Modulseite hinzu?

Kopieren Sie die Datei `translations/fr-FR.xlf` nach `translations/xx-XX.xlf` und übersetzen Sie die `trans-unit`-Einträge. Keine weiteren Eingriffe nötig.

### Unterstützt das Modul Kombinationsattribute?

Ja. Der denormalisierte Index indexiert Kombinationen über ihre Attribute. Die Suchmaschine filtert Produkte, bei denen mindestens eine Kombination allen aktiven Filtern entspricht.

### Wie debugge ich eine Regel, die nicht greift?

Aktivieren Sie die PrestaShop-Logs (_Erweiterte Parameter → Logs_) und prüfen Sie den Abschnitt `dffacetedseo`.

## Fehlerbehebung

### Fatal error bei einem `getBySlug`-Aufruf

Symptom: `Call to a member function getBySlug() on false`. Ursache: alter `get()`-Helper, der `false` statt des Service-Objekts zurückgab. Behoben in v1.0.1. Aktualisieren Sie das Modul.

### 404 auf einer Landingpage-URL

Symptom: `https://ihre-seite/en/landing/ihr-slug` liefert 404. Typische Ursache: der `moduleRoutes`-Hook ist nicht registriert oder der PrestaShop-Route-Cache ist veraltet.

1. Prüfen Sie, ob _Einstellungen → SEO und URLs → Sprechende URLs aktivieren_ auf JA steht
2. Speichern Sie diese Seite (erzeugt die `.htaccess` neu)
3. Leeren Sie den PrestaShop-Cache zweimal
4. Gehen Sie zu _Module → Positionen_, prüfen Sie, ob `dffacetedseo` an `moduleRoutes` gebunden ist
5. Test-Fallback: `https://ihre-seite/index.php?fc=module&module=dffacetedseo&controller=landing&slug=ihr-slug`

### Die Suchmaschine liefert keine Produkte

Der Index ist wahrscheinlich leer. Gehen Sie zum Dashboard und klicken Sie auf **Index neu aufbauen**.

### Filter erscheinen nicht in der Spalte

Prüfen Sie unter _Module → Positionen_, ob `dffacetedseo` an den Hook `displayLeftColumn` gebunden ist.

### Verschlechterte Leistung nach Massen-Produktimport

Die inkrementelle Invalidierung funktioniert gut bei einzelnen Änderungen. Nach einem Massenimport ist es schneller, den gesamten Index vom Dashboard neu aufzubauen und den Cache zu leeren.

## Updates

Das Modul folgt der Versionierung `MAJOR.MINOR.PATCH`. Kritische Korrekturen werden als Patch geliefert; neue Funktionen lösen einen Minor-Bump aus. Jedes Update enthält ein Skript `upgrade/upgrade-X.Y.Z.php`, das automatisch ausgeführt wird.

## Support

Für Fragen oder Bug-Reports kontaktieren Sie [support@datafirefly.com](mailto:support@datafirefly.com) mit Angabe der PrestaShop-, PHP-, Modulversion und der PHP/PrestaShop-Logs.
