SW6 Lieferzeit in Mail-Templates anzeigen

Die korrekte Angabe der Lieferzeit in der Bestellbestätigung ist für viele Shopbetreiber in Shopware 6 nicht nur eine Frage der Transparenz, sondern häufig auch eine rechtliche Notwendigkeit. Kunden erwarten klare Informationen darüber, wann sie mit der Lieferung ihrer bestellten Produkte rechnen können – auch nach Abschluss des Bestellvorgangs per E-Mail.

Standardmäßig bietet Shopware 6 jedoch keine Möglichkeit, die Lieferzeit der einzelnen Produkte in der Bestellbestätigungs-E-Mail oder in den E-Mail-Templates anzuzeigen. Zwar ist die Lieferzeit im Produkt gepflegt und im Storefront sichtbar, sie wird jedoch nicht automatisch an die E-Mail-Templates übergeben.

In diesem Beitrag zeigen wir Schritt für Schritt, wie sich die Lieferzeit in Shopware 6 in der Bestellbestätigung anzeigen lässt, welche technischen Hintergründe dabei zu beachten sind und wie die Lieferzeiten der Produkte sauber und mehrsprachig in die E-Mail-Templates integriert werden können.

PHP

class MailDeliveryTimeSubscriber implements EventSubscriberInterface
{
    private EntityRepository $productRepository;

    public function __construct(
        EntityRepository $productRepository
    ) {
        $this->productRepository = $productRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            MailBeforeValidateEvent::class => 'mailBeforeSent'
        ];
    }

    public function mailBeforeSent(MailBeforeValidateEvent $event): void
    {
        $data = $event->getTemplateData();
        $order = $data['order'] ?? null;

        if (!$order instanceof OrderEntity) {
            return;
        }

        $context = $event->getContext();

        $addDeliveryTimePayload = function (OrderLineItemEntity $lineItem) use (&$addDeliveryTimePayload, $context, $order) {
            $payload = $lineItem->getPayload() ?? [];

            $productId = $lineItem->getReferencedId();
            if ($productId) {
                $criteria = new Criteria([$productId]);
                $criteria->addAssociation('deliveryTime.translation');

                $product = $this->productRepository->search($criteria, $context)->first();
                if ($product && $product->getDeliveryTime()) {
                    $deliveryTime = $product->getDeliveryTime();
                    $min = $deliveryTime->getMin();
                    $max = $deliveryTime->getMax();

                    $languageId = $order->getLanguageId(); // UUID der Sprache, die der Kunde gewählt hat
                    // Mapping von UUID zu ISO-Code (falls keine Locale verfügbar)
                    $uuidToIso = [
                        '2fbb5fe2e29a4d70aa5854ce7ce3e20b' => 'de-DE', // Deutsch
                        '9648f3385d614c55bd7cd4dc68d301cc' => 'en-GB', // Englisch
                    ];

                    $localeCode = $uuidToIso[$languageId] ?? 'de-DE';
                    // Mapping pro Sprache
                    $unitTranslations = [
                        'de-DE' => [
                            'day' => 'Tage',
                            'week' => 'Wochen',
                            'month' => 'Monate',
                        ],
                        'en-GB' => [
                            'day' => 'days',
                            'week' => 'weeks',
                            'month' => 'months',
                        ],
                    ];

                    $unit = $deliveryTime->getUnit(); // intern: day, week, month

                    // Übersetzte Einheit holen, fallback auf Original
                    $unitTranslated = $unitTranslations[$localeCode][$unit] ?? $unit;
                    $readable = ($min !== null && $max !== null)
                        ? ($min === $max
                            ? sprintf('%d %s', $min, $unitTranslated)
                            : sprintf('%d – %d %s', $min, $max, $unitTranslated))
                        : $name ?? '';

                    $payload['deliveryTime'] = (string)$readable;
                    $payload['deliveryTimeMin'] = (string)($min ?? '');
                    $payload['deliveryTimeMax'] = (string)($max ?? '');
                    $payload['deliveryTimeUnit'] = (string)$unit;
                }
            }

            $lineItem->setPayload($payload);

            foreach ($lineItem->getChildren() as $child) {
                $addDeliveryTimePayload($child);
            }
        };

        foreach ($order->getNestedLineItems() as $nestedItem) {
            $addDeliveryTimePayload($nestedItem);
        }

        $event->setTemplateData($data);
    }
}
  
Auszug Quellcode der Klasse MailDeliveryTimeSubscriber um den Subscriber für deliveryTime in Shopware6 hinzuzufügen.

Aufgrund dieser Problematik haben wir uns dazu entschieden, diesen Artikel zu veröffentlichen und zu zeigen, wie sich der Platzhalter deliveryTime in den E-Mail-Templates von Shopware 6 ergänzen lässt.

Um den Platzhalter in den Mail-Templates verfügbar zu machen, wurde ein kleines, eigenständiges Plugin entwickelt. Dieses registriert einen Subscriber auf das Event MailBeforeValidateEvent, welches unmittelbar vor dem Versand der E-Mail ausgelöst wird. Dadurch können die E-Mail-Daten gezielt erweitert werden, bevor das Template gerendert wird.

Die eigentliche Logik zur Ermittlung und Anreicherung der Lieferzeit befindet sich in der Methode mailBeforeSent. Innerhalb dieser Methode werden alle bestellten Produkte der Bestellung durchlaufen und der jeweilige Payload der Line Items um zusätzliche Informationen erweitert. Konkret werden dabei folgende Werte ergänzt:

deliveryTime – die lesbare Lieferzeit (z. B. „2–4 Tage“)

deliveryTimeMin – minimale Lieferzeit

deliveryTimeMax – maximale Lieferzeit

deliveryTimeUnit – Einheit der Lieferzeit (Tag, Woche, Monat)

Durch diese Erweiterung stehen die Lieferzeitinformationen direkt im Mail-Template zur Verfügung und können dort flexibel ausgegeben oder weiterverarbeitet werden.

Zusätzlich enthält die Lösung ein einfaches Sprach-Mapping, das auf der im Auftrag verwendeten Sprache (Language UUID) basiert. Damit lassen sich die Einheiten der Lieferzeit aktuell für Deutsch und Englisch korrekt übersetzen. Sollten weitere Sprachen benötigt werden, kann dieses Mapping problemlos erweitert oder alternativ über eine Datenbankabfrage bzw. die zugehörige Locale-Entität abgebildet werden.

Twig

{% raw %}{% if nestedItem.payload.deliveryTime is defined %}{% endraw %} Lieferzeit: {{ nestedItem.payload.deliveryTime }} {% raw %}{% endif %}{% endraw %}
Quellcode des Mail-Templates.

Der Platzhalter deliveryTime kann im Mail-Template wie oben dargestellt direkt verwendet werden. Darüber hinaus stehen auch die zusätzlichen Platzhalter deliveryTimeMin, deliveryTimeMax und deliveryTimeUnit zur Verfügung und können bei Bedarf einzeln oder kombiniert im Template ausgegeben werden.

Das Plugin wurde für Shopware 6.6 entwickelt und getestet. Bei älteren oder neueren Shopware-Versionen können unter Umständen Anpassungen erforderlich sein, insbesondere im Bereich der Events oder der Datenstrukturen.

Der vollständige Sourcecode des Plugins steht über den folgenden GitHub-Link zur Verfügung und kann dort eingesehen sowie heruntergeladen werden.