Magento 2: Ukryj inne metody wysyłki, gdy dostępna jest bezpłatna wysyłka


11

Obciążam moich klientów zryczałtowaną stawką za wysyłkę, a także oferuję bezpłatną wysyłkę za zamówienia powyżej określonej kwoty. W tej chwili klienci, którzy kwalifikują się do bezpłatnej wysyłki, będą również mieli opcję płatnej wysyłki, co może wprowadzać w błąd niektórych klientów. Czy ktoś wie, czy istnieje sposób na ukrycie innych metod wysyłki, gdy dostępna jest bezpłatna metoda wysyłki?

Odpowiedzi:


6

Miałem ten sam problem.

Usuń konfigurację „Bezpłatna dostawa”, ponieważ nie jest ona potrzebna (masz już „Reguły ceny koszyka”).

Gdy klient kwalifikuje się do bezpłatnej wysyłki, dzieje się to na podstawie „Stawki ryczałtowej”, a nie „Bezpłatnej wysyłki”.


6

Napisz wtyczkę, aby wyłączyć metodę wysyłki według stawki ryczałtowej, gdy bezpłatna wysyłka jest faktycznie włączona na podstawie sumy częściowej koszyka.

<?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>

Napisz klasę modelu, aby przetworzyć sumę częściową.

<?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
cześć @maniprakash, gdzie muszę utworzyć plik di.xml?
Nagaraju K,

2
Romba nandri działa dobrze.
Nagaraju K,

1
jak ukryć metody wysyłki w oparciu o atrybut produktu / koszyka?
Nagaraju K


1

w odpowiedzi na @Nagaraju i mając nadzieję na pomoc każdemu.

Plik di.xml można utworzyć w dowolnym module, który posiadasz lub jeśli nie wiesz jak i gdzie:

app / code / My_Vendor / MyModule / etc / di.xml -> tutaj umieszczasz kod @maniprakash

następnie powinieneś utworzyć klasę w:

app / code / My_Vendor / MyModule / Model / Flatrate -> i wklej kod klasy @maniprakash

Pamiętaj tylko, aby zmienić ścieżkę w tagu typu na di.xml

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

ścieżka musi pasować do miejsca, w którym znajduje się klasa modelu . w moim przykładzie powinno być

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

I to wszystko! mam nadzieję, że to pomoże! a dzięki @manipakrash pomaga mi to! =)


0

Ukryj bezpłatną wysyłkę przy kasie

Dostawca / magento / Magento_Checkout / template / shipping-address / shipping-method-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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.