如何在Drupal 8中迁移Drupal 7 taxonomy并保留旧Term ID?
如何在Drupal 7到Drupal 8的分类迁移中保留原有Term ID?
这个问题我碰到过好多次了——Drupal的迁移系统默认会给新生成的Term分配自动递增的ID,但只要调整迁移配置,就能轻松保留D7里的原Term ID,具体步骤如下:
1. 调整迁移配置文件
首先,找到你的分类迁移配置(如果是自定义迁移,通常在modules/custom/[你的迁移模块]/config/install/目录下,命名类似migrate_plus.migration.d7_taxonomy_term_[词汇机名].yml),或者通过Migrate UI导出默认的分类迁移配置后修改。
关键配置修改:
- Source部分:默认的
d7_taxonomy_term源插件已经会获取D7的tid字段,无需额外配置,除非你自定义了源逻辑。 - Destination部分:添加
preserve: true参数,告诉迁移系统保留原ID:
destination: plugin: entity:taxonomy_term preserve: true
- Process部分:把源的
tid直接映射到目标Term的tid字段,这是保留ID的核心步骤:
process: tid: tid # 将D7的Term ID直接赋值给D8的Term ID name: name description/value: description description/format: format vid: plugin: migration_lookup migration: d7_taxonomy_vocabulary source: vid # 其他字段(比如权重、语言等)按需添加映射
2. 提前检查ID冲突
在运行迁移前,务必检查目标D8站点的对应词汇表里,有没有已经使用了D7中Term ID的条目。如果有冲突,要么删除这些目标站点的Term,要么调整D7里的对应ID(不推荐),否则迁移会直接失败。
3. 按顺序运行迁移
分类Term的迁移要优先于依赖它的内容(比如节点、用户引用分类的字段),所以先运行分类迁移命令:
drush migrate:import d7_taxonomy_term_[你的词汇机名]
等分类迁移完成后,再运行内容相关的迁移任务。
额外注意事项
- 如果使用Migrate UI模块,修改完配置后需要重新导入迁移配置,部分版本也支持直接在UI里编辑迁移的目标设置来开启
preserve参数。 - 如果你要批量迁移多个词汇表,每个词汇表的迁移配置都需要单独添加上述设置。
内容的提问来源于stack exchange,提问作者Moby M
相关产品推荐
相关产品推荐

