XML-Sitemap: Generierung und Auslieferung
Sitemap erzeugen per Befehl mmd:sitemap:generate oder Admin-Button, Abruf unter sitemap-index.xml, Dateiaufteilung, Auswahlregeln für Produkte und Kategorien, Hreflang, Bilder und Sperre pro Channel.
XML-Sitemap: Generierung und Auslieferung
Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.
Sitemap erzeugen
Konsolenbefehl
bin/console mmd:sitemap:generate
bin/console mmd:sitemap:generate --channel=WEB
| Option | Kurzform | Beschreibung |
|---|---|---|
--channel |
-c |
Nur diesen Channel generieren (Channel-Code). Ohne Option laufen alle aktivierten Channels |
Der Befehl gibt eine Tabelle mit Channel, URLs, Dateien und Zeitpunkt aus. Ein Fehler in einem Channel wird für diesen Channel gemeldet und stoppt die anderen nicht. Ist mindestens ein Channel fehlgeschlagen, endet der Befehl mit einem Fehlerstatus, was für Cronjobs und Monitoring wichtig ist. Hat kein Channel die Sitemap aktiviert, gibt er eine Warnung aus und endet erfolgreich.
Admin-Button
Auf der Seite MMKreativ Plugins → XML-Sitemap startet der Button Jetzt generieren die Generierung aller aktivierten Channels. Das Ergebnis erscheint als Meldung pro Channel, danach zeigt das Grid die Anzahl der URLs und den Zeitpunkt.
Der Button läuft synchron innerhalb der Web-Anfrage. Für einen sehr großen Katalog nimmst du den Konsolenbefehl.
Abruf der Sitemap
Der Sitemap-Index liegt auf dem Host des jeweiligen Channels:
| URL | Inhalt |
|---|---|
/sitemap-index.xml |
Sitemap-Index |
/sitemap.xml |
Derselbe Index, unter dem Namen, den Crawler ohne weitere Angabe ausprobieren |
/sitemap/<Name>.xml |
Eine einzelne Sitemap-Datei, zum Beispiel /sitemap/sitemap-products-1.xml |
Der Index führt je Inhaltstyp eine eigene Datei auf, sodass erkennbar ist, was darin steht:
/sitemap/sitemap-products-1.xml Produkte (und ihre Bilder)
/sitemap/sitemap-categories-1.xml Kategorien
/sitemap/sitemap-pages-1.xml Statische Seiten
Hat ein Inhaltstyp mehr URLs, als in eine Datei passen, setzt er sich in sitemap-products-2.xml und so weiter fort. Ein Inhaltstyp ohne URL bekommt keine Datei. Hat ein Channel gar keine URL, entsteht eine leere Datei sitemap-empty-1.xml, damit der Index gültig bleibt.
Die Auslieferung antwortet mit 404, wenn der Host keinem Channel gehört, für den Channel keine aktivierte Einstellung existiert oder die Sitemap noch nicht generiert wurde. Die Antworten tragen Content-Type: application/xml; charset=UTF-8 und den Header X-Robots-Tag: noindex, damit die XML-Datei selbst nie als Suchergebnis erscheint.
Eine Antwort ist nur dann öffentlich cachebar (eine Stunde), wenn für die Anfrage keine Session gestartet wurde. Die Dateien werden unkomprimiert ausgeliefert, die Kompression übernimmt der Webserver.
Was in die Sitemap kommt
| Inhalt | Quelle | Hinweise |
|---|---|---|
| Produkte | Aktivierte Produkte, die dem Channel zugeordnet sind | Eine URL pro Sprache, für die das Produkt einen Slug hat. lastmod stammt vom Produkt |
| Kategorien | Der Menü-Taxon des Channels und alles darunter. Ist kein Menü-Taxon gesetzt, alle Nicht-Wurzel-Taxons aller Bäume | lastmod stammt vom Taxon. Ist der Menü-Taxon selbst eine Baumwurzel, wird nur sein Unterbaum aufgenommen |
| Statische Seiten | Die Routen aus static_routes |
Eine URL pro Sprache des Channels, ohne lastmod |
| Bilder | Produktbilder | Je Produkt-URL, mit dem Produktnamen der jeweiligen Sprache als Titel |
Ein deaktivierter Taxon blendet seinen ganzen Unterbaum aus, auch wenn einzelne Unterkategorien aktiviert sind. Die Wurzel eines Taxon-Baums ist eine reine Gruppierung und kommt nicht in die Sitemap.
Hreflang
Jede Sprache des Channels bekommt eine eigene URL, die alle Sprachversionen als Alternativen enthält, die eigene eingeschlossen, dazu x-default mit der URL der Standardsprache. Sprachcodes werden mit Bindestrich geschrieben (de-DE statt de_DE).
Hreflang erscheint nur, wenn eine Seite mindestens zwei verschiedene Sprach-URLs hat. Ein Shop, dessen Routen keinen Platzhalter {_locale} enthalten, liefert alle Sprachen unter einer URL und bekommt deshalb keine. Sprachen, für die der Router keine URL bilden kann, werden ausgelassen, statt die Generierung abzubrechen.
Bilder
Ein Bildpfad, der bereits eine absolute URL mit http:// oder https:// ist (CDN), wird unverändert übernommen. Alles andere wird zu <scheme>://<Host des Channels>/<image_base_path>/<Pfad>.
Ablauf und Sicherheit
- Pro Channel läuft nur eine Generierung gleichzeitig. Ein zweiter Start, etwa ein Cronjob während jemand den Button drückt, wird mit einer Meldung abgelehnt, statt mit dem ersten zu konkurrieren. Die Sperre löst sich automatisch, wenn ein Prozess abstürzt.
- Dateien werden atomar geschrieben. Der Index entsteht zuletzt, veraltete Dateien werden erst danach gelöscht. Ein Crawler, der mitten im Lauf den Index abruft, folgt deshalb nie einem Link auf eine Datei, die es noch nicht oder nicht mehr gibt.
- Eine URL, die mehrere Provider liefern, steht nur einmal in der Sitemap, und zwar in der Datei des ersten Providers.
Twig-Storefront und Headless
Die Sitemap ist ein maschinenlesbares XML-Dokument für Crawler, kein Storefront-Feature. Es gibt deshalb weder eine Twig-Seite noch eine API-Platform-Ressource, und es gibt keine getrennte Shop-API. Sie wird für ein Twig-Storefront und ein Headless-Frontend identisch ausgeliefert, solange der Host des Channels /sitemap-index.xml an Sylius weiterreicht. Die Admin-Oberfläche ist reine Verwaltung.
graph TD
A["Aufruf sitemap-index.xml"] --> B{"Host gehört zu einem Channel?"}
B -->|Nein| C["404"]
B -->|Ja| D{"Sitemap für den Channel aktiviert?"}
D -->|Nein| C
D -->|Ja| E{"Datei vorhanden?"}
E -->|Nein| C
E -->|Ja| F["XML ausliefern"]