wordpressで書いていたブログを、はてなに引っ越すことにしました。
結局こっちへ戻ってきました

実際に引っ越しを行ったバージョンはwordpress2.6です。

インポート方法

はてなで既存ブログデータをインポートするには、Movable Type形式(MT形式)でデータをエクスポートする必要があります。

今使用しているwordpressのバージョンは2.6で、MT形式でデータをエクスポートするために、WordPressExportというプラグインを使用しました。

プラグインのインストール

インストール方法などはこちらをご覧ください

プラグインのインストール後、管理画面の「設定」タブから「Export」をクリックすると、MT形式でデータ表示されるはずでしたが、何も出てきませんでした。

プラグインの修正

調べてみると、MT.php内21行目付近の、SQLを発行している部分で、エラーがでていることがわかりました。

MT.phpの21行目付近

また、エラーがでている部分はeval()関数で実行されていたので、特にエラーなど出現せず、単に出力がない状態となっていたのです。

SQLをダンプすると以下のようになっていました。

このSQLでは、wp_categoriesと、wp_post2catというテーブルが見つからないためにエラーが発生しています。

いま使っているwordpress2.6では、これらのテーブルはありませんでした。
ただ、古いバージョンにはあったようなので、どこかのアップデートの段階でなくなったのだと思います。

プラグインが古くて、バージョンアップに対応していなかったのでしょうかね。

ということで、wp_categoriesとwp_post2catテーブル関連部分(SELECTとJOINのところ)、およびデータの書き出し部分で関係しているところを削除しました。

結果、SQLの部分は以下のようになりました。

さて、修正して再度エクスポートをしてみたのですが、まだ何もでてきませんでした。次に怪しい部分は、23行目あたりからの、実際にクエリを投げてデータを取得する部分です。

MT.phpの23行目付近

$wpdp->query()でデータを取得して、$resultに取得した行数が代入されます。その回数分for文でまわして$wpdb->get_row()で一行づつ処理しようとしているのだと思います。

しかし、$wpdb->get_row()も途中で実装が変わったのか、第一引数にnullが指定されてしまうと、nullしかかえって来ません。

wp-includes/wp-db.php 733行目付近

ここでは、nullのかわりにSQL文を指定するのが正しい使用方法です。

ただ、$wpdb->get_row()は本当に一行だけ取得したい場合に使用するべきです。
なぜなら、$wpdb->get_row()は内部で$wpdb->query()を呼び出しているので、毎回クエリが発生してしまうので効率が悪いためです。

今回のように一度にデータを取得して、結果をfor文で逐次処理を行う場合には、$wpdb->get_result()という関数が用意されています。

上記を踏まえ、以下のように処理を変更しました。

このほかに、こちらにでも書いてありますが、エントリーの区切りが

になってしまう件についても、

になるように修正しました。

MT.php 73行目付近

これでようやくMT形式でエクスポートできました。

ただし、ドラフト版もひとつのエントリーとして出力されてしまい、はてなではこれらもひとつの記事として公開されていて、具合が悪いです。

ということで、公開記事だけエクスポートされるように、wp_posts.post_status = ‘publish’という条件をSQL文に付け加えました。

これで、公開されたバージョンのみインポートすることができました(手作業で修正しなければならないことがちょっと残っていますが...)。

修正したWordPressExportプラグインのMT.phpはこちらからダウンロードできます。

参考

Categories: php

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください