前回の続きです。
Wordpressの内容のエクスポートまでは、複数カテゴリの移行が難しいという諸事情で、わざわざ移行用のサーバーを作って、カテゴリの変更をするなどしてXMLファイルへエクスポートさせました。
次は、いよいよPelicanへインポートさせます。が、これもだいぶ苦行です。
Wordpressのxmlファイルをインポートする
おさらいですが、インポートのコマンドはpelican-import
です。これは何をしているかというと、インポート元のファイルやサービスへアクセスし、エントリーごとのファイルを作ります。
使ったコマンドとオプションはこれ
pelican-import --wpfile -m markdown --disable-slugs -o ./wp-import-md/log.wordpress.2015-01-31.xml
--wpfileオプションはwordpressのxmlfileを指定してます。 -mオプションは--Markupの略で、rstファイルかmdファイル(markdown)かを選べます。
--disable-slugsオプションは、生成したエントリーごとのファイルにあるメタデータに:slug:を生成するかしないかです。生成すると、wordpressのslugを引き継いでくれます。
pelicanでそのままmake html/publish すると、slugをファイル名にして生成します。これが日本語だとhtmlエスケープされた日本語のファイル名になります。見栄えは微妙の上、サーバー側ではアクセス出来ないので、有効にしておいたほうが良いです。
ちなみに、メタデータにslugがない状態で、pelicanのmake html
でhtmlを生成すると、インポートされた時のファイル名がhtmlのファイル名になりますが、後述するsave_as, urlのメタデータ指定をするので気にせず次へ
rstにするかMarkdownにするか
-mオプションについてもう少し
-m オプションにrst / Markdown の何方かを設定すると、rstファイル, mdファイルそれぞれに書き出してくれます。
rstにすると、htmlが書かれている部分はそのままhtmlとして書き出してくれます。 Markdownでインポートすると、Markdown形式に変更できるものは変更してくれます。htmlの中にあるMarkdown形式を変換させると何故かMarkdownの中htmlタグができるという逆転の現象が発生して、混ぜて利用してる場所が厄介なことになっていました。
各アーティクルのメタデータにsave_as, urlを設定する
メタデータのsave_asとurlを指定すると、[blog-url]/entryurl.htmlといった構図から、自由に階層構造を作ることができます。
- 指定なしでこのアドレスが
-
entry-url => http://example.org/entry0001.html
-
指定ありだと
- :save_as: 2015/01/31/0001/index.html
- :url: 2015/01/31/0001/
- entry-url => http://example.org/2015/01/31/0001/
といったアクセスが可能。save_asがポイントで、index.htmlがあるディレクトリにアクセスするとindex.htmlがかえってくる、WEBサーバーの機能(apacheならDicretroyIndexディレクティブ)です。これを使うことでwordpressで使われるようなディレクトリにアクセスしてページが見れるURLの構造が利用できます。
ちなみに、新しく作成する各アーティクル(エントリー)や、カテゴリーやタグ一覧のURLのデフォルト設定はpelicanconf.pyで行えます。詳しくは以下を参照のこと
Settings — Pelican 3.5.0 documentation - URL settings
pelican-importではsave_as, urlメタデータは生成しないので何とかする
その通りなので何とかします。考えた上で以下のようにしてみました。
pelican-importをいじって、save_as, urlのメタデータを吐き出すようにする
これは、色々と面倒だったのでやめました。
pelican-importでインポートされたエントリーのファイルとwordpress xmlファイルを使って、スクリプト処理
要は、Wordpressのxmlファイルの中にあるエントリーのurlを取り出せればいいので、そういったスクリプトを作りました。
非常に適当に作ってあるので参考にされる方(は多分いないでしょうが)は注意してください。あと何故かPython2で書いてますが気にしないでください。
save_as, urlの定義が出来たら、make htmlしてみます。試しに見たいときは、make serveします。
チェックしつつ、ダメなところはちょっとづつ直すなどしていけばいいです。
pelican-importで変換に失敗したいろんな部分を修正する
これは手動で頑張るしか無いです。見かけたら治すようにしました。よくわかりきってるような問題はスクリプトにして一気に直しました。
特定のHTMLタグを修正する作業は正規表現とpythonのre.subを使えばさほど苦労することはないです。2日正規表現と格闘して(苦労してるじゃん)すんなり済みました。
例によって適当です。こちらもPython2で書いてしまいました。。。
移行し終えて
こうした作業をして、概ね変換出来ていることを確認した上でデプロイしました。
感想ですが、二度とやりたくない面倒さでした。。。wordpressのブログを移行したいときは、極力プラグイン周りの状況を確認して、必要な場合はwordpress上で直しておくと移行が楽だと思います。あまりにアーティクルの数が多い場合は別途新しくスタートさせたほうがいいかもしれません。
というわけで、移行し終えてまだちょっと治っていないところはあるのですが、本ブログをよろしくお願いします。 :-D