将您的Drupal内容迁移到Wagtail

让我们看一个将内容从Drupal站点迁移到Wagtail站点的基本示例。 这篇文章解释了如何准备要导出的Drupal数据,以及如何为Wagtail编写内容导入器,因此移动不会成为您一生中最紧张的时刻。

Drupal迁移很可怕,通常是高级开发人员保留的任务类型。 仅仅修改Drupal迁移模块就足以让我不再学习更多有关它。 将内容从一个系统迁移到另一个系统会遇到很多问题,需要解决,而预先编写的解决方案将无法解决所有问题。 那么将内容迁移到Wagtail有多难呢?

对于我而言,考虑此任务的最简单方法是将其分解为:

  1. 创建一个Drupal视图以使我们了解要处理的内容量,列出节点类型和数量。
  2. 创建一个映射表以了解Drupal和Wagtail中每种内容类型之间的差异。
  3. 导出Drupal节点数据。
  4. 运行python脚本以使用Drupal数据导出以编程方式创建内容。

第1步和第2步很重要,无论如何您都会在第3步中找到此信息,但是有经验的开发人员曾经告诉我,您的工作中至少有30%应该进行计划。 我喜欢执行第1步,因为它使我对整体迁移有所了解。 步骤2是必不可少的。 带有每个节点类型的选项卡的映射表将在字段级别提供目标和源的真正好主意,并帮助您提前发现任何可能的棘手问题。 这是一个可能看起来像的示例(我们在本文中实际迁移的要简单得多):

完成第1步和第2步后,我们应该对导出的内容有一个很好的了解。 现在是时候深入研究Drupal并设置数据导出了。 对于此示例,我们将迁移“文章”内容类型。 从领域来看,这是非常基本的:

如果您使用的是Drupal 8,请打开RESTful Web服务核心模块。 对于Drupal 7,您可以使用一些可以生成JSON导出的社区模块:

  • Drupal服务模块:https://www.drupal.org/project/services
  • Drupal视图数据导出:https://www.drupal.org/project/views_data_export_json

我的示例源数据来自Drupal 8站点,因此启用上述功能后,我们可以使用模块提供的“ REST导出”显示来创建一个将所有节点数据显示为JSON的视图:

提示

  • 要在JSON中更改标签值,请更改视图格式设置。
  • 根据您的核心版本,您可能需要在查看实际页面news/export?format_json 不是在视图路径本身中添加URL,例如: news/export?format_json
  • 对于图像和文件,您需要向视图添加关系

这是该视图中一个节点的示例,请注意,我们获得的不仅仅是图像和主体字段:

我们要在Wagtail中迁移的页面模型包含以下内容:

这里没什么特别的,但要注意以下几点:

  • 当检查内容是否已存在并创建url段时,legacy_id和legacy_url会派上用场。

这是我们将要使用的data_migration应用程序的树状视图:

  wagtailmigration / data_migration / 
├──数据
│└──news.json#我们导出的JSON数据
├──进口商
│├──base.py#基础进口商类
│├──__init__.py
│└──news.py#新闻导入器(继承基础导入器)
├──__init__.py
├──管理
│├──命令
││├──base.py#用于将文件导入Wagtail的基类
││├──import_news.py#新闻的特定导入管理
││└──__init__.py
│└──__init__.py
└──README.md#运行说明

导入是通过管理命令运行的,这些管理命令负责为导入器提供JSON格式的源数据,并为页面提供要在其下进行导入的父页面。 数据文件需要上载到服务器可以访问的位置。 默认情况下,这些命令将查找与manage.py相关的文件,例如:

  /manage.py [importer] [parent_page_id] [data_file.json] /manage.py import_news 4 wagtailmigration / data_migration / data / news.json 

这是指向github上的示例data_migration应用程序的链接。 但是这是代码的一些重点

命令/import_news.py

这扩展了BaseCommand ,我们在上面的命令BaseCommand定位为目标。 因此,对于每种内容类型,我们将创建更多命令类。 连同BaseCommand方法,在这里我们实例化了一个新的导入器对象NewsImporter…

进口商/news.py

我们的导入器扩展了BasePageImporter(来自importers / base.py)。 使用基本导入程序将确保我们不会在每个导入程序中重复任何可能需要的操作。 例如,node_id,title等。这还意味着,当我们扩展BasePageImporter时,我们可以构建正在运行的导入所需的任何特定功能。 因此,例如,如果博客文章中有一个额外的字段,我们需要我们可以覆盖format_data方法(如上述,在其中添加正文和Publication_date)。 扫描importers / base.py以获得更多关于此的想法。


我们以一个非常简单的内容类型为例,介绍了如何将您的Drupal内容迁移到Wagtail网站。 迁移还有许多其他方面会变得更加复杂,例如页面关系,Drupal分类法以及将Drupal段落导出到Wagtail Streamfields中,但是希望,这将使您对如何开始该过程有所了解。

在github上查看完整的data_migration示例应用程序


谢谢至

Rich Brennan在示例迁移代码上的辛勤工作

万神殿提供免费的Drupal沙箱网站