以正确的方式在Magento 2上出售捆绑包
以正确的方式在Magento 2上出售捆绑包

以正确的方式在Magento 2上出售捆绑包

2018年1月11日发布 in 发展历程
广告支出回报率的真正含义是什么?
广告支出回报率的真正含义是什么?
2017年12月20日
显示Magento 2中的可配置产品价格范围
2018年2月12日

Magento有多种产品类型可帮助您找到正确的产品销售方式。有用于数字项目的可下载产品(例如电子书),用于无形交付的项目的虚拟产品(例如保修)和用于变化的可配置产品(例如尺寸不同的衬衫)。捆绑产品是最强大的类型之一。根据我的经验,这是使用最少的产品类型,我认为有几个因素会影响其稀疏的外观:

  • 外部整合 – 不管你’将产品数据重新导入Magento或将订单数据推出,很少有系统与Magento相匹配’捆绑的概念。
  • 劳动密集型产品创造 –捆绑产品比大多数其他产品类型花费更多的时间来设置。
  • 没必要 –许多商人只是发现他们没有’不得捆绑销售任何产品。

现在让’通过分解捆绑产品的种类以及如何利用它们来在您的商店中销售更多产品来了解捆绑产品的优势。

什么是捆绑产品?

简而言之,捆绑产品是将多个产品作为一个包装一起出售的一种方式。这对商人来说确实是一个巨大的机会’是一种向上销售的形式。不仅如此,它’是一种非常有针对性的促销形式,Magento为您提供了真正使之值得客户的灵活性’s while.

捆绑产品只是一个外壳,最终它包含您所需要的产品’re already selling 上 your Magento store. 让’例如,您卖乐器。您’d如果该客户在他们购买的鼓套中添加了一些和鼓槌,就会喜欢上它。您可以创建捆绑销售商品,而不仅仅是在购买过程中展示相关产品和追加销售。通过这样做,您可以鼓励客户增加他们的订单总数,也可以使他们对他们所购买的产品充满信心’重新购买彼此兼容。

您可以在以下内容中了解有关创建和配置捆绑产品的信息: 官方用户指南, 但是我’我将介绍捆绑在一起的基本原理。

捆绑选项

的basic architecture of bundle 产品s is their options. Options are the components that make up the bundle. Each option offers a 选择ion of 产品s that can fill that slot. 让’看一下我们的架子鼓套装。它’将具有以下选项:

  • 外壳包(鼓本身)
  • 崩溃Cy
  • 嗨帽子
  • 鼓棒

从根本上讲,这些就是捆绑包中包含的东西。对于这些选项中的每一个,可以根据您的喜好选择多种产品。我的产品代表Yamaha Stage Custom外壳包周围的包装,所以我’我只会为Shell Pack选项提供一种产品。但是,客户将可以从多个品牌中进行选择,以填补“碰撞Cy”,“踩H”和“鼓棒”选项。

您可以将每个选项设为必需或可选,设置选项的默认数量,然后选择客户是否可以定义自己的数量。

对于我的产品,大多数选项都是必需的,并且数量不可更改。但是,鼓槌是可选的附件,客户可以修改数量。这确保了刚购买鼓的人不会’不小心买了他们不买的东西’不需要,但他们可以在同一产品页面上多买几根。

捆绑定价

捆绑产品的定价非常灵活。所有可以打包到我的捆绑包中的简单产品在Magento中都有自己的价格,但是捆绑时是否要打折?

在这种情况下,我会这样做。根据所选产品的不同,我捆绑销售的产品总金额可能在$ 1,204到$ 1,229之间。为了鼓励客户购买我的套装,我’我将其定价为1100美元。无需额外费用即可包括Shell Pack,Crash Cymbal和Hi-Hat选项。对于木棍(可选),我 ’我将以每双5美元的价格定价。这仍然是一个很好的交易,因为如果单独将鼓槌添加到购物车,鼓槌的简单产品将是8美元。

为了设置这种定价,我在创建捆绑商品时设置了动态价格=否。这使我可以为捆绑商品设置基本价格,然后可以选择将价格附加到每个选项中。这为捆绑商品提供了特定的价格,但是简单商品的价格对我的捆绑商品没有影响。

如果我不这样做’如果不想为捆绑商品提供折扣,可以将动态价格设置为是。该捆绑包将自动汇总简单产品的价格,而不是在我的选项中手动设置价格。用户赢了’节省了购买捆绑包的金钱,但是他们’我仍然会受益于更具指导性的购物体验。

捆绑数据架构

您可能会认为捆绑销售在理论上听起来不错,但是它们如何与其他电子商务元素一起发挥作用?运费计算如何工作?将订单导出到外部系统时,数据是什么样的?

那里’围绕数据的灵活性。从运输角度来看,捆绑包提供“动态重量”选项。如果设置为“是”,则购物车中捆绑产品的重量将等于捆绑中所有简单产品重量的总和。这样可以确保最终重量是准确的,以获取运费。如果设置为“否”,则可以为捆绑商品分配静态重量,该重量不会受到客户的影响’s 选择ions.

那里’也是动态SKU的一个选项。设置为“是”时,商品的最终SKU将是捆绑商品SKU和其中包括的所有简单商品的SKU的组合。

最终订单数据包含有关捆绑商品的大量信息。它包含捆绑包本身,以及捆绑包中每个产品的一行。这些行包含SKU和简单产品的数量。如果您有一个外部集成消耗订单数据来进行库存跟踪之类的事情,这很好,因为它允许您检查已售出的有形产品。

捆绑挑战

捆绑包是一个复杂的概念,每个商人对它们的利用都会有所不同。我完全尊重Magento核心使用捆绑软件的逻辑,但是’s definitely not a “one size fits all” scenario. I’我想看看我遇到的一些具体挑战’我们已经看到了商人的加入,并且我们实施了使逻辑正确的解决方案。

的“Primary 产品” Dilemma

捆绑包开箱即用的效果很好,可以一起出售几种相关产品。但是,他们不’也可以代表附加产品来代表主要产品。去年,我有一个销售浓缩咖啡机的商人。它们通常包括这些机器随附的物品,例如一袋浓缩咖啡或延长保修期。他们需要将这些赠品清楚地显示在产品和购物车页面上,并且还需要将它们作为订单数据中的单个项目,以进行库存更新。问题是他们确实没有’t want to offer the “Customize and Buy”Magento开箱即用提供的界面。客户实际上没有什么可配置的。所有选项都是必需的,仅提供一种选择。他们真的只需要客户来看看’,并有一个添加到购物车按钮。

我们可以通过一些布局更改和一些战略性CSS调整来解决此问题。在捆绑软件配置中,我们隐藏了选项标签和表单元素,仅保留选择的名称和价格。我们还将主数量输入和添加到购物车按钮移到了捆绑包配置上方。最终结果是一个产品页面’几乎像一个简单的产品一样基本。这里’如果鼓组捆绑包的每个选项只有一个选择,则对它进行相同的处理:

本机显示:

定制显示:

请注意,这将从页面中删除所有配置机制,因此它 ’确实仅适合具有静态选择的捆绑包。

购物车价格规则

使用购物车价格规则时,’重要的是要了解捆绑产品子级的本机行为。价格规则中的任何条件都将由捆绑商品中的商品触发’已添加到客户’s cart. If 这个 isn’如果您希望遵循价格规则,那么当订单开始输入时,您可能会感到讨厌。

让’以我们的架子鼓套装为例。我有一些剩余的Vic Firth鼓槌,所以我想提供50%的折扣。我创建了一个购物车价格规则,该规则可将品牌为Vic Firth的产品减价50%。当客户转到鼓槌类别并购买匹配的简单产品时,此方法非常有用,但是’当他们将架子鼓捆绑包添加到购物车时,这不太理想。如果配置为包括可选的Vic Firth鼓槌,则50%的折扣将应用于整个捆绑包。为了移动一些鼓槌,我们’突然以550美元的价格赠送了1100美元的鼓组。

不幸的是’没有配置可以更改此行为,但是可以根据需要通过少量代码更改来更改它。负责此特定规则验证的模型为\ Magento \ 销售规则 \ 模型 \ 规则 \ 健康)状况 \ 产品 \ 结合,而相关方法为 验证 (在超类中定义)。

如果我们为\ Magento \ 销售规则 \ 模型 \ 规则 \ 健康)状况 \ 产品 \ 结合创建一个插件,则可以确保没有捆绑子级对购物车价格规则有效。

1
2
3
4
5
6
上市 功能 验证周围(\Magento\销售规则\模型\规则\健康)状况\产品\结合 $学科, 可召回的 $继续, \Magento\构架\模型\抽象模型 $模型) {
    如果 ($模型->getParentItem() && $模型->getParentItem()->getProductType() == '束') {
        返回 ;
    }
    返回 $继续($模型);
}

分层导航

Similar to the dilemma of shopping cart price rules, bundle children can also trigger unintended layered navigation behavior. 让’例如,我们将我们的架子鼓包归类为“架子鼓”类别。由于该套件是围绕Yamaha外壳套件构建的,因此我们’已将捆绑产品本身的品牌设置为Yamaha。在分层导航中,我们希望在将Yamaha设置为品牌过滤器时显示该设置。既然我们不’希望客户根据包含的鼓槌选择捆绑包,我们’d希望捆绑包不’当筛选结果以匹配品牌值Vic Firth时,将显示t。

这里’对包的本地处理。注意每个品牌’我们的爵士鼓套装中可用的出现在分层导航中:

幸运的是,我们可以通过一些较小的代码更改将bundle子属性排除在分层导航之外。捆绑包子索引发生在_prepareRelationIndexSelect方法中的\ Magento \ Catalog \ 模型 \ ResourceModel \ 产品 \ Indexer \ Eav \ AbstractEav中。这里’s the original code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$连接 = $这个->getConnection();
$idxTable = $这个->getIdxTable();
$linkField = $这个->getMetadataPool()->getMetadata(产品介面::)->getLinkField();
$选择 = $连接->选择()->(
    ['l' => $这个->getTable('catalog_product_relation')],
    []
)->加入Left(
    ['e' => $这个->getTable('catalog_product_entity')],
    'e。' . $linkField .'= l.parent_id',
    ['e.entity_id作为parent_id']
)->加入(
    ['cs' => $这个->getTable('商店')],
    '',
    []
)->加入(
    ['一世' => $idxTable],
    'l.child_id = i.entity_id AND cs.store_id = i.store_id',
    ['attribute_id', “ store_id”, '值']
)->(
    ['parent_id', 'i.attribute_id', 'i.store_id', 'i.value']
);
如果 ($parentIds !== 空值) {
    $选择->哪里('e.entity_id IN(?)', $parentIds);
}
 
/ **
*添加其他外部限制
* /
$这个->_事件管理器->调度(
    'prepare_catalog_product_index_select',
    [
        '选择' => $选择,
        'entity_field' => \Zend_Db_Expr('l.parent_id'),
        “ website_field” => \Zend_Db_Expr('cs.website_id'),
        “ store_field” => \Zend_Db_Expr('cs.store_id')
    ]
);
 
返回 $选择;

该查询使用catalog_product_relation表来标识父/子产品关系,然后按子ID将属性索引表联接在一起。
这使它可以查询相关父母的子产品的属性值。它还使用左联接来包含父产品。
它按父ID进行分组,结果是具有符合过滤条件的子项的父列表。

如果我们将方法代码替换为以下代码,则可以将父产品联接限制为’t bundles.
这将从查询逻辑中排除捆绑子项,从而在不考虑捆绑子项产品属性的情况下产生分层导航。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$连接 = $这个->getConnection();
$idxTable = $这个->getIdxTable();
 
$选择 = $连接->选择()->(
    ['l' => $这个->getTable('catalog_product_relation')],
    'parent_id'
)->加入(
    ['cs' => $这个->getTable('商店')],
    '',
    []
)->加入(
    ['一世' => $idxTable],
    'l.child_id = i.entity_id AND cs.store_id = i.store_id',
    ['attribute_id', “ store_id”, '值']
)->加入(
    ['p' => 'catalog_product_entity'],
    'l.parent_id = p.entity_id AND p.type_id!= \'bundle \',
    []
)->(
    ['l.parent_id', 'i.attribute_id', 'i.store_id', 'i.value']
);
如果 ($parentIds !== 空值) {
    $选择->哪里('l.parent_id IN(?)', $parentIds);
}
 
/ **
*添加其他外部限制
* /
$这个->_事件管理器->调度(
    'prepare_catalog_product_index_select',
    [
        '选择' => $选择,
        'entity_field' => \Zend_Db_Expr('l.parent_id'),
        “ website_field” => \Zend_Db_Expr('cs.website_id'),
        “ store_field” => \Zend_Db_Expr('cs.store_id')
    ]
);
 
返回 $选择;

请注意,此方法是抽象方法,因此您’必须为实现该方法但希望表现不同的每个子类实现di首选项。在实施这些更改时,我包括以下内容:

  • Magento \ Catalog \ 模型 \ ResourceModel \ 产品 \ Indexer \ Eav \ Decimal
  • Magento \ Catalog \ 模型 \ ResourceModel \ 产品 \ Indexer \ Eav \ Source
  • Magento \ Catalog \ 模型 \ ResourceModel \ 产品 \ Indexer \ Eav \ Source

这里’s产生的行为:

捆绑和捆绑

不管你’我想帮助客户确定兼容的产品,或者只是想增加您的订单总数,’几乎是每个商人使用捆绑产品的用例。即使你不’如果不想创建很多产品,它们可能是很好的促销工具。那你还在等什么?开始使用这些捆绑产品。如果您碰巧需要一些定制来使它们正确无误,请给我们打电话。

6 评论s

  1. 阿德里安·基里塔(Adrian Chirita) 说:

    您好!感谢您提供这篇有用的文章!
    是否可以提供有关“很少的布局更改和一些战略性CSS调整”完全消除捆绑软件的配置部分?我想为我的捆绑包做同样的事情。
    先感谢您!
    阿德里安

  2. 达蒙护城河 说:

    谢谢,您已经很好地解释了,’s是另一个易于使用的教​​程,用于在magenticians上的magento 2中创建捆绑产品。我发现它非常有用。我希望其他人也会喜欢。

  3. 亚历克斯·莫尔科 说:

    感谢您分享这个很棒的教程,我正在努力在Magento商店中设置商品目录价格规则,您的文章和这篇文章对我有很大帮助, //www.cloudways.com/blog/shopping-cart-and-catalog-price-rules-in-magento/。一世”

  4. 安库尔 说:

    你好,
    我已经看到了该帖子,并尝试使用我的捆绑产品进行相同的布局,所以您能告诉我我们如何实现这一目标,因为我看不到代码来像其他屏幕截图一样进行布局。

  5. 说:

    大家好,感谢您的文章。

    在鼓组示例中,看起来像您’重新使用同一张图片两次(//www.tianjindkjgg.com/wp-content/uploads/2017/10/layered_nav_native.png), 所以我们可以’真的看不到你的不同’重新尝试显示。您有机会更新本文吗? ðŸ™,

  6. 杰耶什 说:

    你好
    我想将具有数量的捆绑产品动态添加到购物车中。
    我可以添加产品,但数量未更新。它始终为1。
    有什么办法可以解决这个问题。

    下面的代码我正在使用。

    $ 产品 = $ 这个->_productRepository->getById(89,false,null,true);

    $ bundle_option = [1 =>array(2,8,18)]; // 2,8,18是选择ID,1是选项ID
    $ bundle_qty = [1 =>array(2,3,4)]; // 2,3,4是数量,1是选项ID

    $ params = [
    ‘form_key’ => $ 这个->formKey->getFormKey(),
    ‘product’ => 89,
    ‘bundle_option’ =>$ bundle_option,//工作正常
    ‘bundle_option_qty’ =>$ bundle_qty,//从逻辑上讲,它将起作用,但在我的情况下,它将不起作用。
    ‘qty’ => $totalqty
    ];

    $ 这个->cart->addProduct($ 产品,$ params);
    $ 这个->cart->save();

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日
通过 阿什莉·科利弗 商业见解, 优雅的骆马 2020年10月22日
那里 is no doubt that 2020 has been an historical year; fires, global pandemic, riots, Tiger King, and that’只是冰山一角。如 [â€]