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?

ifek
fuente

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

Gabriel Silva
fuente
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;
    }
}
Maniprakash Chinnasamy
fuente
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
5

Use la extensión ShippingTweaks .

Vitalii
fuente
Hola @vitalli, ¿este módulo me ayudará a ocultar los métodos de envío basados ​​en el atributo de mi producto?
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! =)

Joshua Castro
fuente
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" />

Akshat Sarmandal
fuente
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;
}
Desarrollador Stanislav
fuente