Magento 2: Ocultar otros métodos de envío cuando el envío gratuito está disponible


11

Cobro a mis clientes una tarifa plana por el envío y también ofrezco envío gratuito para pedidos que superan cierta cantidad. Por el momento, los clientes que califican para envío gratis también tendrán la opción de envío pagado que se muestra, lo que puede confundir a algunos clientes. ¿Alguien sabe si hay una manera de ocultar otros métodos de envío cuando el método de envío gratuito está disponible?

Respuestas:


6

Yo tuve el mismo problema.

Elimine la configuración de "Envío gratuito" porque no la necesita (ya tiene "Reglas de precios de carrito").

Cuando su cliente califica para el envío gratuito, esto ocurre en base a la "Tarifa fija" que no se encuentra en "Envío gratuito".


6

Escriba un complemento para deshabilitar el método de envío de tarifa plana cuando el envío gratuito esté habilitado en función del subtotal del carrito.

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

Escriba una clase de modelo para procesar la validación subtotal.

<?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
hola @maniprakash donde necesito crear di.xml?
Nagaraju K

2
Romba nandri está funcionando bien.
Nagaraju K

1
¿Cómo ocultar los métodos de envío basados ​​en el atributo del producto / artículo del carrito?
Nagaraju K


1

en respuesta a @Nagaraju y esperando ayudar a cualquiera.

El di.xml se puede crear en cualquier módulo que tenga, o si no sabe cómo y dónde:

app / code / My_Vendor / MyModule / etc / di.xml -> aquí es donde colocas el código de @maniprakash

entonces deberías crear la clase en:

app / code / My_Vendor / MyModule / Model / Flatrate -> y pegue el código de clase de @maniprakash

Solo recuerde cambiar la ruta en la etiqueta de tipo en el di.xml

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

la ruta debe coincidir donde está su clase de modelo . en mi ejemplo debería ser

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

¡Y eso es! ¡Espero eso ayude! y gracias a @manipakrash, ¡me ayuda! =)


0

Ocultar envío gratis al finalizar la compra

Proveedor / 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 / Modelo / 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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.