Bundle 商品详情页显示 0 元或 “As low as 0”,后台子商品明明有价格。Bundle 有 Fixed Price 与 Dynamic Price 两种模型,最终展示还取决于默认/必选选择、子商品可售性和价格索引,不能直接给父商品填一个价格就判断。

确认 Price Type

Fixed Price 使用父商品价格,再由选项做固定/百分比调整;Dynamic Price 汇总所选子商品价格。动态 Bundle 没有默认选择、所有选项非必选时,最低可选组合可能确实为零。先明确业务是否允许空组合。

检查必选项与 Selection

必选 option 必须至少有一个启用、分配当前网站且可售的 selection。子商品禁用、缺货、未分配 website 或价格范围错误,会让聚合结果缺失。数据库关系存在不代表当前 Store 可用。

索引按 Website 和客户组计算

SELECT entity_id, website_id, customer_group_id,
       min_price, max_price, final_price
FROM catalog_product_index_price
WHERE entity_id = 1234
ORDER BY website_id, customer_group_id;

索引中已是 0,回到 Bundle 配置、子价格和目录规则;索引正确而页面为 0,查 price renderer、FPC 和主题 JavaScript。手动 reindex 可诊断,但增量失效必须修 Cron/MView。

税与币种不要混入根因

含税显示、汇率和价格规则会改变数值,但通常不会把正常正价全部变成零。比较 base currency 未税 final price,先确定原始聚合是否正确,再处理展示。

修复后测试默认选择、切换选项、客户组价格、缺货 selection、购物车和订单行金额。详情页起价、选择后的动态总价与结账金额必须一致,不能只把页面上的 0 用模板条件隐藏。

默认选择与最小价格

动态 Bundle 的最低价不一定等于页面默认勾选组合。主题若先显示索引 min_price,JS 初始化后又计算默认选项,用户会看到价格跳变。业务若要求默认组合价格,应让展示文案明确“起价”或按默认选择计算,不能混用两套口径。

目录规则与特殊价

子商品 Special Price、Customer Group Price、Catalog Price Rule 都会进入动态聚合。规则刚更新而 price index backlog 未消费时,Bundle 可能仍显示旧/零值。按 website/customer group 检查索引,并修改一个子商品验证增量链路。

选择配置数据

查看前端 bundleConfig JSON 中 option、selection、price 数据。服务端 JSON 已缺价格,查产品类型 price model;JSON 正确而 UI 为零,查主题 mixin、格式化和币种转换。这样能把 PHP 与 JavaScript 问题分开。

购物车金额才是最终事实

价格区间用于列表和初始展示,真正加入购物车后由选项、数量、规则、税与币种重新计算。抓取 quote_item 的父子行和 option 数据,确认选择映射到正确 simple/bundle selection。若前端显示正常但购物车为零,问题已经不在 price renderer。