有一批商品只需要涨价5%,很多人会先导出全字段CSV,修改price后再完整导回。这样做看似保留了所有数据,实际风险更大:分类、URL、描述、图片、多选属性和网站分配都可能因为格式或空值被意外改动。

更新现有商品时,我更倾向使用“最小CSV”:第一列是SKU,后面只放这次真正要变的字段。

只改普通价格,文件可以很小

sku,price
SKU-100,109.00
SKU-101,129.00
SKU-102,159.00

后台进入 System > Data Transfer > Import,Entity Type选择Products,Import Behavior选择Add/Update。Magento会用SKU找到现有商品,并更新CSV中提供的字段。

这种方式有三个好处:文件容易人工复核,校验速度更快,不相关字段不会因为表格软件重新格式化而被带入风险。

空白单元格不是永远等于“不修改”

最小CSV的关键是:不需要修改的列直接删除,而不是保留列后把单元格留空。对现有实体导入时,某些非必填属性的空值可能覆盖原值。若目的是把一个字段明确清空,应使用导入页面配置的Empty Attribute Value Constant,并先在测试SKU上验证。

简单说:

  • 不想碰这个字段:整列不放进CSV。
  • 想更新这个字段:提供新值。
  • 想清空这个字段:使用系统约定的清空常量并测试。

普通价格、促销价和阶梯价不是一回事

price 是商品基础价格。Special Price还涉及生效日期。客户组价格、阶梯价则建议使用Entity Type中的 Advanced Pricing,先下载样例文件再填写网站、客户组、数量和价格。

不要把阶梯价字符串硬塞进普通Products导入文件。不同价格类型有不同的作用域和重复规则,先导出一个正确商品的高级价格,比猜字段和值可靠。

库存字段要看网站是否启用了MSI

单一默认库存的老项目,可能仍在产品CSV中维护 qty 和 is_in_stock。启用Multi Source Inventory后,仓库数量应优先使用Stock Sources实体,通过 source_code、sku、status 和 quantity 更新。

如果同一次任务既改价格又改多仓库存,建议拆成两个文件、两次导入。价格文件使用Products,库存文件使用Stock Sources。这样出现错误时可以独立回退,也不会把两个实体的校验结果混在一起。

别用Replace完成普通更新

Add/Update会更新已有SKU并可添加新SKU。Replace则会删除匹配记录后重新创建,关联、URL和第三方系统引用都可能受到影响。仅仅为了改价格或库存,没有必要承担这个风险。

Delete更不用说,只读取SKU就可能删除商品。导入页面的行为下拉框很靠近文件设置,正式执行前最好由第二个人核对一次。

一套比较稳的更新流程

  1. 导出目标SKU的当前值,保留为回滚文件。
  2. 在新文件中只保留SKU和变更列。
  3. 用公式计算新价格后,把公式结果粘贴为数值。
  4. 检查小数位、负数、0价格和异常涨幅。
  5. 先导入3到5个测试SKU。
  6. Check Data通过后执行导入。
  7. 检查后台值、前台含税显示、购物车价格和索引状态。
  8. 再按批次处理剩余商品,并保存Import History。

为什么价格改了,前台还显示旧价

先确认作用域:全局价格还是Website价格,当前Store View是否使用了默认值。然后检查价格索引和缓存:

bin/magento indexer:status
bin/magento indexer:reindex catalog_product_price
bin/magento cache:clean

如果使用Varnish、CDN或第三方搜索服务,还要确认对应缓存和数据同步是否完成。后台值正确但前台错误时,不要重复导入同一个CSV,重复导入只会让排查时间线更乱。

经验判断:一次导入解决一个明确问题。价格、库存、分类、图片和URL拆开处理,文件虽多一点,风险和排错成本反而更低。


需要做一次安全的批量更新?

如果商品数量大、价格规则复杂或库存来自外部系统,可以先做差异文件和回滚文件。需要协助生成最小CSV、验证作用域和处理导入错误,欢迎联系我们的团队。