アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Jekyll からはてなブログに記事を移行する

おつかれさまです、komatsu(@nomnel)です。

先日このブログを移行した際に Jekyll (at GitHub Pages) からはてなブログに記事データを移行した方法について書きます。

方針

インポートできるブログデータのファイル形式は、MovableType(MT)とWordPress(WXR*1)です。 http://help.hatenablog.com/entry/import-mt

「画像データの移行」オプションで、移転元のブログに掲載していた画像を確認・移行できます。 http://help.hatenablog.com/entry/import-mt

とあるので、WXR ファイルをいい感じに用意してやれば記事と画像の移行ができそうです。 また、

記事を配信するディレクトリを変更できます。 http://help.hatenablog.com/entry/import/directory

ともあり、記事 URL は変更せずすみそうです。 (後述しますがディレクトリ構造が違う一部記事は URL を変更せざるをえませんでした)

さらに RSSImport という WordPress プラグインを見つけたので、

  1. WordPress サーバを立てて RSS からインポート
  2. WordPress からエクスポートして WXR ファイルを生成
  3. WXR ファイルをはてなブログでインポート
  4. 画像をインポート

という方針を取ることにしました。

(WXR ファイルの仕様を調べるのが面倒だった)

0. 前処理

ここに一番時間がかかりました。*1

画像 URL を絶対パスに

後工程で画像をインポートできるように、相対パスで書かれた箇所を全て絶対パスに書き換えました。*2

URL が変わってしまう記事、ページへのリンクを書き換え

移行前の記事 URL は

  • /3659991970 (Common Lisp 製ブログシステム時代の記事の例)
  • /2018/08/02/a-ticket.html (Jekyll 移行後の例)

の2種類の形式が混在していました。このままだとはてなブログにインポートできなかったので Jekyll 移行後の形式に揃えることにし、記事本文内のリンクを全て書き換えました。

また、はてなブログには著者ごとの記事一覧ページが用意されていないようだったので、カテゴリページ (ex. /archive/category/komatsu) で代用することとし、同様にリンクを書き換えました。

ついでにドメイン変更前でも確認できるように絶対パスは相対パスに変更しておきました。

著者を category として RSS に出力

著者ごとの記事一覧ページをカテゴリページで代用することにしたので、 WXR ファイルに著者名がカテゴリとして含まれるよう、 WordPress インポート前の RSS に著者名を category 要素で追加しました。

全記事の RSS を配信

RSS に含まれる記事しか RSSImport でインポートできなかったので全記事を配信するようにしました。

1. WordPress にインポート

  • ローカルに Docker で WordPress を立てる
  • RSSImport プラグインをインストール
  • RSSImport を使って記事データをインポート

しました。

2. WXR ファイルを生成

WordPress のエクスポート機能を使えば WXR ファイルがダウンロードできました。

WXR ファイルの微調整

item の link が http://localhost:8000/?p=252 のように期待するものと違う URL になっていました。このままはてなブログにインポートすると、記事 URL が link の値を反映したものになっていたので、 guid の値(期待する値だった)で書き換えました。

また channel の link、wp:base_site_url、wp:base_blog_url が http://localhost:8000 になっていたので、なんとなく*3 https://tech.actindi.net に書き換えておきました。

3. はてなブログにインポートして確認

生成した WXR ファイルをインポートして表示を確認します。*4今回はチームメンバーも確認を手伝ってくれたおかげで、自分ひとりでは見逃していた修正点がいくつか発見できて助かりました。

4. 画像をインポート

最後に画像データの移行オプションから画像をインポートして終了です。

雑なところもありましたが、なんとか1日程度で移行できてホッとしました。

いつもの

アクトインディではエンジニアを積極的に募集中です!!

actindi.net

*1:もちろん手作業ではなく Ruby でスクリプトを書いて行っています

*2:markdown と HTML が混在していたので両方を漏らさないように

*3:影響は確認し忘れました

*4:不具合があったら適宜やり直したり直接書き換えたり