Movable Type version 4.38(MTOS)からWordPress 3.8への移行記録

WS2014-01-06_19_27_22
Movable Type version 4.38(MTOS)からWordPress 3.8へ移行したときの記録をメモしておきます。

一応元のMovable Type(以降MT)のブログも新しいサーバーに移行してあります。下のデザインやウィジェットの内容を確認したいときに元のブログが無いと何かと不便なので、ダイナミックパブリッシングで動かす事は出来ませんでしたが、スタティックパブリッシングにして別ドメインでローカルからは閲覧できるようにしてあります。

こんか、MTからWordPress(以降WP)に移行した理由は、ダイナミックパブリッシングで動かす事が出来なかったのが大きな理由ですが、WordPressだとプラグインで色々便利になるというのも大きかったです。

今回の移行で大きな問題点となったのは以下の2点です。

  1. MTで書いた記事のタイトルが長すぎてパーマリンクが引き継げない。
  2. 記事が途中で切れる。

どちらも解決する事が出来ましたが、1.は割と難易度が高いです。

1.の場合、そもそも記事のURLを記事番号で管理している人は問題が無いと思います。私も前のサーバーに引っ越す前は問題なかったのですが、前のサーバーに引っ越したときになぜか、記事のURLがタイトルの日本語そのまま反映されるようになったのでこの問題が発生しました。

色々調べた結果下記のWordPressのフォーラムの記事が参考になりました。何とかなるんじゃないかと思い。色々やってみました。

WordPress › フォーラム » 日本語URLの字数制限を増やしたいです

※以下長いパーマリンクを引き継いだ移行方法になりますが、WPのDBの定義を変更してしまう非常にリスキーな方法なので、一般の方にはオススメしません。失敗しても当方では責任取れませんので、意味がわかる方のみ自己責任でお願いします。また、移行前の事前のバックアップは十二分に行ってください。

WordPressのバージョンアップの度にプログラムの該当位置の修正も行う必要があります。でないと記事が表示できなくなります。また、今後のWordPressのバージョンアップで予期しない問題が発生する可能性もありますので、一般の方にはおすすめしません。どうしてもパーマリンクを引き継ぎたい方のみで、問題が発生した時に自分で対処できるスキルのある方のみ行って下さい。

  1. とりあえず、MTからの記事やコメントなどのデータの移行については、MTのエクスポート機能を使います。WS2014-01-06_19_57_52
    ダッシュボード>ツール>エクスポートを選びます。
     WS2014-01-06_20_00_37
    ブログをエクスポートをクリックします。
    するとテキストファイルがダウンロードされるので適当な場所に保存しておきます。うちのブログは大体2000記事強ありますが、長めの記事が多いので14MB程度になりました。
    補足:
    うちの場合、エクスポートしたファイルはkuma_type.txtになりました。
    ここの記事が以下の様なフォーマットで保存されています。このファイルをそのままWPにインポートする事で記事を移行することが出来ます。

    ——–
    AUTHOR: kumacchi
    TITLE: パソコンのハードウェア情報を表示するソフト
    BASENAME: post_160
    STATUS: Publish
    ALLOW COMMENTS: 1
    CONVERT BREAKS: __default__
    ALLOW PINGS: 1
    PRIMARY CATEGORY: PC・インターネット
    CATEGORY: PC・インターネット
    DATE: 07/29/2006 03:21:00 PM
    —–
    BODY:
    ●EVEREST Home Edition
    パソコンのハードウェア情報を表示してくれる便利なソフトです。
    ハードウェアの詳細情報やドライバやファームウェアのバージョンまで表示してくれます。
    どんな時に使うかというと、例えば
    パソコンにメモリーを増設しようと思う場合。
    メモリーを増設する場合現在載っているメモリーと同じ種類の
    物を買う必要があります。
    メモリータイプやメモリー速度などを覚えていない場合
    度々パソコンを開けてメモリーを調べるのは疲れます。
    そういう場合Everestでメモリーの情報を表示すれば
    メモリーの詳細情報を知ることが出来ます。
    ちゃんとしたメーカー製で有ればメーカー名まで表示されます。
    グラフィックボード新しいのに買い換えようと思ったときに
    AGPの場合、「このマザーAGP速度何処まで対応してたっけ?x4だっけ?x8までだっけ?」
    とか悩むことが有るわけです。そういう場合もEverestで表示すればばっちりです。
    とにかくパソコンのありとあらゆる情報が詳しく知ることが出来ます。
    メーカー品のパソコンなんかどういう部品で出来てるのか見ると面白そうです。
    残念なことに製作元ではHomeEdition(個人使用無料版)は取り扱わなくなってしまったようですが下記のページから今でもダウンロードすることができます。
    ▼ここからダウンロードできます。
    http://www.altech-ads.com/product/10000755.htm
    —–
    EXTENDED BODY:

    —–
    EXCERPT:

    —–
    KEYWORDS:

    —–

    COMMENT:
    AUTHOR: 匿名
    EMAIL:
    IP: 192.168.1.1
    URL:
    DATE: 04/26/2008 12:49:43 AM
    どんだけぇ~~!!
    —–

    WPプレスにインポートするとBASENAMEの部分がWPのDBのpost_nameになるようになっています。うちのブログのパーマリンクは
    http://blog.kumacchi.com/2013/05/記事タイトル.htmlというフォーマットなので、WPの設定>パーマリンクの設定カスタム構造で「/%year%/%monthnum%/%postname%.html」と指定すれば基本的にはパーマリンクを引き継ぐ事が出来ます。しかし、WPのテーブル定義でpost_nameはvarchar(200)と定義されているので、22文字しか保存する事が出来ません。
    結果、
    http://blog.kumacchi.com/2013/05/ネスカフェ_バリスタの調子が悪いので分解清掃してみた.html
    では無く
    http://blog.kumacchi.com/2013/05/ネスカフェ_バリスタの調子が悪いので分解清掃し.html
    と、URLが短くなってしまい、404エラーになってしまうのでした。
    まだ、アクセスの少ない記事であれば、あきらめもつくのですが、今現在一番アクセスの多い記事がそれですので、ちょっとやっぱりまずいなーと思った泡家です。アクセスしようと思ったら404エラーなんてかっこ悪すぎですからw。

    ——–
    AUTHOR: kumacchi
    TITLE: ネスカフェ バリスタの調子が悪いので分解清掃してみた
    BASENAME: ネスカフェ_バリスタの調子が悪いので分解清掃してみた
    STATUS: Publish

    また、14MBのエクスポートしたファイルは、そのままWPにインポートできますが、多分デフォルトではPHPの設定を変更しないとインポートできるファイルのサイズが2MBになっていると思うので、変更できない場合はこのエクスポートしたファイルを2MB以下に記事の区切りで分割して保存して順番にインポートしていけば問題ありません。むしろその方が失敗が無くて安全です。


  2. エクスポートしたファイルでは画像などのデータは移行できないので、サーバーにsshでログインして
    tar -zcvf blog.kumacchi.com.tar.gz blog.kumacchi.com
    で固めてftpで新しいサーバーに転送しました。
    そして、
    tar -zxvf blog.kumacchi.com.tar.gz
    で受信側で解凍しました。
    面倒を省くためにディレクトリ構造は全て移行元と同じにしてあるので解凍するだけでそのまま全てのデータを移行できました。このままMTのダイナミックパブリッシングで動けばよかったんですけどね。

  3. ワードプレスをインスールためにMYSQLに新規DBを作成します。

    #MYSQLログイン
    mysql -u root -p
    パスワード

    #DBの作成
    CREATE DATABASE kumatype_DB;

    #MYSQLユーザー追加と権限追加
    GRANT ALL ON *.* TO kumacchi_wps@"localhost"IDENTIFIED BY "password1234";
    FLUSH PRIVILEGES;

    #抜ける
    quit


  4. wordpressのインストール

    http://ja.wordpress.org/releases/
    上から最新版のURLを取得。

    # cd /home/kumacchi/public_html/
    # wget http://ja.wordpress.org/wordpress-3.8-ja.tar.gz
    # tar zxvf wordpress-3.8-ja.tar.gz
    # cp -rfp wordpress-3.8-ja blog.kumacchi.com
    # sudo chown -R apache blog.kumacchi.com

    のような感じでMTのディレクトリにそのままWPをコピーします。
    で、元のMTのmtフォルダなどはそのままにしておくとセキュリティー的に問題があるので削除するかリネームしておきましょう。元の.htaccessは削除しましょう。この先の詳しいインストール方法は下記サイトなどを参考にしてください。
    WordPress のインストール – WordPress Codex 日本語版
    WordPressインストール – WordPressの使い方


  5. WPのインストール後の設定。MTのパーマリンクを引き継ぐためにWPのパーマリンクの設定を行います。前の方で書きましたが、
    WPの設定>パーマリンクの設定カスタム構造で「/%year%/%monthnum%/%postname%.html」と指定します。


  6. WPの管理画面からMTのエクスポートデータをインポートするためのプラグインをインストールします。管理画面で設定>インポートと選択します。
    Movable Type と TypePad」を選択します。すると初回はプラグインのインストール画面になるのでインストールします。
    インストール後は以下の画面が表示されます。参照でインポートするファイルを選択してアップロードするか、/wp-content/にmt-export.txtというファイル名でアップロードしておけばインポートする事が出来ます。ファイルサイズが大きい場合はFTP等でアップロードした方がよさそうです。が、インポート途中で止まってしまう事があるので、失敗するようなら2MB程度に小分けしてアップロードする事をオススメします。
    WS2014-01-06_21_01_14
    また、画面を見るとわかる様にアップロードできる最大サイズは2MBなっていますが、.htaccessに以下の様に記述すれば容量を増やす事が出来ます。ただ、やはりインポートサイズが大きいと途中で止まってしまう事があるので、その場合や小分けしてアップロードするなどの対策が必要です。

    php_value memory_limit 20M
    php_value post_max_size 20M
    php_value upload_max_filesize 20M

    WordPressのインポートの容量制限を増やす方法 | 無料ホームページ制作、パソコン・インターネットの使い方

  7. インポートするプラグインにはバグがあるのでこれを修正します。
    修正するファイルは、
    /wp-content/plugins/movabletype-importer/movabletype-importer.php
    です。
    WS2014-01-06_21_15_31 102行目付近で8192になっている箇所があるのでここを大きな値にします。私は0を二つ付けて819200にしました。このバグの所為でどうやら記事が8KBで切れてしまう制限があるようです。

    参考:WordPress › フォーラム » ライブドアブログから WordPress へのデータの以降のトラブル


  8. post_nameのvarchar(200)の制限を突破するためにテーブルの定義を変更します。

    mysql -u root -p
    パスワード
    #利用するDBを指定
    use kumatype_DB;

    #テーブル定義を見る
    mysql> DESCRIBE wp_posts;
    +———————–+———————+——+—–+———————+—————-+
    | Field                 | Type                | Null | Key | Default             | Extra          |
    +———————–+———————+——+—–+———————+—————-+
    | ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
    | post_author           | bigint(20) unsigned | NO   | MUL | 0                   |                |
    | post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
    | post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
    | post_content          | longtext            | NO   |     | NULL                |                |
    | post_title            | text                | NO   |     | NULL                |                |
    | post_excerpt          | text                | NO   |     | NULL                |                |
    | post_status           | varchar(20)         | NO   |     | publish             |                |
    | comment_status        | varchar(20)         | NO   |     | open                |                |
    | ping_status           | varchar(20)         | NO   |     | open                |                |
    | post_password         | varchar(20)         | NO   |     |                     |                |
    | post_name             | varchar(200)        | NO   | MUL |                     |                |
    | to_ping               | text                | NO   |     | NULL                |                |
    | pinged                | text                | NO   |     | NULL                |                |
    | post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
    | post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
    | post_content_filtered | longtext            | NO   |     | NULL                |                |
    | post_parent           | bigint(20) unsigned | NO   | MUL | 0                   |                |
    | guid                  | varchar(255)        | NO   |     |                     |                |
    | menu_order            | int(11)             | NO   |     | 0                   |                |
    | post_type             | varchar(20)         | NO   | MUL | post                |                |
    | post_mime_type        | varchar(100)        | NO   |     |                     |                |
    | comment_count         | bigint(20)          | NO   |     | 0                   |                |
    +———————–+———————+——+—–+———————+—————-+
    23 rows in set (0.07 sec)

    #post_nameをvarchar(500)に変更。
    mysql > ALTER TABLE wp_posts MODIFY post_name varchar(500) NOT NULL Default ”;

    再度DESCRIBE wp_posts;してpost_nameがvarchar(500)になっていればOK
    参考:WordPress › フォーラム » 日本語URLの字数制限を増やしたいです


  9. WPのプログラムをvarchar(500)に対応させる。
    ここが一番大変でした。どこがそれなのか探すのが大変でした。WPもPHPも良くわからないのでw。
    /wp-includes/formatting.phpの1071行目
    $title = utf8_uri_encode($title, 200);

    $title = utf8_uri_encode($title, 500);

    と修正。
    /wp-includes/post.phpの3125行目

    $alt_post_name = _truncate_post_slug( $slug, 200 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    $alt_post_name = _truncate_post_slug( $slug, 500 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    と修正。
    /wp-includes/post.phpの3142行目

    alt_post_name = _truncate_post_slug( $slug, 200 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    alt_post_name = _truncate_post_slug( $slug, 500 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    と修正。
    /wp-includes/post.phpの3156行目

    $alt_post_name = _truncate_post_slug( $slug, 200 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    $alt_post_name = _truncate_post_slug( $slug, 500 – ( strlen( $suffix ) + 1 ) ) . "-$suffix";

    と修正。
    /wp-includes/post.phpの3178行目

    function _truncate_post_slug( $slug, $length = 200 ) {

    function _truncate_post_slug( $slug, $length = 500 ) {

    と修正。

  10. あとは、インポートすればちゃんと長いパーマリンクも引き継がれているはずです。

タグ : ,