Magento 2: Скрыть другие способы доставки, когда доступна бесплатная доставка

11

Я взимаю с клиентов фиксированную ставку за доставку, а также предлагаю бесплатную доставку заказов, превышающих определенную сумму. На данный момент клиенты, имеющие право на бесплатную доставку, также будут иметь оплаченную опцию доставки, что может запутать некоторых клиентов. Кто-нибудь знает, есть ли способ скрыть другие способы доставки, когда доступен бесплатный способ доставки?

ifek
источник

Ответы:

6

У меня такая же проблема.

Удалите конфигурацию «Бесплатная доставка», потому что она вам не нужна (у вас уже есть «Правила цены корзины»).

Когда ваш клиент получает право на бесплатную доставку, это происходит на основе «фиксированной ставки», а не «Бесплатная доставка».

Габриэль Сильва
источник
6

Напишите плагин, чтобы отключить метод доставки по фиксированной ставке, когда бесплатная доставка фактически включена на основе общей суммы корзины.

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

Напишите класс Model для обработки итоговой проверки.

<?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
привет @maniprakash где мне нужно создать di.xml?
Нагараджу К
2
Ромба нандри работает нормально.
Нагаражу К
1
Как скрыть методы доставки на основе атрибута товара / корзины?
Нагараджу К
5

Используйте расширение ShippingTweaks .

Vitalii
источник
Привет, @vitalli. Этот модуль поможет мне скрыть способы доставки, основанные на атрибуте моего продукта?
Нагаражу К
1

в ответ на @Nagaraju и надеясь помочь кому-либо.

Файл di.xml может быть создан в любом вашем модуле, или если вы не знаете, как и где:

app / code / My_Vendor / MyModule / etc / di.xml -> здесь вы положили код @maniprakash

тогда вы должны создать класс в:

app / code / My_Vendor / MyModule / Model / Flatrate -> и вставьте код класса @maniprakash

Просто не забудьте изменить путь в тэге типа на di.xml

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

путь должен совпадать с вашим классом Model . в моем примере должно быть

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

И это все! Надеюсь, поможет! и благодаря @manipakrash, это помогает мне! знак равно

Джошуа Кастро
источник
0

Скрыть бесплатную доставку при оформлении заказа

Производитель / Magento / Magento_Checkout / шаблон / груз-адрес / грузить-метод-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

и т.д. / 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>

Плагин / 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;
}
Разработчик Станислав
источник