# Warenkorb Versandkosten ändern/aktualisieren

**URL:** <https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955>\
**Category:** Programmierung\
**Created:** [25. August 2022 um 14:57 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955 "2022-08-25T14:57:07Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [25. August 2022 um 14:57 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/1 "2022-08-25T14:57:07Z")

</div>

Hallo zusammen,  
ich versuche gerade die Versandkosten im Warenkorb anzupassen.  
Im BeforeLineItemAddedEvent sind die Deliveries allerdings noch leer.  
Im AfterLineItemAddedEvent zwar gesetzt und anpassbar, aber die Änderungen werden nicht angezeigt/gespeichert trotz cartService-\>recalculate.

Was mache ich falsch oder ist es im AfterLineItemAddedEvent nicht mehr möglich?

Vielen Dank für Eure Hilfe im Voraus!

---

<div class="post-metadata">

**Author:** ![FritzPerson](https://avatars.discourse-cdn.com/v4/letter/f/85e7bf/32.png) [@FritzPerson](https://forum.shopware.com/u/FritzPerson)\
**Post date:** [29. August 2022 um 16:08 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/2 "2022-08-29T16:08:37Z")

</div>

In der Datei CartItemAddRoute.php kann man den Ablauf sehen. Hast du es schon mit einer Cart Rule probiert? Die werden anscheinend vor dem cartPersister (Schreiben in DB) berechnet. Oder vielleicht hilft das: [Add cart collector/processor](https://developer.shopware.com/docs/guides/plugins/plugins/checkout/cart/add-cart-processor-collector). Sonst wäre eventuell noch ein Decorator auf CartCalculator eine Möglichkeit, aber da weiß ich nicht ob das so schön ist.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [31. August 2022 um 08:55 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/3 "2022-08-31T08:55:31Z")

</div>

Wenn du es im AfterCartLineItemAddedEvent setzt, musst du zusätzlich noch den Cart speichern, damit deine Änderungen übernommen werden.

---

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [1. September 2022 um 14:34 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/4 "2022-09-01T14:34:14Z")

</div>

Erst mal danke für die Rückmeldungen.

Eine Rule kann ich leider nicht nutzen weil die Versandkosten nur unter bestimmten Bedingungen entfallen die nicht per Rule umsetzbar sind.

Anbei mal ein Teil vom Code um den es geht aus AfterCartLineItemAddedEvent

```auto
$cart = $event->getCart();
$salesChannelContext = $event->getSalesChannelContext();
$deliveries = $cart->getDeliveries();
$delivery = $cart->getDeliveries()->first();
$costs = new CalculatedPrice(0.0, 0.0, new CalculatedTaxCollection(), new TaxRuleCollection());                                    
$delivery->setShippingCosts($costs);

$cart->setDeliveries($deliveries);                 
                    
$cart->markModified();

$this->cartService->recalculate($cart, $salesChannelContext);

```

Soweit ich sehen konnte müsste doch  
$this-\>cartService-\>recalculate($cart, $salesChannelContext)

das speichern auslösen.

Unter BeforeLineItemRemovedEvent nutze ich  
$this-\>cartService-\>recalculate($cart, $salesChannelContext)  
auch und da funktioniert es.

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [2. September 2022 um 05:56 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/5 "2022-09-02T05:56:11Z")

</div>

Stimmt, das Recalculate persistiert einen Cart. Jedoch wird in der Methode beim Calculate ein neuer Cart erstellt, welcher persistiert wird und als Rückgabewert zurückgegeben wird. Diesen müsstest du deinem $cart zuweisen, dann sollte es funktionieren, meiner Meinung nach.

---

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [2. September 2022 um 08:39 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/6 "2022-09-02T08:39:42Z")

</div>

Wie kann ich die Cart denn noch speichern, ohne eine neue Cart zu erzeugen?

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [2. September 2022 um 09:25 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/7 "2022-09-02T09:25:31Z")

</div>

Das ist das normale vorgehen. Shopware tut dies auch in seinem CartItemAddRoute.

Dort findest du die Stelle:

`$cart = $this->cartCalculator->calculate($cart, $context);`

---

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [2. September 2022 um 19:28 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/8 "2022-09-02T19:28:10Z")

</div>

Also ich habe jetzt statt:

```auto
$this->cartService->recalculate($cart, $salesChannelContext);

```

```auto
$cart = $this->cartCalculator->calculate($cart, $salesChannelContext);
$this->cartPersister->save($cart, $salesChannelContext);

```

wie auch unter CartItemAddRoute.  
Trotzdem wird es einfach nicht gespeichert ☹

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [3. September 2022 um 11:38 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/9 "2022-09-03T11:38:05Z")

</div>

Hast du Mal versuchte den Prozess zu debuggen?

Eventuell werden die Versandkosten von einem anderen Prozess wieder überschrieben.

---

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [9. September 2022 um 13:27 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/10 "2022-09-09T13:27:21Z")

</div>

Wahrscheinlich dumme Frage aber ich stelle sie trotzdem 😋  
Wie kann ich denn den ganzen Prozess debuggen?

---

<div class="post-metadata">

**Author:** ![abdullah](https://avatars.discourse-cdn.com/v4/letter/a/aeb1de/32.png) [@abdullah](https://forum.shopware.com/u/abdullah)\
**Post date:** [10. September 2022 um 14:22 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/11 "2022-09-10T14:22:05Z")

</div>

Am besten mit xDebug und du setzt an den entsprechenden Stellen Brakepoints.

Du kannst auch Logausgaben in den Code hinzufügen und dir die Log Datei angucken.

---

<div class="post-metadata">

**Author:** ![sunfire-design](https://avatars.discourse-cdn.com/v4/letter/s/cc9497/32.png) [@sunfire-design](https://forum.shopware.com/u/sunfire-design)\
**Post date:** [20. September 2022 um 18:19 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/12 "2022-09-20T18:19:37Z")

</div>

Danke für Deine Antwort, ich dachte es gibt vielleicht noch eine andere Möglichkeit als das.

Ich glaube langsam man kann den Preis der Versandkosten gar nicht ändern.  
Ich habe mir mal den CartPersister und die Tabelle Cart angeschaut.  
Es sieht so aus als wenn nur die shipping\_method\_id gespeichert wird und gar nicht die Höhe der Versandkosten.

---

<div class="post-metadata">

**Author:** ![salih](https://avatars.discourse-cdn.com/v4/letter/s/ea5d25/32.png) [@salih](https://forum.shopware.com/u/salih)\
**Post date:** [11. August 2025 um 09:51 UTC](https://forum.shopware.com/t/warenkorb-versandkosten-aendern-aktualisieren/95955/13 "2025-08-11T09:51:22Z")

</div>

Hallo, ich bin zwar etwas spät, aber vielleicht findet das jemand noch hilfreich. Es gibt einen Weg, wie man die Versandkosten mittels “Cart Processor” ändern kann. Das wichtige ist nur dass man die richtige Priority bei der Registrierung des Processors setzt.

Hier einmal der Ausschnitt aus der services.xml

```auto
<service id="PluginName\Core\Checkout\Cart\CustomCartProcessor">
    <!-- priority -5001 so it runs after the original delivery processor -->
    <tag name="shopware.cart.processor" priority="-5001" />
</service>

```

Und hier die CustomCartProcessor.php Datei

```auto
<?php

declare(strict_types=1);

namespace PluginName\Core\Checkout\Cart;

use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartBehavior;
use Shopware\Core\Checkout\Cart\CartProcessorInterface;
use Shopware\Core\Checkout\Cart\LineItem\CartDataCollection;
use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice;
use Shopware\Core\Checkout\Cart\Tax\Struct\CalculatedTaxCollection;
use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRuleCollection;
use Shopware\Core\System\SalesChannel\SalesChannelContext;

class CustomCartProcessor implements CartProcessorInterface
{
    public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
    {
        $delivery = $toCalculate->getDeliveries()->first();

        $manualShippingCosts = new CalculatedPrice(100.5, 100.5, new CalculatedTaxCollection(), new TaxRuleCollection());

        $delivery->setShippingCosts($manualShippingCosts);

        $toCalculate->getDeliveries()->clear();
        $toCalculate->getDeliveries()->add($delivery);
    }
}

```
