Magento免费送货的比赛项目只-使用表率基于订单总额

lvjbypge  于 2023-01-17  发布在  其他
关注(0)|答案(4)|浏览(149)

我可以实现以下与Magento:
我使用的是价格与目的地的表费率系统,并且我有一个购物车价格规则“免费送货”,属性free_shipping -〉设置为“是”。
如果您的购物篮中有正常产品或免运费产品,这很好用。但是,如果购物篮中既有正常产品又有免运费产品,它会根据订单总额(包括免运费产品)计算运费。
我该如何更正这一点,使航运只适用于订单总额的产品不包括免费送货,当两种类型的产品都存在于篮子?
有一个Magento插件为这个?

6ljaweal

6ljaweal1#

我遇到了同样的问题,并实现了一个小的代码更改,使其工作。
基本上忘记了促销规则。禁用它。它似乎不能正常工作时,适用于免费送货到个别项目的运费表。航运规则似乎优先和计算的基础上购物车总额。
诀窍是在运费模块进行计算时,从购物车总额中减去免费送货项目。
在我的例子中,在一个特定类别(id:15)中的所有东西都是免费送货的,但是你可以修改逻辑来满足你的需要。
您需要修改以下文件(或将其复制到本地代码库以正确执行操作)。
app\code\core\Mage\Shipping\Model\Carrier\Tablerate.php
更改:

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {
        if (!$this->getConfigFlag('active')) {
            return false;
        }

        // exclude Virtual products price from Package value if pre-configured
        if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getParentItem()) {
                    continue;
                }
                if ($item->getHasChildren() && $item->isShipSeparately()) {
                    foreach ($item->getChildren() as $child) {
                        if ($child->getProduct()->isVirtual()) {
                            $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                        }
                    }
                } elseif ($item->getProduct()->isVirtual()) {
                    $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
                }
            }
        }

对此:

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    if (!$this->getConfigFlag('active')) {
        return false;
    }

    // exclude Virtual products price from Package value if pre-configured
    //And Exclude items which should have Free Shipping
    if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {

       $freeshipping_category_id = 15;

        foreach ($request->getAllItems() as $item) {
            if ($item->getParentItem()) {
                continue;
            }
            if ($item->getHasChildren() && $item->isShipSeparately()) {
                foreach ($item->getChildren() as $child) {
                    if ($child->getProduct()->isVirtual()) {
                        $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                    }
                        //If it's in the free shipping, remove it's value from the basket
                        $arr_category_ids = $child->getProduct()->getCategoryIds();
                        if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
                            $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                        }
                }
            } elseif ($item->getProduct()->isVirtual()) {
                $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
            }
                //If it's in the free shipping category, remove it's value from the basket
                $arr_category_ids = $item->getProduct()->getCategoryIds();
                if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
                    $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
                }
        }
    }
w46czmvw

w46czmvw2#

在您的销售规则中,将“免费送货”设置为“仅限匹配的物品”。

xtupzzrd

xtupzzrd3#

如果我没理解错你的问题,解决方案真的很容易和快速,这里是我如何解决它:
在文件中:php(/app/code/core/ Mage /SalesRule/Model/)搜索字符串“case Mage_SalesRule_Model_Rule::FREE_SHIPPING_ITEM:“以及“break;“添加这个简单的东西“$item-〉setWeight(0);“
这将迫使该项目的重量为0,所以没有航运价格将计算它,如果您禁用免费送货选项的帽子项目,重量是考虑和一切工作正常。

z9zf31ra

z9zf31ra4#

我知道这个问题已经得到了回答和接受,但是我想提供一种方法,如果可能的话,不需要编程或更改核心文件就可以做到这一点
如果您想将物品创建为“虚拟”物品,您可以将虚拟物品排除在运费之外

如果项目已创建

使用phpMyAdmin之类的程序进入您的数据库并导航到catalog_product_entity,找到您的产品SKU并将type_id更改为virtual

如果未创建物料

在产品创建的第一步中将物料创建为Virtual Product(而不是Simple ProductBundled Product等)

Virtual Products不包括在运费中

导航至System > Configuration > Shipping Methods,并在Table Rates标题下将Include Virtual Products in Price Calculation设置为

  • 请注意,这仅适用于Table Rates运输方式,也仅适用于此运输方式
  • UPS、USPS、FedEx和DHL按重量确定,因此由于虚拟产品类型的产品重量为0,因此不会影响这些方法的运费

相关问题