手动重建 Ghost 日期数据

在官方真正有效的 fix 到来之前, 你可以用本文提供的脚本手动重建 Ghost 的日期数据.

访问自己博客的/ghost/settings/labs/导出一份 json 文件, 再通过 transform.js 转换之后重新导入博客(导入前先在/ghost/settings/labs/删除所有数据, 否则内容会重复).

已知问题

Ghost 的 Delete 并不是彻底删除了文章数据, 文章的最大 id 值会被保留下来用于新文章的创建, 所以当你导入新的文章之后会发现新文章的 id 值比过去都要大, 如果你使用的第三方服务(比如评论框)依赖于文章 id, 那么可能需要你耗费大量时间去重新连接服务与新的文章 id 之间的关系.

也是因为这个问题, 本博客并不能使用该方法重建日期数据.

更新: 现在有了另一个直接修改数据库文件的解决方案, 步骤比较多, 但不会遇到 id 自动增长的问题: 重建 Ghost 日期数据库的新解决方案

Usage

IMPORTANT: BACKUP ALL DATA BEFORE YOU DELETE IT!

  1. Export data to json file
  2. Transform it: node transform.js your.ghost.data.json > transformed.json
  3. Delete old content & Import transformed JSON

transform.js

See also: gist

const path = require('path')  
const moment = require('moment')

let json = require(path.resolve(process.argv[2]))

function transform(obj, timezone) {  
  if (Array.isArray(obj)) {
    obj.forEach(x => transform(x, timezone))
  } else {
    if (obj.created_at && !isNaN(obj.created_at)) {
      obj.created_at = moment(obj.created_at).add(timezone, 'minutes').format('YYYY-MM-DD hh:mm:ss')
    }

    if (obj.updated_at && !isNaN(obj.updated_at)) {
      obj.updated_at = moment(obj.updated_at).add(timezone, 'minutes').format('YYYY-MM-DD hh:mm:ss')
    }

    for (let key in obj) {
      if (Array.isArray(obj[key])) {
        transform(obj[key], timezone)
      }
    }
  }
}

for (let db of json.db) {  
  let timezone = db.data.settings.find(x => x.key === 'activeTimezone').value
  transform(db.data, timezone)
}

console.log(JSON.stringify(json))