답변:
무료 배송이 실제로 카트 하위 합계를 기반으로 활성화 된 경우 고정 요금 배송 방법을 비활성화하는 플러그인을 작성하십시오.
<?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;
}
}
@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 덕분에 도움이됩니다! =)
결제시 무료 배송 숨기기
공급 업체 /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" />
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;
}