마 젠토 2 : 무료 배송이 가능한 경우 다른 배송 방법 숨기기


11

고객에게 배송료를 고정 요금으로 청구하고 일정 금액을 초과하는 주문에 대해서는 무료 배송도 제공합니다. 현재 무료 배송 자격이있는 고객에게는 유료 배송 옵션이 표시되어 일부 고객을 혼동 할 수 있습니다. 무료 배송 방법을 사용할 수있을 때 다른 배송 방법을 숨길 수있는 방법이 있는지 아는 사람이 있습니까?

답변:


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을 만들어야합니까?
나가라 주 K

2
Romba nandri는 잘 작동합니다.
나가라 주 K

1
제품 / 카트 품목 속성에 따라 배송 방법을 숨기는 방법?
Nagaraju K


1

@Nagaraju에 대한 답변으로 누군가에게 도움을주기를 바랍니다.

di.xml은 모든 모듈에서 또는 방법과 위치를 모르는 경우에 만들 수 있습니다.

app / code / My_Vendor / MyModule / etc / di.xml- > 여기 @maniprakash의 코드를 넣습니다

그런 다음 클래스를 만들어야합니다.

app / code / My_Vendor / MyModule / Model / Flatrate- > @maniprakash 의 클래스 코드를 붙여 넣습니다.

di.xml에서 type 태그의 경로를 변경해야합니다.

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

플러그인 / 모델 /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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.