Disqus 评论导入 WordPress

前几天在硬盘里面翻出了几年前的 Disqus 评论备份,发现有些评论还是不错的,值得导入数据库。

题外:这也是为什么我最终还是决定跑回WordPress,因为Firestore还没有导出/导入的功能(但可以写脚本一个一个拉下来),我都不敢作死。

Disqus 后台有一个导出功能,可以以XML格式获取到站点下所有的评论和文章信息(标题,地址…)。不过这功能大部分人应该都没用过,毕竟导出后根本就不能再次导入 Disqus。

对XML格式不太了解,所以在网上随便找了个 XML to JSON Converter 来减少我的工作。

转换后的格式大概如下:

{
   "thread":[
      {
         "id":"10",
         "forum":"jimmycai",
         "link":"https://jimmycai.org/about/",
         "title":"关于",
         "_dsq:id":"3827045149"
      }
   ],
   "post":[
      {
         "message":"<p>连博客都没有的只能干瞪</p>",
         "createdAt":"2015-08-21T03:28:18Z",
         "isDeleted":"false",
         "isSpam":"false",
         "author":{
            "email":"{{# Email Address}}",
            "name":"Wair Chan",
            "isAnonymous":"false",
            "username":"wairchan"
         },
         "ipAddress":"{{# IP Address}}",
         "thread":{
            "_dsq:id":"3827045149"
         },
         "parent":{
            "_dsq:id":"2282076939"
         },
         "_dsq:id":"2206176180"
      }
   ],
   "_xmlns":"http://disqus.com",
   "_xmlns:dsq":"http://disqus.com/disqus-internals",
   "_xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
   "_xsi:schemaLocation":"http://disqus.com/api/schemas/1.0/disqus.xsd http://disqus.com/api/schemas/1.0/disqus-internals.xsd"
}

一点一点的来解析下:

  • thread[]下存放着站点下所有用过 Disqus 的文章信息
    • _dsq:id:文章ID
  • post[]下是站点所有的评论,已经按从旧到新的顺序排列好了
    • author.name:名字
    • author.email:邮箱
    • ipAddress:IP地址
    • message:评论内容
    • createdAt:评论时间,ISO 8601 格式
    • _dsq:id:评论ID
    • thread['_dsq:id']:评论对应的文章ID
    • parent['_dsq:id']:父级评论ID

和WordPress评论格式相比缺了User agent 和 网站的字段,不过这两样其实无所谓。

为了不浪费时间找Node.js的Mysql适配库,决定直接合成SQL语句并使用phpMyAdmin 导入。

WordPress 每条评论的SQL格式是这样的:

(1001,'303','Jimmy','im@jimmycai.com','','192.168.1.1','2015-08-27 22:45:12','2015-08-27 22:45:12',"应该是因为hover触发的原因,明天改成点击加class",0,1,'','',1000,0), 

导出成JSON是这样子的:

{
    "comment_ID": "1001",
    "comment_post_ID": "303",
    "comment_author": "Jimmy",
    "comment_author_email": "im@jimmycai.com",
    "comment_author_url": "",
    "comment_author_IP": "192.168.1.1",
    "comment_date": "2015-08-27 22:45:12",
    "comment_date_gmt": "2015-08-27 22:45:12",
    "comment_content": "应该是因为hover触发的原因,明天改成点击加class",
    "comment_karma": "0",
    "comment_approved": "1",
    "comment_agent": "",
    "comment_type": "",
    "comment_parent": "1000",
    "user_id": "0"
}

值得注意的是在SQL语句里面数字是不带""的,不知道为什么导成JSON会带。

转换脚本

用Node写了个非常乱的脚本,凑合能用。其实也可以用浏览器来执行,可我数据太多,粘贴到控制台就卡住了。

使用指南

  • 到Disqus后台导出评论
  • 使用 XML to JSON Converter 把XML格式的导出文件转换成JSON格式 (Prefix attributes with: _dsq:
  • 随便创建个文件夹,并在里面放上我提供的文件
  • disqus.json里面粘贴上转换好的数据
  • postIDs.json里面需要存放新旧ID的关系数据
    • 格式:"OLD_DISQUS_ID": "NEW_WORDPRESS_ID"
  • 执行 npm install turndown ,用来把HTML转换为Markdown格式
    • 如果不需要转换请删除相关的调用

我并没有打算转移所有的评论,在index.js 67行处我使用了.filter()来过滤出我想要的评论。(筛选出所有处于该文章下的评论)

AUTO_INCREMENT值的意义和MYSQL数据库中的一样,都是为了提供一个独一的数字ID(从哪里开始),请自行调整。

准备好了之后就可以执行 node index.js了,如果没有问题的话会在同一个文件夹下生成一个 importDisqus.sql文件。

把里面的内容复制出来,并粘贴到import.sql的最下方。然后就可以把这个文件通过phpMyAdmin 导入数据库了。

测试环境:Node 8.9.1 & phpMyAdmin 4.6.6


一共导入了几百条旧评论。这些评论还是躺在自己的数据库里面安心。同时希望以后不要再干这事情了,数据转换来转换去特别费精力。

另外还发现了博客 2013 – 14 年时期的数据库备份,不过那都是满满的黑历史,还是不转移好了。

Photo by Brandon Lopez on Unsplash

Author: Jimmy

Stay simple, stay naïve

13 thoughts on “Disqus 评论导入 WordPress”

  1. wow……就是因为用过 disqus 里有过一些很想留住的评论所以一直没换评论系统,下次换博客系统的时候就可以试试把 disqus 里的评论转出来了(

    1. 最好不用第三方评论(

      当然我也不是说 Disqus 做的不好。除了手机上卡的不行(可能是我手机烂),其他方面它还是做的不错的(样式百搭啊)

  2. 看来博主要真是切到wordpress了,恭喜恭喜。
    另外从欧洲访问香港服务器速度应该有点慢,我这里无脑推荐我正在用的 nuevocloud,它的工作方式相当于进化版的cloudflare argo,是从离源站最近的节点取源,通过私有隧道传输到用户所使用的edge node,使用下来效果非常好,我源站在英国可以做到欧洲ttfb time 100ms以下,北美洲240ms,亚洲370ms,而且还支持自定义证书秒杀市面上一大票cdn
    上两张对比图
    这是你源站的访问速度
    https://s1.ax1x.com/2018/01/07/pZZHu4.png
    可以看到除了亚洲以外其他地方都不太理想
    这是我帮你创建的nuevocloud 的cname访问速度
    https://s1.ax1x.com/2018/01/07/pZZbDJ.png
    应该说有很大改观
    当然我不是打广告,我只是想提供一点点自己的经验😂

    1. 我感觉这个主题样式还行,但是加载的东西太多了,我想拆开放缓存都很难。

      开学后应该会很忙的,等今年暑假再开工吧。

Leave a Reply

Your email address will not be published. Required fields are marked *