Magento 2: nascondi altri metodi di spedizione quando è disponibile la spedizione gratuita


11

Faccio pagare forfait ai miei clienti per la spedizione e offro anche la spedizione gratuita per ordini superiori a un determinato importo. Al momento, i clienti che si qualificano per la spedizione gratuita avranno anche mostrato l'opzione di spedizione a pagamento, che potrebbe confondere alcuni clienti. Qualcuno sa se c'è un modo per nascondere altri metodi di spedizione quando è disponibile il metodo di spedizione gratuito?

Risposte:


6

Ho avuto lo stesso problema.

Rimuovi la configurazione "Spedizione gratuita" perché non ti serve (hai già "Regole del prezzo del carrello").

Quando il tuo cliente si qualifica per la spedizione gratuita, ciò avviene in base a "Tariffa forfettaria" e non in "Spedizione gratuita".


6

Scrivi un plug-in per disabilitare il metodo di spedizione forfettario quando la spedizione gratuita è effettivamente abilitata in base al totale parziale del carrello.

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

Scrivi una classe Model per elaborare la convalida totale parziale.

<?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
ciao @maniprakash dove devo creare di.xml?
Nagaraju K,

2
Romba Nandri funziona benissimo.
Nagaraju K,

1
come nascondere i metodi di spedizione in base all'attributo articolo prodotto / carrello?
Nagaraju K,


1

in risposta a @Nagaraju e sperando di aiutare chiunque.

Di.xml può essere creato in qualsiasi modulo tu abbia, o se non sai come e dove:

app / code / My_Vendor / MyModule / etc / di.xml -> qui è dove inserisci il codice di @maniprakash

allora dovresti creare la classe in:

app / code / My_Vendor / MyModule / Model / Flatrate -> e incolla il codice di classe di @maniprakash

Ricorda solo di cambiare il percorso nel tag type sul di.xml

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

il percorso deve corrispondere al punto in cui si trova la tua classe Model . nel mio esempio dovrebbe essere

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

E questo è tutto! spero che sia d'aiuto! e grazie a @manipakrash, mi aiuta! =)


0

Nascondi la spedizione gratuita al momento del pagamento

Venditore / 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 / Modello / 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.