Magento 2: masquer les autres méthodes d'expédition lorsque la livraison gratuite est disponible

11

Je facture à mes clients un tarif forfaitaire pour l'expédition et j'offre également la livraison gratuite pour les commandes supérieures à un certain montant. Pour le moment, les clients qui se qualifient pour la livraison gratuite auront également une option d'expédition payante indiquée, ce qui peut dérouter certains clients. Est-ce que quelqu'un sait s'il existe un moyen de masquer d'autres méthodes d'expédition lorsque la méthode de livraison gratuite est disponible?

ifek
la source

Réponses:

6

J'ai eu le même problème.

Supprimez la configuration "Livraison gratuite" car vous n'en avez pas besoin (vous disposez déjà de "Règles de prix du panier").

Lorsque votre client se qualifie pour la livraison gratuite, cela se produit sur la base du "tarif forfaitaire" et non de la "livraison gratuite".

Gabriel Silva
la source
6

Écrivez un plugin pour désactiver la méthode d'expédition forfaitaire lorsque la livraison gratuite est réellement activée en fonction du sous-total du panier.

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

Écrivez une classe de modèle pour traiter la validation sous-totale.

<?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
la source
1
salut @maniprakash où j'ai besoin de créer di.xml?
Nagaraju K
2
Romba nandri fonctionne bien.
Nagaraju K
1
comment masquer les méthodes d'expédition basées sur l'attribut d'article de produit / panier?
Nagaraju K
5

Utilisez l'extension ShippingTweaks .

Vitalii
la source
Bonjour @vitalli, ce module m'aidera-t-il à masquer les méthodes d'expédition en fonction de mon attribut de produit?
Nagaraju K
1

en réponse à @Nagaraju et en espérant aider tout le monde.

Le di.xml peut être créé dans n'importe quel module dont vous disposez, ou si vous ne savez pas comment ni où:

app / code / My_Vendor / MyModule / etc / di.xml -> c'est ici que vous mettez le code de @maniprakash

alors vous devez créer la classe dans:

app / code / My_Vendor / MyModule / Model / Flatrate -> et collez le code de classe de @maniprakash

N'oubliez pas de changer le chemin dans la balise type sur le di.xml

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

le chemin doit correspondre à l'emplacement de votre classe Model . dans mon exemple devrait être

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

Et c'est tout! J'espère que cela aide! et grâce à @manipakrash, ça m'aide! =)

Joshua Castro
la source
0

Masquer la livraison gratuite à la caisse

Fournisseur / 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
la source
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 / Modèle / 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;
}
Développeur Stanislav
la source