WordpressからPelicanに移行してから、移行話を書こうと思って書いてみました。長いので複数に分けています。
移行に際して、何らかの苦労があると思って挑みましたが結構苦労しました。既存のWordpressを色々カスタマイズすればするほどです。
ちなみに、新規でやる人やWordpressからimportさせようと思わない人には価値の無い話題です。
pelicanを使ってみる
Pycon 2014のセッションを聴講してから、使いたいなーと思ってその場で試したところからです。
導入は非常に楽です。なおpython+virtualenvが入っていることが前提です。自分の環境ではpython3を使いました
インストールはvirtualenvで仮想環境を作り、以下のように
pip install pelican
ブログを書けるようにセットアップする
pelican-quickstart
を使って、Pelicanの作業環境を作成します。適当なディレクトリに写って、コマンドをうちます。
この辺の話は、解説されている方がいますので、情報源を挙げておきます。md, rstファイルに馴染んでいる人は、何の苦もなくブログが生成される様子を見れると思います。エディタも自由に使えますし、Wordpressはなんて面倒なんだ!って思われると思います。
移行の話をした時に参考にしたリンク先を載せたので、そちらを確認ください。
WordpressのブログをPelicanへ移行する方法
苦行の始まり。
新規で作成するのであれば、生成したhtmlをサーバーへアップロードして終わりです。pelican的に言うと make rsync_upload
でssh経由でrsyncをつかうことができます。非常に簡単。
今回は最近まで利用していたWordpressのデータやURLの構造も出来る限り移行するつもりでした。
方法は用意されていて、Pelicanにはpelican-import
という、移行用のインポートコマンドが利用できます。例えばWordpressをimportしたい場合のオプションも存在していて、それを利用すると、WordpressのExport XMLファイルをmdやrstに変換してくれます。
pelican-import --wpfile -o [output_dir] [import_xmlfile]
ちなみに、pelican-import
はBeautifulSoup4, lxmlやpandocを使って実現しているようです。
mdファイルへの変換方法は
pelican-import --wpfile -m markdown -o [output_dir] [import_xmlfile]
Importing an existing site — Pelican 3.5.0 documentation
綺麗にインポートできない
このインポートコマンドですが、すんなりうまく行きませんでした。理由はブログの設定や構造にあります。
- WordpressのExport機能は各エントリーをHTML形式にしている。
pelican-import
でhtmlからrstに変換しようとすると、そのHTMLのパースに失敗することが多い。markdownの変換は不完全ながらエラーでストップしなかった。 - Wordpressでは複数カテゴリに対応しているが、Pelicanは対応していない。
- Wordpressのパーマリンク設定をしていると、URL構造を各アーティクルのメタデータに反映させる必要がある
1については、変換失敗はrstだとかなり多くて、wordpressの吐き出すhtmlが悪い可能性とpandocがそれをうまく読めないようです。これに付き合うとエントリー数に応じて何日もかかってしまいました。
markdownで行ってみたところ、あまりエラーが出されなかったので、Markdown形式でimportしました。
2について、複数カテゴリが対応していないのが盲点で、Pelicanは1エントリー1カテゴリが原則のようです。対応してほしいというissueはありましたが、やられない理由は後述します。
(そのissueにも書かれていましたが)タグは複数付けれるのでその辺をWordpress側で行ってしまえば良いはず。
最後の3のパーマリンクについては、各アーティクルのファイルを適切なパーマリンクに沿ったディレクトリの配置を行えば良いのですが、ファイルのメタデータにurlとsave_asの2つを設定することによって、生成した時に自動的にディレクトリを掘って作ってくれるようになります。
面白いのは、.htmlを省いて、ディレクトリへアクセスしているようなURL構造の実現は、index.htmlを使っているところですね。
Frequently Asked Questions (FAQ) — Pelican 3.5.0 documentation
この方法なら、Wordpressで設定していたパーマリンクの構造も保持出来そうです。それで、これは各アーティクルファイルに書いて行く必要がありますが、150件を手動でやるのは厳しすぎるので、適当なスクリプトを書いてやりました。これは次回に載せます。
インポートのための作業
というわけで以上の問題に対応するために以下の環境用意と作業を行います。ここでは2の問題解決します。
利用環境
- Pelican 3.5 ( virtualenv環境を作る -> pip install pelican)
- wordpressを入れた移行準備用のサーバー
- 詳しくは後述
- wordpressのDBやアップロードしているプラグインを持ってくる
行ったこと
pelican-import
を使って、wordpressのimportしたxmlを利用した。変換結果はmdファイル- 変換エラーを起こす場所は、手動で編集した
- Pelicanは複数カテゴリーに対応していないので、移行準備用にWordpress環境を作り、DBをそっくり移す。
- 複数カテゴリーのエントリーを、単一エントリー, 残りをタグに移動する
- パーマリンク関連の設定をmdファイルのメタデータに記載する -> 次回にて
wordpressの移行準備用のサーバーを作る
適当な仮想マシンでubuntu14.04を入れてやりました。
LAMP環境もセットアップします。ubuntuならtasksel install lamp-server
をすれば準備完了
移行準備用のwordpressをセットアップ
wordpress本体含むファイル類は、公開しているサイトからコピーしてきます。scpとか適当な方法です。
データベースのdumpはmysqldumpコマンドで
mysqldump --default-character-set=binary -h localhost -u wp_hiroshi -p wp_blog > ~/hr-sano_blog_dump.sql
(参考: http://weblabo.oscasierra.net/mysql-mysqldump-01/)
MySQLを利用していて、データベースのテーブルをそちらに移すします。
まずはデータベースを作ります。移行元と同じだと、wp-config.phpの編集いらないです。面倒だったので、データベースのユーザーはrootにしたので、DBのアクセスの設定は書き換えました。
$ mysql -u root -p
mysql > create database [blog_db_name];
mysql > exit
$ mysql -u root -p wp_blog < hr-sano_blog_dump.sql
次に、apacheの設定ですが、こちらも設定を持ってくるだけでした。/etc/apache2/sites-available/[config_name].conf をコピーして、有効にすればいいだけです
sudo a2ensite [config name]
パーマリンクも変えていたのでrewriteを有効。php5は有効になってるのでそのまま。 $ sudo a2enmod rewrite
最後にリスタート $ sudo service apache2 restart
wordpressのサーバー移行の手順と何ら変わらないです。
一時的に、DB内のURLを変更する
移行先のサイトのURLが書かれているDBをインポートしたため、この環境でそのまま実行すると正しく開けない可能性があります。wordpressの設定はすべてDBにあり、サイトのURLもDBのなかです。 DBのURLの部分を置き換える必要があります。置き換え方は色々ありますが、 Moving WordPress « WordPress Codex を参考にして、有志が公開しているスクリプトを使いました。
使い方はそんなに難しいものではないです。wordpressを設置したディレクトリと同じ場所にこのスクリプト群のフォルダを置いてアクセスすると利用可能です。後は指示通り置き換えすればよいです。
複数カテゴリを単一カテゴリ+タグにする
148件のエントリーすべてを確認して修正しました。苦労しました(ヽ´ω`)
なお、Pelicanの複数カテゴリについては、議論はされていまして、タグあるからいいじゃんという派が優勢です。自分もそうだよねーと思ってしまったので、対応してました。
importの対応の話もちょろっとありましたが、さすがに難しい気がします。何を持ってプライマリなカテゴリとするのかが分かりませんし。
移行元でエクスポートのxmlファイルを生成する
wordpressのエクスポートを行いXMLファイルを書き出します。
この時に、エクスポートする項目にコメントをコメントも書き出されるようですが、pelican-import
では無視されます。以前のページにコメントを復元させたい場合、xmlファイル内のコメントを利用してhtmlを生成し、各アーティクルの最後にでも追加するスクリプトを作る必要がありそうです。
続きます
ということで、これで、xmlファイルを書き出しました。pelican-import
でブログの各アーティクルファイルを作れることを確認出来れば、後はアップロードするだけです。が今回はまだ終わりではありません。
まだ3のパーマリンクの問題が解決していないので続きます。後半は1の話と3を解決するためにスクリプトを書いて何とかします。
(次の話)wordpress -> pelicanの移行した時のメモ: 2.wordpressの内容を頑張ってPelicanにインポートさせる