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?

ifek
quelle

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".

Gabriel Silva
quelle
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;
    }
}
Maniprakash Chinnasamy
quelle
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
5

Verwenden Sie die Erweiterung ShippingTweaks .

Vitalii
quelle
Hallo @vitalli, hilft mir dieses Modul, Versandmethoden basierend auf meinem Produktattribut zu verbergen?
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! =)

Joshua Castro
quelle
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" />

Akshat Sarmandal
quelle
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;
}
Entwickler Stanislav
quelle