MovableTypeからWordPressへ引っ越し

今回、Movable Type Pro 5.2.6からWordpress 4.0への移行過程をメモしておきます。

まず、MovableTypeのエクスポートを行ってみる・・・。ん、何かが足りてない。そうなんです、パーマリンクとかかサックリなくなっています。このままじゃいけないというので検索してみた、ありました。

下記の操作の前に、必ずバックアップを取ってください。

MovableTypeからWordPressへの完全移行方法

どうやら/lib/MT/ImportExport.pmを変更するらしい。

[perl highlight=”2,3,4″]
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$><MTEntryIfTagged include_private="1">
PERMALINK: <$MTEntryPermalink$>
TAGS: <MTEntryTags include_private="1" glue=","><$MTTagName quote="1"$></MTEntryTags></MTEntryIfTagged>
ID: <$MTEntryID$>
[/perl]

上記の「DATE:」という記述を探し、その下に「PERMALINK」「EntryIfTagged」「ID」の行を追加します。

後はエクスポートです。

エクスポートしたファイルを眺めていると、あれ、パーマリンクの「post-1」などが「post_1」に変わっているではありませんか。これじゃ困るので置換しましょう。

テキストエディタなどで「BASENAME: post_」を「BASENAME: post-」に変換し保存します。安全のため、ファイル名を変更して保存します。

下準備はできたので、Wordpress側のインポートのプログラムを編集しましょう。

WordPress 3.0にMovable Typeのタグをインポートする

まるっと転載させて頂きます。

wp-content/movabletype-importer配下にある、movabletype-importer.php編集。

[php highlight=”27,28,29,30″]
function save_post(&$post, &$comments, &$pings, &$tags) {
  $post = get_object_vars($post);
  $post = add_magic_quotes($post);
  $post = (object) $post;

  if ( $post_id = post_exists($post->post_title, ”, $post->post_date) ) {
    echo ‘<li>’;
    printf(__(‘Post <em>%s</em> already exists.’, ‘movabletype-importer’), stripslashes($post->post_title));
  } else {
    echo ‘<li>’;
    printf(__(‘Importing post <em>%s</em>…’, ‘movabletype-importer’), stripslashes($post->post_title));

    if ( ” != trim( $post->extended ) )
      $post->post_content .= "n<!–more–>n$post->extended";

    $post->post_author = $this->checkauthor($post->post_author); //just so that if a post already exists, new users are not created by checkauthor
    $post_id = wp_insert_post($post);
    if ( is_wp_error( $post_id ) )
      return $post_id;

    // Add categories.
    if ( 0 != count($post->categories) ) {
      wp_create_categories($post->categories, $post_id);
    }

    // Add tags or keywords
    if ( 1 < strlen($tags) ) {
      // Keywords exist.
      printf(‘<br />’.__(‘Adding tags <em>%s</em>…’, ‘movabletype-importer’), stripslashes($tags));
      wp_add_post_tags($post_id, $tags);
    }
  }
  …中略…
}
[/php]

[php highlight=”14,34,42,51,52″]
function process_posts() {
global $wpdb;

$handle = $this->fopen($this->file, ‘r’);
if ( $handle == null )
return false;

$context = ”;
$post = new StdClass();
$comment = new StdClass();
$comments = array();
$ping = new StdClass();
$pings = array();
$tags = ”;

echo "<div class=’wrap’><ol>";

while ( $line = $this->fgets($handle) ) {
$line = trim($line);

if ( ‘—–‘ == $line ) {
// Finishing a multi-line field
if ( ‘comment’ == $context ) {
$comments[] = $comment;
$comment = new StdClass();
} else if ( ‘ping’ == $context ) {
$pings[] = $ping;
$ping = new StdClass();
}
$context = ”;
} else if ( ‘——–‘ == $line ) {
// Finishing a post.
$context = ”;
$result = $this->save_post($post, $comments, $pings, $tags);
if ( is_wp_error( $result ) )
return $result;
$post = new StdClass;
$comment = new StdClass();
$ping = new StdClass();
$comments = array();
$pings = array();
$tags = ”;
} else if ( ‘BODY:’ == $line ) {

…中略…

} else if ( 0 === strpos($line, "CATEGORY:") ) {
$category = trim( substr($line, strlen("CATEGORY:")) );
if ( ” != $category )
$post->categories[] = $category;
} else if ( 0 === strpos($line, "TAGS:") ) {
$tags = trim( substr($line, strlen("TAGS:")) );
} else if ( 0 === strpos($line, "PRIMARY CATEGORY:") ) {
$category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
if ( ” != $category )
$post->categories[] = $category;
…中略…
}
}
…中略…
}
[/php]

 

上記に加えて

[php highlight=”8,9,10,11,12,13″]
function process_posts() {
global $wpdb;

…中略…

} else if ( ‘COMMENT:’ == $line ) {

$context = ‘comment’;
} else if ( ‘PING:’ == $line ) {
$context = ‘ping’;
} else if ( 0 === strpos($line, "PERMALINK:") ) {
$value = trim( substr($line, strlen("PERMALINK:")) );
$tmpvalue = strrchr($value,"/");
$post->post_name = substr($tmpvalue, 0, strpos($tmpvalue, "."));
} else if ( 0 === strpos($line, "TAGS:") ) {
ns/movabletype-importer$tags = trim( substr($line, strlen("TAGS:")) );
} else if ( 0 === strpos($line, ‘AUTHOR:’) ) {
[/php]

これでインポートの準備は完了。

MovableTypeが出力したhtmlファイル(PHP化されている方はphp)ファイルを削除して、それトップページを見てみましょう。

ん~いい感じだけど、パーマリンクが・・・・・・エクスポートしたはずなのに・・・。

んで、Wordpressの管理画面を開いて、[設定][パーマリンクの設定]を開きます。

私の場合は年月で記事を吐き出していたので、カスタム構造を選択し

/archives/%year%/%monthnum%/%postname%.php

な感じです。無事にパーマリンクを引き継げました。

あとは、MovableTypeで管理していた画像たちWordpressのメディアに登録し、Movabletypeの痕跡を消してしまいましょう。

MT形式からWordPressへ移行した際に画像をインポートするプラグイン

ダウンロードして、FTPなどでアップし、プラグインを有効化し、実行、停止、削除、これだけです。

記事に埋め込まれているURLもしっかりと書き換えてくれる優れもの。

確認後は、バッサリ消してしまいます。

このブログのURLの中身は.htaccessとindex.php、favicon.ico、そしてメディアとして登録されたuploadsのみです。

だらだら書きましたが、これで全てです。

MovableTypeからWordPressへの移行

長らく、ブログを引退しておりましたが、Wordpressでサイトを再構築してみようと心に決め、移行しました。

テーマは1から作りこんでおります関係上、不具合が多いかもしれません。2週間で覚えるのは無理って感じです。

いろいろ考えてみたのですが、CMSが変われば、それまで蓄えた情報が原作エンジンから姿を消えてしまうでしょう。

そこは考えようで、sitemap.xmlをGoogleさんにお知らせして、新しいURLでインデックスしてもらうしかありません。

インストールしてみて感想ですが、Movable Type 改PHP版よりWordpressの方が少しレスポンスがいいかもしれません。やっぱり、MySQLが新しいのに当たったからでしょうか。

デザインはシンプルな方がよいので、Movable Typeのクラッシックブログというテーマにわざと似せました。データを引き継ぐんだしいいか。

少々あったトラブル等も含め、今後記事を書いていきたいと思います。

今回行った以降は、Movable Type version 5.2.6 からWordpress 4.0になります。

MovableTypeが・・・

どっかがおかしくなった模様。

おかしいのは今の所、ウェブページかな。再構築を行ってもファイルが生成されない。

どっかの週末にでも再度バックアップをとり、再インストールする予定(は未定w

追記:10月27日

単に非公開になっていることが判明。自分でやったのだろうか。そうなんだろうな。

アーカイブパスの設定

 トップディレクトリーが煩雑になってきてバックアップ取るのも面倒になってきた。最初からアーカイブパスを設定しておけば良かったんだけど、使い方をあまり理解しないまま使っていたので、トップディレクトリーにファイルやディレクトリがいっぱい。

カテゴリー名もcat100とかだと何のカテゴリーか分からなくなるので命名し、Movabletypeのバックアップ。データベースの中身もバックアップ。

準備1
バックアップから画像の入っているディレクトリーを除き削除し画像以外のファイルを削除。

準備2
MovableTypeの「アーカイブをブログパスとは別のパスで公開する」にチェックを入れ、アーカイブパスを設定する。

準備3
準備1で残ったものを準備2で作ったパスにコピーする。

準備4
SQL分の下記を変更
mt_assetのasset_file_pathの内容を変更する。
   %r/sample.gif → %r/archives/sample.gif
mt_entryのURLでアーカイブパスの必要なものを書き換える。
   これが一番面倒な作業。実際何度か挫折した。

準備5
準備4で修正したSQL分をデータベースに上書きで流し込む。

ここで再構築を行う。すべての記事が出力されるので、再構築終了後、記事の入っているディレクトリーを削除する。

ちゃんとアーカイブパスが入った状態で画像や記事、記事中のパスが合っていれば完了。

 

とまあ書いたものの記事数が多すぎてチェックする気にもならないので、ちょこちょこ確認し、間違っていたら修正する方向で。

それと、これをやると他からのリンクが切れます。当然、GoogleさんやYahooさんが蓄えた検索情報もゴミになります。

今後の事を考えれば、今やるのも間違った選択じゃないかなという思いでやっちゃいましたけど。

みなさん、「アーカイブをブログパスとは別のパスで公開する」にチェックを入れてからMovableTypeを使いましょう。

Movable Typeセキュリティーアップデートの提供を開始

今回は早めのアップデートを行ってみた。

内容は、

  • Movable Type の mt-wizard.cgi および同梱されているテンプレートの一部に、クロスサイトスクリプティングの脆弱性が存在します。ユーザのウェブブラウザ上で任意のスクリプトを実行される可能性があります。Trustwave 社よりレポート(TWSL2012-002)。
  • コメント登録およびコミュニティ機能に、セッションハイジャックが可能となる脆弱性が存在します。特定の条件において、遠隔の第三者によって、ユーザになりすまされる可能性があります。
  • コメント登録およびコミュニティ機能に、クロスサイトリクエストフォージェリの脆弱性が存在します。ユーザが、当該製品にログインした状態で悪意あるページを読み込んだ場合、設定を変更されたり、データを更新されたり、情報を閲覧されたりする可能性があります。
  • Movable Type のファイル管理システムには、OS コマンドインジェクションの脆弱性が存在します。管理画面にログインすることができ、かつファイルアップロードの権限を持つユーザによって、任意の OS コマンドを実行される可能性があります。

との事なので、と言いながらいつもなら先延ばしすることろですが、どうせ上書きで終わりだろうと、ファイルをアップロード。

何事もなくアップデート完了。

問題は再構築だな。PHP & モジュール化を行っているにも関わらずインデックスページだけで36秒とか何かおかしいだろう。同居している他人様がリソースを食いつぶしているとしか思えない重さ。

そろそろ本気モードで自宅サーバーへ移行しようかな。他のは稼働しているわけだし、そんなにPVがあるわけじゃないしね。仮想マシンが1つ位増えても電気代は誤差範囲だろうしな。

その前にレンタルなメールサーバー探さないといけないか。トホホ

Movable Type 5.12 および、5.06、4.292 セキュリティーアップデートの提供を開始

急に熱くなってきた今日この頃ですが、節電しすぎで熱中症とかになっていない事をねがいつつ。

 

早すぎるよ。ってか不具合具合が・・・。

最近5.11にアップしたばかりなのに、もう5.12ですか。

そうですか。

すいません。週末まで待ってください><;

Movable Type 5.1出荷開始!

な~んだろう。ここんところ土日も仕事でプライベートの無い2週間。

この歳で土日を完全に100%仕事すると死にそうになるわ。

帰ってからもあれの改修してるから、起きている間は移動・仕事・タバコって感じか。

もう、明日から休みたい気分が全開です;;

“Movable Type 5.1出荷開始!” の続きを読む

MTEntryClassLabelタグで検索結果が表示される

MTEntryClassLabelタグで検索結果にウェッブページも表示できるようになった。

なんかウェッブページも” dirty=”false”><$mt:EntryBody$>で表示されるようなのでブログ記事概要とか、phpをincludeしているところで分岐させて終わり。

使い方には

<mt:If name="$type" eq="Page">

になっていますが

<mt:If name="type" eq="ウェブページ">

が日本語環境では正解政界の模様。

どこの記事を読んでもそうなのでそうなのでしょう。Pageで返してくれればあっちこっち探さなくても良かったのに。

検索結果が・・・

MovableTypeをPHP&モジュール化してしばし経つが、検索結果にウェブページが表示されるとは知らなかった。

記事とウェブページと別な構造になってるので検索結果を表示する所を修正しなきゃ。

ってことで検索結果にPHPのエラーが出てるのは、私の未修正が原因です。申し訳ない。

そういうわけで、数か月中(遅)には修正します。

仕方なくindex.rdfを追加

mixiの更新情報が出てないでやっぱりindex.rdfをクロールしてくるので、Movable Type 備忘録 – RSS1.0テンプレートを追加するを参考に追加してみた。当然、相方の方もなんだけど。

でもしっくりしないな。昔index.rdfを設定してたって事は、前はテンプレートがあったはずなんだよな。MovableType基本上書きアップデートでやってたので、なんかのタイミングで消えちゃったのかな。相方のも消えてるから、人為的じゃないんだよな。

mixi以外でもindex.rdfを読むのかな。atom.xmlで問題なかったんだけどな。まあいいですけど。なんかmixiに負けた感じで嫌なだけ。

自分のブログはモジュール化しているのですぐに追加が終わるけど、相方のはPHP化したものの、全然モジュール化してない(一部はしている)。

やっぱり、相方の方もモジュール化するかな。いや、面倒だから臨機応変と言う事で!(^^)!