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?

ifek
źródło

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

Gabriel Silva
źródło
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;
    }
}
Maniprakash Chinnasamy
źródło
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
5

Użyj rozszerzenia ShippingTweaks .

Vitalii
źródło
Cześć @vitalli, czy ten moduł pomoże mi ukryć metody wysyłki w oparciu o mój atrybut produktu?
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! =)

Joshua Castro
źródło
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" />

Akshat Sarmandal
źródło
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;
}
Deweloper Stanislav
źródło