纠结要不要统一博客和 memos 动态的评论好久了!

因为我的主题对于评论显示进行了优化,是自己比较喜欢的风格;而 memos 动态不得不使用了一个叫做 Artalk 的评论系统。两套评论数据不共享问题成了一直以来的痛点。

这次我狠下心来,总算是完成了这个艰巨的任务。

一、思路

  • 用 AI 做一个 Artalk 评论插件,分离原来 memos 动态插件集成的 Artalk 功能,这样我的文章和 memos 笔记就都可以用统一接口注入 Artalk 评论了。
  • 用工具将博客评论数据转换为 Artrans 格式,迁移至 Artalk 评论数据库。
  • 做一个页面,将 Artalk 数据库中的 page_key 格式从 /archives/{cid}/{slug}.html 之间相互转换,以适配博客的显示风格。

二、开发并启用 Artalk 插件

配置好 Artalk服务器地址、博客评论站点名、memos 笔记站点名后,在主题模板中进行注入。

插件也将一些内置的 CSS 样式进行了复写,让其稍微美化了一下。

// 文章页面中显示评论
if (\Typecho\Plugin::exists('Artalk')) {
    echo Artalk_Plugin::toggleBtn($this->cid, parse_url($this->permalink, PHP_URL_PATH), $this->title);    
}

// memos 笔记列表中显示评论按钮
if (\Typecho\Plugin::exists('Artalk')) {
    echo Artalk_Plugin::toggleBtn($name, $key, $name, \Artalk_Plugin::configVal('artalkSiteMemos'));
}

// 仅链接至文章评论页面
if (\Typecho\Plugin::exists('Artalk')) {
    echo Artalk_Plugin::commentCount(parse_url($this->permalink, PHP_URL_PATH))
}

如果是新搭建的博客,至此就已经算完成了评论系统的转换。但如果博客已经有一些评论数据,要想使用新的评论系统,就必须先做一番数据迁移才行。

三、评论数据迁移

首先需要理解下面两点

  • Artalk 评论支持一个叫做数据行囊(Artrans = Art + Ran)的持久化数据保存的规范格式。
  • typecho 可以用工具将评论数据导出为 Artrans 格式的文件。

接下来就围绕 typecho -> Artrans -> Artalk 的转换来完成评论数据的迁移。

1. 使用 Artransfer-CLI 工具来导出 Artrans 格式的文件

下载和解压 Artransfer-CLI 之后,运行下面的命令来生成 Artrans 格式的文件

./artransfer typecho \
    --db="mysql" \
    --host="localhost" \
    --port="3306" \
    --user="数据库用户名" \
    --password="数据库密码" \
    --name="typecho博客的数据库名" \
    --table-prefix="数据表前缀_"

2. 登陆 Artalk 评论后台将 Artrans 格式的文件数据导入 Artalk 评论系统

这里要注意填写正确的目标站点名和目标站点URL

3. 修正数据

对于独立页面,数据迁移时默认会将 page_key 直接生成为 {slug}.html的格式;但对于博客文章,数据迁移时默认会将 page_key 生成为 /archives/{cid}/的格式,如果我们的站点也是使用这种风格,则完美匹配;如果我们的站点使用的是 wordpress 风格,也就是/archives/{slug}.html 格式,则需要进行转换。

这是数据库中刚刚转换的数据,可以看到这些数据的 page_key 都是 /archives/{cid}/`格式,而我网站使用的是wrodpress风格路由,因此需要转换。

我直接做了一个页面来进行转换,下面是转换的截图:

同时也支持在站点根目录下,执行下面的语句来进行转换

  # 预览不执行:/archives/{cid}/ → /archives/{slug}.html
  php usr/plugins/Artalk/migrate.php --to slug --dry-run

  # 执行转换
  php usr/plugins/Artalk/migrate.php --to slug --yes

  # 反向转换:/archives/{slug}.html → /archives/{cid}/
  php usr/plugins/Artalk/migrate.php --to cid --yes

下面就是我成功执行脚本文件后的提示信息。

$ php usr/plugins/Artalk/migrate.php --to cid --yes
PHP Warning:  Constant __TYPECHO_ROOT_DIR__ already defined in /home/hy/www/config.inc.php on line 3
Typecho 文章数: 77
匹配到可转换的 pageKey: 49 条

转换预览(前 10 条):
------------------------------------------------------------
  /archives/159.html  →  /archives/159/
  /archives/261.html  →  /archives/261/
  /archives/262.html  →  /archives/262/
  /archives/266.html  →  /archives/266/
  /archives/51towuhan.html  →  /archives/251/
  /archives/83.html  →  /archives/83/
  /archives/add-bilibilivideo.html  →  /archives/44/
  /archives/addcrontab.html  →  /archives/144/
  /archives/addfootmap.html  →  /archives/140/
  /archives/alist.html  →  /archives/132/
... 等 39 条

转换完成!
  hollowman_pages:    50 条
  hollowman_comments: 988 条
  hollowman_notifies: 0 条

至此,评论迁移工作大功告成!!!