Magento 2: Sembunyikan metode pengiriman lain saat pengiriman gratis tersedia

11

Saya membebankan biaya tetap kepada pelanggan saya untuk pengiriman dan saya juga menawarkan pengiriman gratis untuk pesanan yang di atas jumlah tertentu. Pada saat ini, pelanggan yang memenuhi syarat untuk pengiriman gratis juga akan membayar opsi pengiriman yang ditunjukkan, yang dapat membingungkan beberapa pelanggan. Adakah yang tahu jika ada cara untuk menyembunyikan metode pengiriman lain saat metode pengiriman gratis tersedia?

ifek
sumber

Jawaban:

6

Saya memiliki masalah yang sama.

Hapus konfigurasi "Pengiriman Gratis" karena Anda tidak memerlukannya (Anda sudah memiliki "Aturan Harga Keranjang").

Ketika pelanggan Anda memenuhi syarat untuk pengiriman gratis, itu terjadi berdasarkan "Tarif Flat" bukan dalam "Pengiriman Gratis".

Gabriel Silva
sumber
6

Tulis sebuah plugin untuk menonaktifkan metode pengiriman flat rate ketika pengiriman gratis sebenarnya diaktifkan berdasarkan sub total keranjang.

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

Tulis kelas Model untuk memproses validasi sub total.

<?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
sumber
1
hai @maniprakash di mana saya harus membuat di.xml?
Nagaraju K
2
Romba nandri itu berfungsi dengan baik.
Nagaraju K
1
bagaimana cara menyembunyikan metode pengiriman berdasarkan atribut item produk / kereta?
Nagaraju K
5

Gunakan ekstensi ShippingTweaks .

Vitalii
sumber
Hai @vitalli apakah modul ini akan membantu saya menyembunyikan metode pengiriman berdasarkan atribut produk saya?
Nagaraju K
1

sebagai tanggapan terhadap @Nagaraju dan berharap dapat membantu siapa pun.

Di.xml dapat dibuat dalam modul apa pun yang Anda miliki, atau jika Anda tidak tahu bagaimana dan di mana:

app / code / My_Vendor / MyModule / etc / di.xml -> di sinilah Anda meletakkan kode @maniprakash

maka Anda harus membuat kelas di:

app / code / My_Vendor / MyModule / Model / Flatrate -> dan rekatkan kode kelas @maniprakash

Ingatlah untuk mengubah path pada tag jenis pada di.xml

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

jalur harus cocok dengan di mana kelas Model Anda berada . dalam contoh saya seharusnya

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

DAN hanya itu! semoga membantu! dan terima kasih kepada @manipakrash, ini membantu saya! =)

Joshua Castro
sumber
0

Sembunyikan pengiriman gratis saat checkout

Vendor / magento / Magento_Checkout / template / alamat pengiriman / pengiriman-metode-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
sumber
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 / 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;
}
Pengembang Stanislav
sumber