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

小計の検証を処理するモデルクラスを記述します。

<?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を作成する必要がありますか?
Nagaraju K 2018

2
Romba nandriは正常に動作しています。
Nagaraju K 2018

1
商品/カートアイテムの属性に基づいて配送方法を非表示にする方法
Nagaraju K


1

@ながらじゅに応えて、誰にでも助けたいと思っています。

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

パスは、モデルクラスのパスと一致する必要があります。私の例では

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