Mit 6.7.16.0 kommt ein umfangreiches Minor-Release der aktuellen 6.7-Linie. Laut Shopware wurden dafür 396 Fehlermeldungen und Anforderungen abgeschlossen. Für den Shop-Alltag stechen drei Dinge heraus: Die Preisauszeichnung richtet sich jetzt nach dem 30-Tage-Tiefstpreis, Garantiebedingungen lassen sich je Produkt hinterlegen und erscheinen in der Bestellbestätigung, und zwei Fehler im Rule Builder, die durch frühere Patches entstanden waren und Versandarten sowie Rabatte falsch gefiltert haben, sind behoben. Dazu kommt eine lange Liste technischer Änderungen rund um das anstehende 6.8 und viele Detailverbesserungen im Backend.
Das ändert sich im Shop-Alltag
- Rabatt-Prozente richten sich nach dem 30-Tage-Tiefstpreis Ist für ein Produkt der niedrigste Preis der letzten 30 Tage hinterlegt, berechnet der Shop die Ersparnis jetzt ausgehend von diesem Wert und zeigt den durchgestrichenen Listenpreis nicht mehr an. Das entspricht Art. 6a der Richtlinie 98/6/EG und dem EuGH-Urteil C-330/23. Rabatt-Kennzeichnung und Hervorhebung des reduzierten Preises erscheinen nur noch, wenn der Verkaufspreis unter dem 30-Tage-Tiefstpreis liegt, auch bei Produkten ohne Listenpreis. Ohne hinterlegten 30-Tage-Tiefstpreis ändert sich nichts. Der Textbaustein lautet nun „Niedrigster Preis (letzte 30 Tage): %price%" statt „vorher %price%".
- Rule Builder: Versandarten und Rabatte filtern wieder korrekt Seit 6.7.14.0 werteten die meisten Artikel-Bedingungen im Rule Builder nur Positionen vom Typ Produkt aus. Eigene Positionen, Gutschrift-Positionen und Positionen aus Erweiterungen wurden nicht mehr erkannt. Eine einzelne solche Position konnte bei einer Bedingung mit „Sind keine von", etwa „Artikel mit Tag / Alle / Sind keine von", Versandarten verstecken oder Rabatte blockieren. Die Bedingungen prüfen eine Position jetzt wieder anhand ihrer Daten, nicht anhand ihres Typs.
- Rule Builder: Bedingung zum Preis-/Listenpreis-Verhältnis greift nicht mehr fälschlich Seit 6.7.9.0 behandelte die Bedingung „Artikel mit Preis-/Listenpreis-Verhältnis" Positionen ohne Listenpreis so, als hätten sie das Verhältnis 0. Dadurch griffen Bedingungen wie „Ist kleiner als 1" auf jede Position ohne Listenpreis, und Rabatte für reduzierte Produkte wurden auf alle Produkte angewendet. Für Positionen ohne Listenpreis wird jetzt kein Verhältnis mehr berechnet; auf sie treffen nur noch die Operatoren „Ist ungleich" und „Ist leer" zu. Wer „Ist gleich 0" genutzt hat, um Positionen ohne Listenpreis anzusprechen, verwendet jetzt „Ist leer".
- Neue Bedingung für das Bestellalter in Flows Eine neue Regel-Bedingung vergleicht das Bestelldatum mit dem heutigen Datum in Kalendertagen. Damit lassen sich Flows auf bestehende Bestellungen eingrenzen, etwa auf Bestellungen der letzten 30 Tage. Das ist nützlich für Abläufe, die vom Alter einer Bestellung abhängen, zum Beispiel Erinnerungen oder Bewertungsanfragen.
- Vollständiger Hinweis zur Gewährleistung im Checkout Unter den AGB im Checkout lässt sich jetzt der vollständige lokalisierte Gewährleistungshinweis einblenden, über die Einstellung core.cart.showLegalGuaranteeNoticeInline. Sie ist standardmäßig aus und setzt voraus, dass core.cart.showLegalGuaranteeNotice aktiv ist. Der Gewährleistungshinweis erscheint nun auch bei der Registrierung und bei anderen Formularen mit Datenschutzhinweis, sofern dort die AGB-Bestätigung verlangt wird.
- Digitale Produkte ohne hinterlegte Datei speicherbar Im Administrationsbereich lassen sich digitale Produkte jetzt ohne hochgeladene Datei speichern, wenn die Dateizuweisung extern erfolgt. Beim Bearbeiten ist die Option voreingestellt, wenn das Produkt keine Downloads hat, und abgeschaltet, wenn Downloads vorhanden sind.
- Bestellmengen für digitale Produkte einstellbar n der Lieferbarkeits-Karte digitaler Produkte gibt es den Schalter „Mehrere Einheiten pro Bestellung erlauben". Eingeschaltet lassen sich Mindestabnahme, Staffelung und Maximalabnahme setzen, ausgeschaltet bleibt es bei einer Einheit pro Bestellung. Auch die Massenbearbeitung blendet diese Felder nicht mehr aus. Damit ist zugleich ein Fehler seit 6.7.14.0 behoben: Digitale Produkte waren unabhängig von der eingetragenen Maximalabnahme auf eine Einheit begrenzt.
- Garantiebedingungen je Produkt und im GARAN-Label Zu jedem Produkt lassen sich jetzt Garantiebedingungen als PDF oder als Link hinterlegen, Varianten erben sie. Im Shop steht der Link unter dem GARAN-Label auf der Produktseite, das verkürzte Label öffnet auf Klick das vollständige Label. Die Bestellbestätigung enthält den Link, ein hinterlegtes PDF wird angehängt. Außerdem speichert Shopware das GARAN-Label mit der Bestellung. Ändern Sie später die Garantieangaben eines Produkts, bleibt in der Bestellung das Label stehen, mit dem sie aufgegeben wurde.
- Bestellbearbeitung rechnet mit den Adressen der Bestellung Wird eine Bestellung im Administrationsbereich bearbeitet, nutzt Shopware jetzt die Adressen, mit denen sie aufgegeben wurde, auch wenn der Kunde seine Standardadresse inzwischen geändert hat. Bisher konnte dadurch die Steuer falsch berechnet werden. Eine noch offene Zahlung wird außerdem auf den neuen Bestellwert angepasst, solange der Kunde die Zahlungsart noch ändern kann.
- MCP-Zugriff muss ausdrücklich freigegeben werden ntegrationen und Benutzer ohne Administratorrechte verlieren mit dem Update den Zugriff auf den MCP-Server, bis die erlaubten Funktionen ausgewählt sind. Bisher galt eine leere Auswahl als „alles erlaubt", jetzt als „nichts erlaubt". Die Freigabe erfolgt unter Einstellungen > System > Integrationen oder im jeweiligen Benutzer. Wer den MCP-Server im Einsatz hat, prüft das direkt nach dem Update.
Im Backend aufgeräumt
Eine Reihe von Verbesserungen betrifft die tägliche Arbeit im Administrationsbereich: Bestelldetails, SEO-Formulare und Listen wurden überarbeitet.
- Bestellpositionen werden auf mehrere Seiten verteilt Hat eine Bestellung mehr als 10 Hauptpositionen (ohne untergeordnete Positionen), zeigt die Positionsliste auf der Bestelldetailseite 10 Einträge je Seite. Darunter liegt eine Seitennavigation, in der sich die Anzahl der Einträge je Seite ändern lässt. Suchen oder Hinzufügen einer Position springt zur ersten Seite zurück.
- Empfohlene Länge für Meta-Titel und -Beschreibung Die SEO-Formulare von Kategorien und Produkten zeigen jetzt die Zeichenzahl gegen die empfohlene Länge an und heben den Hinweis hervor, wenn die Empfehlung überschritten wird. Bei Kategorien gelten 70 Zeichen für den Meta-Titel und 150 für die Beschreibung, bei Produkten 56 und 155. Vererbte Werte werden mitgezählt.
- Statusauswahl bei Bestellungen mit Status-Punkt Die Statusauswahl zeigt den aktuellen Zustand mit einem farbigen Punkt an, und jede Option zeigt den Punkt ihres Zielzustands. Das macht den Bestellstatus auf einen Blick erkennbar.
- Trigger-Ereignis in E-Mail-Vorlagen vorausgewählt In den E-Mail-Vorlagen ist das Trigger-Ereignis jetzt vorausgewählt, wenn alle aktiven Flows, die eine Vorlage des gewählten Typs versenden, dasselbe Ereignis nutzen. Die Vorauswahl benötigt die Berechtigung flow:read.
- Hauptmenügruppe „Kataloge" heißt jetzt „Produkte" Die erste Hauptmenügruppe trägt jetzt die Bezeichnung „Produkte", ihr Produktlisten-Eintrag heißt „Übersicht", und die zugehörige Gruppe unter Einstellungen > Benutzer & Berechtigungen ebenfalls „Produkte". Menü-IDs und Berechtigungsschlüssel bleiben unverändert.
- Berechtigungsgruppen folgen der Hauptnavigation Die Reihenfolge der Gruppen im Berechtigungsraster unter Einstellungen > Benutzer & Berechtigungen folgt jetzt der Hauptnavigation (Produkte, Bestellungen, Kunden, Inhalte, Marketing, Einstellungen) statt der alphabetischen Reihenfolge. Gruppen von Erweiterungen stehen alphabetisch dahinter, „Sonstige" zuletzt.
- Snippet-Set-Auswahl für Verkaufskanal-Domains nach Sprache gruppiert Die Snippet-Set-Auswahl im Domain-Dialog eines Verkaufskanals listet jetzt alle Sets, gruppiert nach den Sprachen des Verkaufskanals. Die Gruppe der gewählten Domain-Sprache steht vorn. Das erleichtert die Zuordnung bei mehrsprachigen Shops.
- Plugin-Einstellungen in Tabs Plugin-Entwickler können die Konfigurationskarten ihrer Erweiterung jetzt in Tabs gliedern. Karten ohne Tab landen automatisch unter „Allgemein". Ob eine Erweiterung das nutzt, entscheidet ihr Hersteller.
Für Entwickler und Technik
6.7.16.0 bringt viel Vorbereitung auf das kommende Major 6.8, dazu zahlreiche Fixes im Kern. Die wichtigsten Punkte gebündelt.
- Content-Security-Policy für statische HTML- und SVG-Dateien unter Apache Das Apache-Template .htaccess.dist sendet für vorhandene .html-Dateien unter public/media und public/thumbnail sowie für SVG-Dateien jetzt script-src 'none'; object-src 'none'; frame-src 'none'; base-uri 'none'; form-action 'none'. Stellen Sie sicher, dass Ihr ausgeliefertes .htaccess den aktualisierten Shopware-Abschnitt enthält; Installationen ohne die Shopware-Marker müssen ihn manuell zusammenführen. Eigene statische Dokumente müssen ohne Skripte, eingebettete Dokumente, Base-URL-Overrides oder Formularversand funktionieren.
- Theme-Konfiguration erreicht alle abgeleiteten Themes Das Speichern eines Basis-Themes aktualisiert jetzt die vererbte Laufzeitkonfiguration und kompiliert zugewiesene abgeleitete Themes auf jeder Vererbungsebene neu. Kind- und Enkel-Themes brauchen kein separates Speichern mehr. Das Deaktivieren oder Deinstallieren eines Basis-Themes ist blockiert, solange ein abgeleitetes Theme oder eine Theme-Kopie einem Verkaufskanal zugewiesen ist; die Fehlermeldung benennt die betroffenen Themes und Verkaufskanäle.
- Angepasste Bestellbestätigung: GARAN-Variable statt Twig-Filter Die Bestellbestätigung liest das GARAN-Label jetzt aus der Template-Variable garanLabels, der Filter sw_garan_label_mail ist deprecated. Eine Migration passt die Vorlage nur in Shops an, die sie nie bearbeitet haben. Bei angepassten Vorlagen ersetzen Sie in der HTML-Version nestedItem.productId|sw_garan_label_mail(context) durch garanLabels[nestedItem.productId] ?? null und in der Textversion lineItem.productId|sw_garan_label_mail(context) durch garanLabels[lineItem.productId] ?? null. Jeder Eintrag in garanLabels hat zusätzlich den Schlüssel termsUrl für den Link zu den Garantiebedingungen.
- Snippet zum Gewährleistungshinweis aufgeteilt Das kombinierte Snippet checkout.confirmTermsTextModalWithGuarantee ist entfallen. An seine Stelle treten checkout.confirmTermsTextModal für die AGB und checkout.confirmLegalGuaranteeNotice für den Gewährleistungshinweis. Theme-Overrides, die das alte Snippet nutzen, sind anzupassen.
- Plain-Text-Felder werden mit HTMLPurifier bereinigt StringField und LongTextField ohne AllowHtml-Flag werden jetzt mit HTMLPurifier statt PHPs strip_tags() bereinigt. Ein <, hinter dem kein HTML-Tag beginnt, bleibt erhalten, sodass etwa 5 < 10 wie getippt gespeichert wird. Auch die Suchbegriff-Tokenisierung behält diesen Text; Produktnamen mit einem solchen < wurden bisher nur bis zum < in den Suchindex aufgenommen. Führen Sie nach dem Update bin/console dal:refresh:index aus, damit bestehende Produkte wieder vollständig gefunden werden.
- System-Config-Schema-Endpunkte benötigen Leserechte Die Endpunkte GET /api/_action/system-config/schema und GET /api/_action/system-config/get-schema verlangen jetzt die bestehende Berechtigung system_config:read. Integrationen und API-Clients, die diese Endpunkte aufrufen, müssen das Recht ihrer ACL-Rolle hinzufügen.
- Standardwährung im Sales-Channel-Kontext wiederhergestellt SalesChannelContext::getSalesChannel()->getCurrency() liefert wieder die Standardwährung des Verkaufskanals, auch wenn für den Kontext eine andere Währung gewählt ist. Das stellt das Verhalten vor 6.7.15.0 für Erweiterungen her, die die Standardwährung lesen. Für die aktuell gewählte Währung nutzen Sie SalesChannelContext::getCurrency().
- Ungenutzte Theme-Verzeichnisse bleiben nach dem Wechsel erhalten Der geplante Task theme.delete_files arbeitet jetzt in zwei Schritten: Ein ungenutztes Verzeichnis wird zuerst mit einer .retired-Datei markiert und erst bei einem späteren Lauf gelöscht, wenn die Markierung mindestens 24 Stunden alt ist. Da der Task täglich läuft, wird ein Verzeichnis 24 bis 48 Stunden nach dem Wechsel gelöscht. Das verhindert 404-Fehler für Seiten, die noch aus HTTP-Cache oder CDN ausgeliefert werden. theme:compile und theme:change führen die Bereinigung nicht mehr selbst aus; die Option --no-cleanup ist wirkungslos und entfällt in 6.8.0.0. Streichen Sie sie aus Deploy-Skripten.
- Meteor Component Library auf 5.8.0 aktualisiert Die Administration nutzt jetzt Meteor Component Library 5.8.0, Meteor Admin SDK 6.15.0 und Meteor Icon Kit 5.11.0. Automatisch ausgefüllte Formularfelder sind im Dark Mode wieder lesbar. Prüfen Sie Ihre Erweiterungen: Die globalen Schrifteinstellungen änderten sich, mt-select zentriert seinen Inhalt und kleine Selects sind 32px hoch. Eigene Paddings, die nur die alte Ausrichtung ausglichen, können entfernt werden.
- Vorbereitung auf 6.8: Verhaltensänderungen einzeln testen Mit MEDIA_URL_PATH_ENCODING=1, PROPORTIONAL_CART_TAXES=1 und DELETE_CART_AFTER_ORDER_CREATION=1 lassen sich kodierte Medien-URL-Pfade, die proportionale Steuerberechnung und das frühere Löschen des persistierten Warenkorbs im Checkout einzeln testen. Mit V6_8_0_0=1 aktivieren alle drei, sofern nicht ausdrücklich abgeschaltet; Flags wie JSON_LD_DATA und CACHE_REWORK schalten sich damit ebenfalls ein, eine ausdrückliche Einstellung des einzelnen Flags hat Vorrang. Die Migrationshinweise stehen in UPGRADE-6.8.md.
- Bewertungen brauchen ab 6.8 Autor und Sternebewertung Mit aktivem v6.8.0.0 lehnt POST /store-api/product/{productId}/review Bewertungen ohne points ab, und die Entität product_review verlangt externalUser und points (1 bis 5). Integrationen, Importe und Headless-Frontends, die Bewertungen anlegen, sollten beide Felder schon jetzt senden. Bestehende Bewertungen ohne Wertung erhalten beim 6.8-Update 0 Punkte, was wie „keine Wertung" behandelt wird.
- Weitere Änderungen Die Entfernung von $tc() sowie der Twig-Funktionen category_url und category_linknewtab wurde von 6.8 auf 6.9 verschoben. Verkaufskanäle vom Typ Produktvergleich oder Agentic Commerce lassen sich wieder ohne Standardwährung in der Währungsliste speichern, wie vor 6.7.15.0. Apps mit eigenen MCP-Tools, -Prompts oder -Ressourcen sind nach dem Update neu zu installieren oder zu aktualisieren, weil ihre Einträge nicht migriert werden. Themes, die die Warenkorb- oder Bestätigungs-Templates komplett ersetzen, übernehmen das neue Attribut data-checkout-customer-storage-reset. Alle übrigen Änderungen, darunter Extension-Events für sämtliche Store-API-Routen, neue Store-API-Routen für Nachbestellungen und eine überarbeitete MCP-Ergebnisstruktur, stehen im Changelog auf GitHub.
Quellen
Unsere Empfehlung: Planen Sie das Update ein. Für Betreiber sind die Korrekturen im Rule Builder und die Preisauszeichnung nach dem 30-Tage-Tiefstpreis relevant, Letzteres auch rechtlich. Wenn Sie Rabatte oder Versandarten über Warenkorb-Regeln steuern, prüfen Sie nach dem Update, ob diese noch wie gewollt greifen. Hinterlegen Sie Garantiebedingungen zu Ihren Produkten, wenn Sie das GARAN-Label nutzen, und lassen Sie eine angepasste Bestellbestätigung auf die neue GARAN-Variable umstellen. Wer den MCP-Server einsetzt, gibt die Zugriffe für Integrationen nach dem Update neu frei. Betreiber mit eigenen Themes oder Erweiterungen sollten die technischen Hinweise mit ihrer Agentur durchgehen, vor allem die Content-Security-Policy für statische Dateien unter Apache, das aufgeteilte Gewährleistungs-Snippet und die Vorbereitung auf 6.8.
Kommentare
Noch keine Kommentare vorhanden.
Kommentar schreiben