【问题标题】:Magento Free Shipping for Match Items Only - Using Table Rates Based on Order TotalMagento 免费送货仅限匹配项目 - 使用基于订单总额的表费率
【发布时间】:2011-09-26 15:26:12
【问题描述】:

我可以使用 Magento 实现以下目标吗:

我正在使用价格与目的地的表费率系统。对于具有属性 free_shipping -> 设置为是的产品,我有一个免费送货的购物车价格规则。

如果您的购物篮中有普通产品或购物篮中有免费送货产品,则此方法可以正常工作。但是,如果您的购物篮中既有普通产品又有免费送货产品。它根据订单总额计算运费,包括免费送货的产品。

如果购物篮中同时存在这两种类型的产品,我该如何更正此问题,因此运费仅适用于不包括免费送货的产品订单总数?

这个有 Magento 插件吗?提前致谢。

【问题讨论】:

    标签: magento shipping


    【解决方案1】:

    我知道这个问题已经得到回答和接受,但我想提供一种无需编程或尽可能更改核心文件的方法

    如果您想将您的商品创建为“虚拟”商品,您可以从运费中排除虚拟商品

    如果项目已经创建

    使用 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,因此不会影响这些方法的运费

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题并实施了一个小的代码更改以使其正常工作。

      基本上忘记了提升规则。禁用它。对单个商品应用免费送货时,运费表似乎无法正常工作。运输规则似乎优先并根据购物车总数计算。

      诀窍是在运费模块进行计算时从购物车总数中减去免运费商品。

      在我的情况下,特定类别 (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());
                      }
              }
          }
      

      【讨论】:

        【解决方案3】:

        如果我正确理解了您的问题,解决方案非常简单快捷,以下是我的解决方法:

        在文件中:Validator.php (/app/code/core/Mage/SalesRule/Model/) 在“break;”之前搜索字符串“case Mage_SalesRule_Model_Rule::FREE_SHIPPING_ITEM:”添加这个简单的东西“$item->setWeight(0);”

        这将强制商品的重量为 0,因此不会计算运费,如果您禁用帽子商品的免费送货选项,则会考虑重量并且一切正常。

        【讨论】:

        • 感谢您为我指明正确的方向,我现在有以下内容:case Mage_SalesRule_Model_Rule::FREE_SHIPPING_ITEM: $item->setFreeShipping($rule->getDiscountQty() ? $rule->getDiscountQty () : 真的); $item->setWeight(0);休息;但是我们使用的是价格与目的地,而不是重量——所以我认为这就是为什么你的补丁对我们不起作用的原因。关于我们可以在这个位置使用什么来代替的任何想法?
        • 哎呀,当我有足够的时间时,我可以更好地研究一下,不幸的是,价格与目的地永远不会像你指出的那样考虑重量,我的错,我错过了关于价格与目的地的部分.不幸的是,来自 magento 的一个讨厌的错误,希望我能在今晚写回一些消息。
        • 谢谢,感谢您的帮助 :) 我相信我们能够解决这个问题。
        • 你好 mpark,unfotunatley 我迟到了,没有任何消息,我现在工作太忙,无法给出解决方案 x__x 差点忘了,你应该检查一下 shipping.php 文件我可以从我的空闲时间看出,那里已经处理了运费,您可以看到当您处理超过 1 件商品时是否真的适用免费送货支票。
        • 嘿伙计,我不知道你是否解决了你的问题,但我刚刚找到了一些可能对你有帮助的东西,magebase.com/magento-tutorials/…享受!
        【解决方案4】:

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

        【讨论】:

        • 我已经为购物车定价规则设置了以下内容:免费送货:仅适用于匹配项目停止进一步处理规则:否仅将规则应用于符合以下条件的购物车项目(所有都留空项目)如果所有这些条件都为真:免费送货是是
        • 您是否启用了“免费送货”模块?你也需要那个。启用它并将其设置为巨大的最小订单量,因此默认情况下它不会显示。
        • 已启用免费送货,并将最小订单金额设置为“100000000000000000000”。但是不幸的是,问题仍然存在:(还有其他想法吗?感谢您迄今为止的帮助。
        • 你可能想看看是你的规则设置(最小的细节可以把它扔掉)还是运输模块。不幸的是,我已经删除了默认的运输模块/修改了它们,所以在建议之前我无法尝试。您也可以尝试一种变通方法,即从总数中打折的购物车规则,以查看是否正确加起来。
        • 我将尝试使用另一个运输车价格规则更正运输的解决方法。不幸的是,这意味着目前要创建 32 条价格规则!感谢您的建议 :) 希望有人知道如何纠正这个问题,而无需费时的工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-31
        相关资源
        最近更新 更多