Magento 2: Andere Versandmethoden ausblenden, wenn kostenloser Versand verfügbar ist


11

Ich berechne meinen Kunden eine Versandkostenpauschale und biete auch kostenlosen Versand für Bestellungen an, die über einem bestimmten Betrag liegen. Momentan wird Kunden, die sich für den kostenlosen Versand qualifizieren, auch die Option für den bezahlten Versand angezeigt, was einige Kunden verwirren kann. Weiß jemand, ob es eine Möglichkeit gibt, andere Versandmethoden zu verbergen, wenn eine kostenlose Versandmethode verfügbar ist?

Antworten:


6

Ich hatte das gleiche Problem.

Entfernen Sie die Konfiguration "Kostenloser Versand", da Sie sie nicht benötigen (Sie haben bereits "Warenkorbpreisregeln").

Wenn sich Ihr Kunde für den kostenlosen Versand qualifiziert, geschieht dies auf der Grundlage der "Flatrate", nicht unter "Kostenloser Versand".


6

Schreiben Sie ein Plugin, um die Versandmethode mit Flatrate zu deaktivieren, wenn der kostenlose Versand basierend auf der Gesamtsumme des Warenkorbs tatsächlich aktiviert ist.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\OfflineShipping\Model\Carrier\Flatrate">
        <plugin name="disable-flatrate" type="Vendor\ModuleName\Model\Carrier\Flatrate" sortOrder="1" />
    </type>
</config>

Schreiben Sie eine Modellklasse, um die Zwischensummenvalidierung zu verarbeiten.

<?php
namespace Vendor\ModuleName\Model\Carrier;

class Flatrate
{

    const XML_PATH_FREE_SHIPPING_SUBTOTAL = "carriers/freeshipping/free_shipping_subtotal";

    /**
     * @var \Magento\Checkout\Model\Session
     */
    protected $_checkoutSession;

    /**
     * @var \Magento\Framework\App\Config\ScopeConfigInterface
     */
    protected $_scopeConfig;

    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {
        $this->_storeManager = $storeManager;
        $this->_checkoutSession = $checkoutSession;
        $this->_scopeConfig = $scopeConfig;
    }

    public function afterCollectRates(\Magento\OfflineShipping\Model\Carrier\Flatrate $flatRate, $result)
    {
        $scopeId = $this->_storeManager->getStore()->getId();

        $storeScope = \Magento\Store\Model\ScopeInterface::SCOPE_STORES;

        // Get MOA value from system configuration.
        $freeShippingSubTotal = $this->_scopeConfig->getValue(self::XML_PATH_FREE_SHIPPING_SUBTOTAL, $storeScope, $scopeId);

        // Get cart subtotal from checkout session.
        $baseSubTotal = $this->_checkoutSession->getQuote()->getBaseSubtotal();

        // Validate subtoal should be empty or Zero.
        if(!empty($baseSubTotal) && !empty($freeShippingSubTotal)) {

            if($baseSubTotal >= $freeShippingSubTotal) {
                return false;
            }
        }

        return $result;
    }
}

1
hi @maniprakash wo muss ich di.xml erstellen?
Nagaraju K

2
Romba Nandri funktioniert gut.
Nagaraju K

1
Wie verstecke ich Versandmethoden basierend auf dem Produkt- / Warenkorb-Artikelattribut?
Nagaraju K


1

als Antwort auf @Nagaraju und in der Hoffnung, jemandem zu helfen.

Die Datei di.xml kann in jedem Modul erstellt werden, das Sie haben, oder wenn Sie nicht wissen, wie und wo:

app / code / My_Vendor / MyModule / etc / di.xml -> Hier geben Sie den Code von @maniprakash ein

dann sollten Sie die Klasse erstellen in:

app / code / My_Vendor / MyModule / Model / Flatrate -> und fügen Sie den Klassencode von @maniprakash ein

Denken Sie daran, den Pfad im Typ-Tag in der Datei di.xml zu ändern

<plugin name="disable-flatrate" type="Vendor\ModuleName\Model\Carrier\Flatrate" sortOrder="1" />

Der Pfad muss mit der Modellklasse übereinstimmen . in meinem Beispiel sollte sein

<plugin name="disable-flatrate" type="My_Vendor\MyModule\Model\Flatrate" sortOrder="1" />

Und das ist es! ich hoffe es hilft! und dank @manipakrash hilft es mir! =)


0

Verstecken Sie den kostenlosen Versand an der Kasse

Anbieter / magento / Magento_Checkout / template / Versandadresse / Versandart-item.html

<!-- ko if: method.carrier_code !== 'freeshipping' -->
<tr class="row"
click="element.selectShippingMethod">
<td class="col col-method">
    <input type="radio"
           class="radio"
           ifnot="method.error_message"
           ko-checked="element.isSelected"
           ko-value="method.carrier_code + '_' + method.method_code"
           attr="'aria-labelledby': 'label_method_' + method.method_code + '_' + method.carrier_code + ' ' + 'label_carrier_' + method.method_code + '_' + method.carrier_code,
                'checked': element.rates().length == 1 || element.isSelected" />
    <span class="label"></span>
</td>
<td class="col col-price">
    <each args="element.getRegion('price')" render="" />
</td>
<td class="col col-carrier"
    attr="'id': 'label_carrier_' + method.method_code + '_' + method.carrier_code"
    text="method.carrier_title" />


0

etc / di.xml

<type name="Magento\Quote\Model\ShippingMethodManagement">
    <plugin name="vendor_module_plugin_model_quote_shipping_method_management" type="Vendor\Module\Plugin\Model\ShippingMethodManagement"  disabled="false"/>
</type>

Plugin / Model / ShippingMethodManagement.php

public function afterEstimateByAddress($shippingMethodManagement, $output)
{
    return $this->filterOutput($output);
}

public function afterEstimateByExtendedAddress($shippingMethodManagement, $output)
{
    return $this->filterOutput($output);
}

public function afterEstimateByAddressId($shippingMethodManagement, $output)
{
    return $this->filterOutput($output);
}

private function filterOutput($output)
{
    $free = [];
    foreach ($output as $shippingMethod) {
        if ($shippingMethod->getCarrierCode() == 'freeshipping' && $shippingMethod->getMethodCode() == 'freeshipping') {
            $free[] = $shippingMethod;
        }
    }

    if ($free) {
        return $free;
    }
    return $output;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.