SW6: Dynamische Versandkosten im Produktvergleich

Dieses Plugin berechnet im Shopware-6-Produktexport die Versandkosten eines Produkts nach derselben Logik wie die Storefront – inklusive Rule Builder. Damit lassen sich Feeds für Preisportale (Google Shopping, Idealo, billiger.de u. a.) mit korrekten Versandkosten je Produkt befüllen. Es ist das Gegenstück zum Shopware-5-Smarty-Modifier {$sArticle|@shippingcost:"prepayment":"de"|escape:number}.
4,95 € / Monat
Zum Store: Link folgt
Features
- Twig-Filter
shippingCostund Twig-FunktionshippingPricefür Produktexport-Templates - Berechnung nach Storefront-Logik inklusive Rule Builder (Warenwert, Gewicht, Warenkorbinhalt)
- Versandart, Land, Zahlart, Kundengruppe und Menge frei je Template-Aufruf wählbar
- Gesperrte Versandarten liefern bewusst keinen Preis statt eines nicht wählbaren Betrags
- Container-Produkte werden automatisch auf die Hauptvariante aufgelöst
- Optionaler Ergebnis-Cache für große Feeds
- Keine Änderung am Produktexport-Kern, dadurch verträglich mit anderen Export-Plugins
1. Installation
Das Plugin über den Shopware Community Store beziehen und anschließend im Admin Bereich von Shopware installieren und aktivieren. Dies geht über „Meine Einkäufe“ oder den direkten Plugin Upload im ZIP Format.
Voraussetzung: Shopware 6.7 (getestet gegen 6.7.11). Nach der Aktivierung stehen die Twig-Filter im Produktexport sofort zur Verfügung, eine weitere Einrichtung ist nicht erforderlich.
2. Funktionsbeschreibung
Das Plugin stellt im Produktexport-Template zwei neue Bausteine bereit:
| Baustein | Rückgabe |
|---|---|
product\|shippingCost(...) |
Versandkosten als Zahl |
shippingPrice(product, ...) |
vollständiges CalculatedPrice-Objekt (Netto, Steueranteile) |
Beide werden unter Kataloge → Produktexporte → [Export] → Template im Export-Body verwendet.
2.1 Grundlegende Verwendung
{# Versandart über technical_name, Land über ISO oder ISO3 #}
{{ product|shippingCost('shipping_standard', 'DE') }}
{# Ohne Argumente: Versandart, Land, Zahlart und Kundengruppe des Sales Channels #}
{{ product|shippingCost }}
Alle Argumente sind optional:
| Argument | Auflösung über |
|---|---|
| Versandart | technical_name oder ID |
| Land | iso, iso3 oder ID |
| Zahlart | technical_name oder ID |
| Kundengruppe | Name oder ID |
| Menge | Zahl, Standard = Mindestbestellmenge |
Ersatzwert (fallback) |
Zahl |
Bewusst kein Abgleich über den Anzeigenamen der Versandart: Ein Tippfehler soll einen Logeintrag erzeugen und nicht still die falsche Versandart treffen.
2.2 Beispiele
Für den Feed formatieren
{{ product|shippingCost('shipping_standard', 'DE')|number_format(2, ',', '') }}
Zahlart und Kundengruppe berücksichtigen (wirken auf Rule-Builder-Bedingungen)
{{ product|shippingCost('shipping_express', 'AT', 'prepayment', 'B2B') }}
Menge überschreiben und Ersatzwert für Pflichtfelder des Portals setzen
{{ product|shippingCost('shipping_standard', 'DE', quantity=1, fallback=0) }}
Steueranteile oder Nettobetrag ausgeben
{% set price = shippingPrice(product, 'shipping_standard', 'DE') %}
{{ price.unitPrice }} {{ price.calculatedTaxes.amount }}
Google-Shopping-Feld shipping (Auszug)
<g:shipping>
<g:country>DE</g:country>
<g:service>Standard</g:service>
{%- set shippingCosts = product|shippingCost('shipping_standard', 'DE') -%}
<g:price>{{ shippingCosts is null ? '' : shippingCosts|number_format(2, '.', '') }} EUR</g:price>
</g:shipping>
2.3 Rückgabewerte
| Situation | shippingCost |
shippingPrice |
|---|---|---|
| Versandkosten ermittelt | Betrag als Zahl | CalculatedPrice |
| Produkt ist versandkostenfrei | 0.0 |
CalculatedPrice mit 0 |
| Nur digitale Artikel (Download) | 0.0 |
CalculatedPrice mit 0 |
| Versandart für diesen Fall gesperrt | null bzw. Ersatzwert |
null |
| Versandart/Land/Zahlart unbekannt | null bzw. Ersatzwert |
null |
Der Betrag kommt im Steuerzustand des Export-Kontexts, also brutto bei einer Bruttokundengruppe und netto bei einer Nettokundengruppe. Damit passen Artikelpreis und Versandkosten im selben Feed zusammen.
Wichtig:
|number_formatnie direkt auf den Filter anwenden.null|number_format(2)ergibt0.00und macht damit aus „nicht ermittelbar" ein „kostenloser Versand". Stattdessen wie im Google-Beispiel oben zuerst in eine Variable schreiben und aufnullprüfen.
Der Filter wirft nie eine Exception, denn eine Exception aus dem Template würde den gesamten Export abbrechen und nicht nur die betroffene Zeile. Probleme landen stattdessen als Warnung im Log, dedupliziert pro Grund und nicht pro Produkt.
2.4 Verhalten in Sonderfällen
Gesperrte Versandarten liefern nichts statt eines Preises. Ist die Verfügbarkeitsregel der Versandart nicht erfüllt, berechnet Shopware zwar einen Preis, der Kunde kann die Versandart aber nicht wählen. Das Plugin gibt in diesem Fall null zurück, damit der Feed sie nicht bepreist.
Container-Produkte werden auf eine Variante aufgelöst. Bei deaktivierter Variantenausgabe exportiert Shopware Elternprodukte, die im Warenkorb nicht rechenbar sind. Gerechnet wird deshalb mit der Hauptvariante, ersatzweise mit der günstigsten Variante – also derjenigen, deren Preis die exportierte Zeile ohnehin ausweist.
Menge ist die Mindestbestellmenge. Ohne Angabe von quantity wird mit der Mindestbestellmenge gerechnet (mindestens 1). Bei einer Mindestbestellmenge von 5 wäre eine Versandkostenangabe für 1 Stück eine Zahl, die im Shop nie entsteht.
2.5 Plugin-Einstellungen: Ergebnis-Cache
Unter Erweiterungen → Meine Erweiterungen → Konfiguration → Performance lässt sich ein Ergebnis-Cache aktivieren. Er ist standardmäßig aus.
Ist er aktiv, wird eine bereits berechnete Versandkostenangabe wiederverwendet, sobald ein Produkt in allen Merkmalen übereinstimmt, die in die Berechnung eingehen: Versandart, Land, Zahlart, Kundengruppe, Währung, Menge, Stückpreis samt Staffelpreisen, Gewicht, Abmessungen, Versandkostenfrei-Kennzeichen, Steuersatz und Produktzustand (physisch/Download).
Der Cache lebt nur für die Dauer eines Exportlaufs im Arbeitsspeicher. Jeder neue Lauf rechnet frisch, eine Invalidierung ist deshalb nicht nötig.
Gemessen auf dem Demo-Datensatz (6 Produkte mit je 50 identischen Filteraufrufen):
| Berechnungen | Laufzeit | |
|---|---|---|
| Cache aus | 300 | 2.060 ms |
| Cache an | 6 | 830 ms |
Die Ausgabe ist mit und ohne Cache identisch.
Wann der Cache nicht aktiviert werden darf: Sobald eine Regel in den Versandkosten von einem konkreten Produkt, Hersteller, einer Kategorie oder Eigenschaft abhängt, bekämen Produkte mit gleichem Preis und Gewicht den zwischengespeicherten Betrag eines anderen Produkts. Diese Merkmale stecken nicht im Cache-Schlüssel und können es auch nicht, weil der Rule Builder beliebige Bedingungen zulässt. Genau deshalb ist der Schalter standardmäßig aus.
2.6 Laufzeit großer Feeds
Je Filteraufruf wird ein Warenkorb mit einer Position durch dieselbe Pipeline geschickt wie im Checkout. Auf dem Demo-Datensatz kostet das rund 4,4 ms und 1,8 zusätzliche Datenbankabfragen je Berechnung. Ein Feed mit 10.000 Produkten und einem Filteraufruf je Zeile liegt damit grob bei 45 Sekunden zusätzlicher Laufzeit.
Für einen nächtlichen Cronjob ist das unkritisch. Für einen Live-Abruf des Feeds über die Storefront-URL sollte der Export stattdessen zeitgesteuert erzeugt und ausgeliefert werden.
2.7 Grenzen
- Keine automatische Ermittlung der günstigsten verfügbaren Versandart – die Versandart wird im Template benannt.
- Die Plugin-Konfiguration enthält ausschließlich den Ergebnis-Cache. Versandart, Land, Zahlart, Kundengruppe und Menge werden im Template gesetzt.
- Die Filter funktionieren ausschließlich innerhalb eines Produktexport-Templates, nicht in Storefront- oder E-Mail-Templates.
3. Support / Kontakt
In Support Fällen wenden Sie sich bitte über support@ottscho.de mit folgenden Informationen an uns.
- Shopware Version
- Plugin Version
- Plugin Einstellungen
- Verwendetes Produktexport-Template (der relevante Ausschnitt)
- Log Datei
- Fehlerbeschreibung