Magento 2: Ücretsiz gönderim mevcut olduğunda diğer gönderim yöntemlerini gizle


11

Müşterilerimi nakliye için sabit ücret alıyorum ve ayrıca belirli bir miktarın üzerindeki siparişler için ücretsiz gönderim hizmeti sunuyorum. Şu anda, ücretsiz gönderim için uygun olan müşteriler, bazı müşterileri karıştırabilecek ücretli nakliye seçeneğine de sahip olacaklar. Herkes, ücretsiz gönderim yöntemi mevcut olduğunda diğer gönderim yöntemlerini gizlemenin bir yolu olup olmadığını biliyor mu?

Yanıtlar:


6

Ben de aynı problemi yaşadım.

İhtiyacınız olmadığından "Ücretsiz Nakliye" yapılandırmasını kaldırın (zaten "Sepet Fiyat Kurallarına" sahipsiniz).

Müşteriniz ücretsiz gönderim için uygunsa, "Ücretsiz Nakliye" de değil "Sabit Ücret" e dayalı olarak gerçekleşir.


6

Ücretsiz gönderim gerçekte araba alt toplamına dayalı olarak etkinleştirildiğinde sabit oranlı gönderim yöntemini devre dışı bırakmak için bir eklenti yazın.

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

Alt toplam doğrulamayı işlemek için bir Model sınıfı yazın.

<?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
hi @maniprakash Nerede di.xml oluşturmak gerekir?
Nagaraju K

2
Romba nandri iyi çalışıyor.
Nagaraju K

1
ürün / alışveriş sepeti özelliğine göre gönderim yöntemlerini nasıl gizleyebilirim?
Nagaraju K


1

@Nagaraju'a yanıt olarak ve herkese yardım etmeyi umuyor.

Di.xml, sahip olduğunuz herhangi bir modülde veya nasıl ve nerede olduğunu bilmiyorsanız oluşturulabilir:

app / code / My_Vendor / MyModule / etc / di.xml -> İşte @maniprakash kodunu koyduğunuz yer

o zaman sınıfı şurada oluşturmalısınız:

app / code / My_Vendor / MyModule / Model / Flatrate -> ve @maniprakash sınıf kodunu yapıştırın

Di.xml dosyasındaki tip etiketindeki yolu değiştirmeyi unutmayın.

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

yol , Model sınıfınızın olduğu konumla eşleşmelidir . benim örneğimde olmalı

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

Ve bu kadar! Umarım yardımcı olur! ve @manipakrash sayesinde bana yardımcı oluyor! =)


0

Ödeme sırasında ücretsiz gönderimi gizle

Satıcı / Magento / Magento_Checkout / şablon / nakliye-adresi / nakliye-yöntem-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>

Eklenti / 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.