Storefront
Diese Seite beschreibt, was der Besucher (Shopper) im Storefront zu sehen bekommt: die Blog-Detailseite, die Einbindung von Beiträgen über die CMS-Elemente sowie das SEO-/Meta-Verhalten. Alle Ausgaben basieren auf dem im Admin gepflegten Beitrag und dem zugewiesenen Erlebniswelten-Layout.
Blog-Detailseite
Ein einzelner Beitrag wird über die Route frontend.blog.page unter dem Pfad /blog/{blogItemId} ausgeliefert (BlogController::detail). Statt der technischen ID sieht der Besucher in der Regel eine sprechende SEO-URL (siehe unten).
Die Seite rendert das dem Beitrag zugewiesene Erlebniswelten-Layout: Der BlogPageLoader lädt den Beitrag inkl. Media und Kategorien, löst die zugeordnete CMS-Page mit der beitragsindividuellen slotConfig auf und übergibt sie an das Template @MultiPurposeBlog/storefront/page/blog/index.html.twig. Dieses erweitert die Standard-Content-Seite von Shopware, sodass alle gewohnten CMS-Blöcke und -Elemente zur Verfügung stehen.
Sichtbarkeit und Veröffentlichungszeitraum
Ob ein Beitrag in Listen erscheint, steuert der BlogItemAvailableFilter. Er kombiniert drei Bedingungen:
active = truereleaseAtist leer oder liegt in der Vergangenheit (Veröffentlichung hat begonnen)releaseUntilist leer oder liegt in der Zukunft (Veröffentlichung läuft noch)
So lassen sich Beiträge im Voraus einplanen und automatisch wieder ausblenden.
Beiträge einbinden: CMS-Elemente
Beiträge erscheinen im Storefront über zwei CMS-Elemente, die in beliebigen Erlebniswelten platziert werden können.
Blog Einträge (blog-listing)
Eine dynamische Liste. Pro Eintrag zeigt das Template (element/cms-element-blog-listing.html.twig):
Ort und Veröffentlichungsdatum (bzw. Zeitraum), falls gepflegt
den Titel (
metaTitle)einen gekürzten Auszug der
metaDescription(auf 200 Zeichen)einen „Weiterlesen"-Button, der per
seoUrl('frontend.blog.page', {blogItemId: item.id})auf die Detailseite verlinkt
Die angezeigten Beiträge werden serverseitig durch die Konfiguration des Elements bestimmt: Kategorie-Filter, Sortierung nach releaseAt, maximale Anzahl und optional das Einbeziehen unveröffentlichter Beiträge.
Blog Einträge Vorschau (blog-item)
Hebt einzelne, manuell ausgewählte Beiträge hervor. Liegt in derselben CMS-Reihe ein blog-listing-Slot, übernimmt die Vorschau dessen Filter (Kategorie, Sortierung, Anzahl); andernfalls werden die im Element direkt gewählten Beiträge gezeigt.
Kategorie-Filterung
Die Zuordnung von Beiträgen zu Kategorien (Many-to-Many) ist die Grundlage der Filterung: Im blog-listing-Element wird eine Kategorie gewählt, woraufhin der BlogListingCmsElementResolver die Beiträge über EqualsFilter('categories.id', …) einschränkt. Ohne Kategorie-Auswahl werden alle verfügbaren Beiträge gelistet.
SEO und Meta-Ausgabe
Das Plugin bringt eine eigene SEO-URL-Route mit (BlogSeoRoute):
Route:
frontend.blog.pageStandard-Template:
/blog/{{ blogItem.translated.metaTitle }}
Die SEO-URLs werden automatisch aktualisiert, sobald ein Beitrag geschrieben oder gelöscht wird (DynamicSeoUrlPageSubscriber). Der BlogPageLoader befüllt zusätzlich die Meta-Informationen der Seite:
Meta-Feld | Quelle | Besonderheit |
|---|---|---|
Meta-Titel |
| wird als |
Meta-Beschreibung |
| Platzhalter im |
Meta-Keywords |
| mit Leerzeichen verkettet |
| SEO-URL des Beitrags | verhindert, dass die sprechende Adresse und |
| Veröffentlichungszeitraum | außerhalb des Zeitraums |
| Titelbild des Beitrags | ohne Titelbild greift der Theme-Fallback; mit Bild wird die Twitter-Karte auf |
| fest |
|
|
| jeweils nur, wenn gepflegt |
| Kategorien | die erste Kategorie als Rubrik, alle als Schlagworte |
Strukturierte Daten (schema.org)
Zusätzlich zu den Meta-Tags gibt jede Detailseite einen Block JSON-LD im <head> aus. Er beschreibt den Beitrag maschinenlesbar, damit Suchmaschinen und KI-Systeme ihn als datierten Fachbeitrag erkennen und nicht bloß als beliebige Seite.
Welcher Typ ausgegeben wird, entscheidet das Feld Typ der strukturierten Daten am Beitrag (siehe Administration) — NewsArticle als Vorgabe, wahlweise BlogPosting oder Article.
Woher die Angaben stammen:
Angabe | Quelle |
|---|---|
|
|
|
|
| Titelbild; Breite und Höhe stammen aus den Metadaten der Mediendatei |
|
|
| letzte Änderung, nie vor |
|
|
| Keywords bzw. Kategorien des Beitrags |
| Shopname und Shop-Logo |
| Feld Ort, falls gepflegt |
| Sprache des Verkaufskanal-Kontexts |
Felder ohne Inhalt werden weggelassen statt leer ausgegeben — eine leere Angabe behauptete, die Information sei bekannt und leer.
Beitragslisten
Das CMS-Element Blog Einträge gibt seine Beiträge zusätzlich als ItemList aus — je Eintrag Position und Adresse, ohne den Artikel einzubetten. Ein leeres Listing gibt nichts aus. Stehen mehrere Listen auf einer Seite, bekommt jede eine eigene Kennung und bleibt damit unterscheidbar.
Beiträge außerhalb des Veröffentlichungszeitraums
Ein Beitrag, dessen Zeitraum noch nicht begonnen oder bereits geendet hat, bleibt über seine Adresse erreichbar — Vorschau-Links funktionieren also weiter. Er trägt aber robots: noindex,follow und gibt keine strukturierten Daten aus.