Zum Inhalt

SW6: Dynamische Versandkosten im Produktvergleich

Bild 1

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 shippingCost und Twig-Funktion shippingPrice fü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_format nie direkt auf den Filter anwenden. null|number_format(2) ergibt 0.00 und macht damit aus „nicht ermittelbar" ein „kostenloser Versand". Stattdessen wie im Google-Beispiel oben zuerst in eine Variable schreiben und auf null prü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