普通访客看到 100 元,VIP 登录后仍显示 100 元,后台明明设置了 90 元。清页面缓存后偶尔恢复,换一个 VIP 账号又不对。这个问题需要先分清“原始价格写错”“价格索引没更新”和“页面缓存身份错误”三种情况。
用同一个 SKU 列出所有可能的价格来源
我会记录 website_id、customer_group_id、currency、商品类型和日期,然后核对基础价、Group Price、Tier Price、Catalog Price Rule、Special Price 时间窗口,以及 B2B 环境中的 Shared Catalog。不要只看商品编辑页顶部价格字段。
可配置商品还要分别看父子商品。列表页展示的最低价来自关联子商品索引,不一定等于父商品保存的数值。Bundle、Grouped 商品又有各自聚合规则。
索引问题要比较维度,不要只看状态
php bin/magento indexer:status catalog_product_price
php bin/magento indexer:reindex catalog_product_price索引显示 Ready,只代表没有被标记 invalid,不代表某个维度的行一定正确。用只读查询比较目标 entity、website 和 customer_group 的索引记录,并与后台配置来源对照。绝对不要手工 UPDATE 价格索引表,它是派生数据,下一轮索引会覆盖。
若只有计划模式延迟,检查 mview changelog 与 cron;若每次 reindex 都生成错误值,问题在价格来源、作用域或插件。第三方动态定价模块可能通过 plugin 改写 price model,却没有正确声明 cache identity。
价格正确但页面仍旧,要看缓存键是否包含客户身份
登录用户的个性化价格通常通过 private content 或带客户组上下文的缓存处理。自定义 block 如果把会员价放进公共 FPC,却使用固定 cache key,VIP 与访客就可能互相看到缓存价格。GraphQL/PWA 还要检查请求头中的 Store、Currency 与客户 token。
我会用无痕窗口建立四个互不复用的会话:访客、普通会员、VIP、批发组;分别请求商品页、分类页、搜索结果和购物车。再切换币种与 Store View,确认显示价、quote item price 和订单金额一致。只有商品展示和下单两端都正确,会员价才算真正修复。

