Shopify ⇄ WooCommerce 商品 CSV 迁移器

这两个平台不只是列名叫法不同 —— 它们存商品的方式就不一样。这个工具转换结构、翻译它能证明的取值,并明确告诉你哪些它没能搬过去。

🔒 你的商品目录不会离开浏览器。

在本地读取,绝不上传。

改列名做不到的三件事

1. 变体是另一种形状

Shopify 靠在连续多行里重复 Handle 把一个商品聚在一起。WooCommerce 没有分组列:父商品是一行类型为 variable 的记录,每个变体各占一行类型为 variation 的记录,通过 Parent 指回去。由于 Shopify 没有商品级 SKU 可供指向,这里把 handle 给父商品当 SKU —— 这件事写在转换清单里,不是悄悄做掉的。

2. 促销价的存法正好反过来

Shopify 把现价放在 Variant Price,划线价放在 Variant Compare At Price。WooCommerce 把划线价放在 Regular price,现价放在 Sale price。列名直接对着搬,整个商品目录里的折扣就无声消失了 —— 导入成功,而一切回到了原价。

3. 图片待的地方不一样

Shopify 每张图片写一行;WooCommerce 要它们逗号分隔挤在一个单元格里。无论哪个方向,这些 URL 指向的都是店铺,所以在你把图片重新托管之前,新店一直依赖旧店在线。

这次转换所做的全部事情(21 条有据可查的规则)

结构:商品与变体如何重塑

MIG-S01 handle 分组变成「一个 variable 父商品 + 若干 variation 行」

Shopify 靠在连续多行里重复同一个 Handle 把一个商品聚在一起。WooCommerce 没有这种分组:父商品是一行 Type 为 "variable" 的记录,每个变体各占一行 Type 为 "variation" 的记录,并用 Parent 指回去。整个文件要重构,不是改改列名。

官方文档 ↗

MIG-S02 图片行合并成一个逗号分隔的 Images 单元格

Shopify 给每张图片单独一行(只有 Image Src 与 Image Position,其余列全空)。WooCommerce 要的是商品行上一个 Images 单元格里按顺序排好的全部图片 URL。转换会按 Image Position 排序后拼接。

官方文档 ↗

MIG-S03 选项列变成属性列

Option1/2/3 Name 与 Value 变成 Attribute N name 与 Attribute N value(s)。父商品那一行带完整取值集合,用 " | " 连接;每个 variation 行只带它被钉住的那一个取值。

官方文档 ↗

MIG-S04 variable 父商品的 SKU 由 handle 推导而来

WooCommerce 通过 Parent 列把变体挂到父商品上,而 Parent 接受 SKU 或 "id:123" —— ID 要导入之后才存在。Shopify 压根没有商品级 SKU(只有变体才有),所以父商品那一行没有任何东西可供指向。因此转换把 handle 当作父商品的 SKU:它唯一、它本就在指认这个商品,而且这件事写在这里,不是悄悄发明的。

修复: 保持原样即可;想换成你自己的规则,导入前把父商品 SKU 批量替换掉 —— 每个变体的 Parent 列必须跟着一起改。

官方文档 ↗

MIG-S06 推导出来的父商品 SKU 与某个变体 SKU 撞了

这个文件里已经有一个变体拿 handle 当自己的 SKU,再拿它给父商品会造出两行相同的 SKU —— 而 WooCommerce 会拒绝第二行。父商品因此退而使用 handle 加 "-parent"。

修复: 生成的这个不合你意的话,在源文件里改掉其中任意一个 SKU。

官方文档 ↗

MIG-S05 单变体商品转成 simple 商品

一个 Shopify 商品如果唯一的选项是默认的 "Title / Default Title",那它不是变体商品 —— 它会转成一个没有属性的普通 simple 商品,而那本来就是它的真身。

官方文档 ↗

取值:什么被翻译了,以及怎么翻的

MIG-V01 促销价在两个平台上是反过来的

Shopify 把现价写在 Variant Price、把划线价写在 Variant Compare At Price。WooCommerce 把划线价写在 Regular price、把现价写在 Sale price。所以直接改列名会抹掉每一个折扣:文件导得干干净净,而每个商品都悄悄回到了原价。

修复: 本转换会把它们对调:当 Compare At 更高时,Regular price 取 Compare At,Sale price 取现价。

官方文档 ↗

MIG-V02 重量在克与店铺单位之间换算

Shopify 导出的是 Variant Grams。WooCommerce 要的是一个光秃秃的数字,单位写在表头里("Weight (kg)")并来自店铺设置。转换会除以 1000,并把单位写进表头 —— 免得这个数字被误读成克。

官方文档 ↗

MIG-V03 布尔值与状态值重新编码

Shopify 写 TRUE/FALSE;WooCommerce 读 1/0,别的一律当作 0。Shopify 的 Status(active / draft / archived)映射到 WooCommerce 的 Published 为 1 / -1 / 0 —— 归档变成私密而不是删除,因为转换绝不能删掉商品。

官方文档 ↗

MIG-V04 库存策略变成缺货预订设置

Shopify 的 Variant Inventory Policy 取 "continue" 意思是「缺货也继续卖」,对应 WooCommerce 的 Backorders allowed? = 1;"deny" 对应 0。

官方文档 ↗

MIG-V05 可征税标记变成税务状态

Variant Taxable 的 TRUE/FALSE 变成 Tax status 的 taxable/none。Tax class 留空,让目标店铺的默认值生效 —— 猜一个税类正是那种「只会在发票上才浮出来」的无声错误。

官方文档 ↗

MIG-V06 条码会被带过去,但导入器不会自己映射那一列

Variant Barcode 装的是 GTIN。WooCommerce 有原生的 GTIN 字段,但它不在默认的 CSV 映射里,所以这一列会到达却被忽略,除非你在导入界面上手工映射。转换选择把取值带过去而不是丢掉,并在这里说明这件事。

修复: 在 WooCommerce 导入界面上,手工映射「GTIN, UPC, EAN, or ISBN」这一列。

官方文档 ↗

MIG-V07 handle 变成 slug,商品名变成 handle

反方向走时,WooCommerce 没有 Handle 列:转换会从商品名推导一个(小写、连字符),并让一个商品与它的各个变体共用同一个 —— 因为在 Shopify 里正是它把它们聚成一组。

官方文档 ↗

没有对应字段的列

MIG-U01 这一列在目标平台没有对应字段

目标平台没有承载这份数据的核心列。所以它被列出来,而不是被猜着放 —— 把它写进一个「差不多像」的列里,正是迁移最后会让供应商名字出现在分类树里的原因。

修复: 逐列决定:留在自定义字段里("meta:my_field" 能导进 WooCommerce)、导入后手工映射,或者接受这份数据丢失。

官方文档 ↗

MIG-U02 SEO 字段属于插件,不属于 WooCommerce 核心

SEO Title 与 SEO Description 是 Shopify 的核心字段,而 WooCommerce 把它们交给你所用的那个 SEO 插件(Yoast、Rank Math、SEOPress),各家的 meta 键都不一样。既然没有唯一正确的去处,转换就拒绝替你挑一个。

修复: 先把商品导进去,再用你那个 SEO 插件自己的导入功能把这些字段附上。

官方文档 ↗

MIG-U03 分市场定价的列被丢弃

Shopify 每个市场导出一列("Price / International")。WooCommerce 每个商品只有一个价格,多币种是插件的事。这些列被丢弃,而不是压平到基础价格上。

官方文档 ↗

只有你能做的决定

MIG-W01 Shopify 每个商品只允许三个选项

WooCommerce 商品可以带任意多个属性;Shopify 把变体选项限制在三个。第三个之后的属性无法表示为选项,会无声消失。

修复: 转换之前先把属性合并或删减到三个,或者把多出来的那些当作普通商品信息保留。

官方文档 ↗

MIG-W02 商品类型与分类对不上

Shopify 有 Type 和 Product Category(一套固定的分类法);WooCommerce 有 Categories,一棵每个店铺自己的树。它们是不同的概念,所以把一个映射到另一个是关于你的商品目录的决定,不是一次转换。

修复: 先把 WooCommerce 的分类树建好,再填 Categories 列 —— 格式是 "Parent > Child",多个之间用逗号分隔。

官方文档 ↗

MIG-W03 图片是按 URL 引用的,不是复制过去的

两个平台都接受图片 URL,所以转换后的文件指向的还是原店铺的 CDN。导入能成功,但新店从此依赖旧店继续在线 —— 而一个关掉的 Shopify 店会把它的图片一起带走。

修复: 把图片下载下来重新上传到新店;或者趁旧店还活着时先导入,之后再把图片指向改掉。

官方文档 ↗

MIG-W04 Body (HTML) 里带着平台专有的标记

Shopify 的描述里常常有只在旧主题里才有意义的 class、内联样式和短代码。WooCommerce 会原样导入这段 HTML,所以标记完整到达,渲染出来却是另一个样子。

修复: 导入后抽查几条描述;描述 HTML 检查器会列出各平台会剥掉哪些标签。

官方文档 ↗

MIG-W05 这个文件看起来不像任何一边的导出

表头行里既认不出 Shopify 的列集合(Handle、Title、Variant Price…),也认不出 WooCommerce 的(Type、SKU、Regular price…),所以无从知道这些取值是什么意思。

修复: 从源平台重新导出一次,不要改列名;或者显式指定转换方向。

官方文档 ↗

关于这些规则。 每一条都有编号、严重级别和通俗解释。每个来源链接都已登记在案,并对线上页面实际复验过,而不是凭印象写上去的. 规则如何编写、测试与保持更新 →