過去ログ/MovableType 3.36からの移行

提供: NOBODY:PLACE Wiki
2019年5月4日 (土) 11:53時点におけるIppei Suzuki (トーク | 投稿記録)による版 (ページの作成:「 '''※この記事は 過去ログ に含まれている記事です''' === 前提条件 === * 移行元 ** MovableType 3.36 ** SQLite ** 移行対象データ数:…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動
※この記事は 過去ログ に含まれている記事です

前提条件

  • 移行元
    • MovableType 3.36
    • SQLite
    • 移行対象データ数: 6,734(公開6,686 / 下書き48)
  • 移行先
    • MovableType 4.261
    • MySQL 5.1

最初の手順

3.36からブログデータをエクスポート。データサイズは24.7MB。ファイルを一気にインポートしようとするも20,000行ほど処理したところで終了してしまうので、ファイルを16分割し、それぞれインポート。無事終了。掛かった時間は5時間程度。

問題点

タグの書き出しを行おうとしたところで発覚したのだけど、3.36のエクスポートはタグを書き出さない。4.1系(SQLite使用)から書き出したデータはタグを含んでいるので、どうやら3.x系の挙動らしい。

特に設定もない様子。エクスポートはlib/MT/ImportExport.pmが行っているので、それをカスタマイズすれば出来るような気はするけれどもそれに気づいたのは次の作業が終わりに近付いてからでした。


インデックステンプレートを使って書き出す

ツールを使わずにタグを書き出すためにはもはや、テンプレートを使用するしかないわけだけど、問題が1つ。インデックステンプレートでは下書きエントリは書き出せない。らしい。幸か不幸か最初の手順でデータはあるので、最初にインポートしたエントリのうち公開されているエントリのみを削除しておく。これで全て揃う。

タグを含めて書き出すためのインデックステンプレート

<MTEntries offset="0" lastn="400">AUTHOR: <$MTEntryAuthor$>
TITLE: <$MTEntryTitle$>
BASENAME: <$MTEntryBasename$>
STATUS: <$MTEntryStatus$>
ALLOW COMMENTS: <$MTEntryFlag flag="allow_comments"$>
CONVERT BREAKS: <$MTEntryFlag flag="convert_breaks"$>
ALLOW PINGS: <$MTEntryFlag flag="allow_pings"$>
PRIMARY CATEGORY: <$MTEntryCategory$>
<MTEntryCategories>CATEGORY: <$MTCategoryLabel$>
</MTEntryCategories>
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>
<MTEntryIfTagged>TAGS: <MTEntryTags glue=",">"<$MTTagName quote="1"$>"</MTEntryTags></MTEntryIfTagged>
-----
BODY:
<$MTEntryBody$>
-----
EXTENDED BODY:
<$MTEntryMore$>
-----
EXCERPT:
<$MTEntryExcerpt$>
-----
KEYWORDS:
<$MTEntryKeywords$>
-----
<MTIfNonZero tag="MTEntryCommentCount"><MTComments>COMMENT:
AUTHOR: <$MTCommentAuthor default=""$>
EMAIL: <$MTCommenterEmail$>
URL: <$MTCommentURL$>
IP: <$MTCommentIP$>
DATE: <$MTCommentDate format="%m/%d/%Y %I:%M:%S %p"$>
<$MTCommentBody convert_breaks="0"$>
-----
</MTComments></MTIfNonZero><MTIfNonZero tag="MTEntryTrackbackCount"><MTPings>PING:
TITLE: <$MTPingTitle$>
URL: <$MTPingURL$>
IP: <$MTPingIP$>
BLOG NAME: <$MTPingBlogName$>
DATE: <$MTPingDate format="%m/%d/%Y %I:%M:%S %p"$>
<$MTPingExcerpt$>
-----
</MTPings></MTIfNonZero>
--------
</MTEntries>

まともに書き出してもインポートできないことはわかっているので、400エントリずつ17分割して書き出す。テンプレートを17個用意するか、再構築ごとにファイル名とoffsetを書き換えて書き出し。なんという力わざ!

下書きエントリに設定していたタグはインポートできなかったものの、それはもし公開することがあればその時に付ければいいということで。


結局どうすれば良かったのか?

要するに、エクスポートする前にImportExport.pmを変えてからエクスポートすれば良かったのですね。

ImportExport.pmの516行目(3.36の場合)からがエクスポートするデータのテンプレートになっているので、この中のDATEの次にTAGSを以下のように挿入すればOK。

DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>
<MTEntryIfTagged>TAGS: <MTEntryTags glue=",">"<$MTTagName quote="1"$>"</MTEntryTags></MTEntryIfTagged>
-----
BODY:

こうしてから書き出せば、きちんとタグを含んだ形式で書き出される。この情報がどれだけ需要あるか皆目見当も付きませんけど(MovableType5も出たっていうのにね…)、とりあえず書いておきます。


さらなる問題点

タグ一覧を書き出してみたら同じタグが羅列されていてた。調べてみたところ、日本語タグをインポートしようとすると同じタグでも別々のタグと判断して登録してしまうようだ。例えば「ネタ」というタグの付いたエントリが100件あったとすると、通常ならエントリ100件、「ネタ」というタグが1つのところ、エントリ100件、「ネタ」というタグも100件登録されてしまう。

結局、最新版のプログラムと変えてみたりしたのだけど上手く行かなかったので、書き出しデータをサーチしてタグを全て英語に変換してインポートするはめに。この試行錯誤で異常な時間を費やした…


ダメだった。


照合順序の問題らしい。

この日本語が上手く扱えない現象は、データベースの照合順序の問題らしい。DBの設定は、

utf8_general_ci

なのにもかかわらず、各テーブル、フィールドは

ujis_japanese_ci

になってますね…念のためエクスポートデータを確認したところUTF8だったので、なんというかバグなのかこれは。元データは確かにEUCだったけど関係なさそう。

というわけで、dumpして一括…して入らなかったら嫌なので、一応dumpしたあと1つずつ変更していったらば、上手くいきました。良かった良かった…


参考サイト