- 2010年8月22日 8:36 PM
- Diary | Movable Type | WordPress
完全放置状態のこのブログでしたが、ついにMovable Typeから決別し、WordPress3.0.1に移行を決心。
移行にあたり、MODxやSOY CMSも検討しましたが、圧倒的な情報量の多さと、移行に関してのノウハウ比較的多く、最新バージョン=3.0.1の使いやすさから、WordPressにしました。
移行にあたり、とりあえず、MySQLを4.0から5.1にバージョンアップ、サブドメインのテストサイトにWordPress3.0.1をインストールし、移行にあたりできることとできないことを整理した結果、判ったことは・・・。
- Movable Typeでエクスポートした記事、カテゴリ名、タグはWordPressでインポート可能
- ただし、パーマリンク設定は引き継げない(Movable Type側でエクスポートされない)
- ウェブページも、Movable Type側でエクスポートされない
個別記事のパーマリンクに関しては、Movable Type側のアーカイブパスマッピングと、WordPressのパーマリンク設定を合わせる事で、移行することができます。
しかし、当サイトの場合ウェブページをいくつか持っているので、それを引き継げないのは痛い。
そこで、「ネットスクランダー」の記事「MovableTypeからWordPressに固定リンク込みで完璧に移行する方法」と「Kazumism」の記事「MovableTypeからWordPressへの移行手順」を参考に、WordPressでインポート可能な、WXR(WordPress eXtended RSS)形式のテンプレートを使って、ウェブページも移行可能な方法を考えました。
今回は、Movable Typeで、WordPressの記事インポートフォーマットであるWXR形式のxmlファイルを出力するテンプレートと、実際WordPress側でインポートする際のポイントについて説明します。
Movable TypeからWordPress移行の前提
まず前提として
- Movable Type側の「アーカイブマッピング設定」とWordPress側の「パーマリンク設定」が合わせられる設定になっておいる。
- WordPressインストール後、記事をインポートする前に、プラグイン「Top Level categorys」をインストールする。
- WordPressは公開ディレクトリ直下にインストールするか、インストール外ディレクトリでの公開設定を予めしておく。
ことが条件になります。
1.については、、Movable Type側でカスタムマッピング設定していても、ほとんどの場合、問題なく合わせることがせきます。
気をつけるのは、Movable Type側のブログの公開設定で、「アーカイブをサイトパスとは別のパスで公開する」設定にしている場合で、例えば当サイトのように、「http://marqueemoon.info/archives/~」といた具合に「archives/~」配下にアーカイブパスを指定している場合は、WordPressのパーマリンク設定で「archives/個別記事のパス」といた具合に指定する必要があります。
2.については、WordPress3側でカテゴリインデックスに対して勝手に「サイトURL/categry/カテゴリパス~」といった具合に「categry/」というパスが入ってしまうのですが、プラグイン「Top Level categorys」をインストールすれば、「categry/」というパスを取り除く必要がります。
3.について、公開ディレクトリとインストールディレクトリが違う場合は、記事インポートの前に設定しておいたほうがトラブルは少ないと思われます。個人的には「サイトパスURL/wp/~」といった具合に公開ディレクトリの中にインストールディレクトリを作成し、管理画面にBasic認証をかけたほうが安全な気がします。
ですので、
- Movable Type側で記事をエクスポート
- 公開ディレクトリの中身を移動、又は削除
- WordPressのインストール・公開パス、パーマリンクの設定、プラグインのインストール
- 記事のインポート
といった段取りになります。
WordPressインポート用テンプレートの作成
テンプレートの作成にあったては、Kazumismの記事「MovableTypeからWordPressへの移行手順」で紹介されていたテンプレートをベースに、記事の「本文」と「続き」が正しくインポートされるように修正し、ウェブページの出力機能を追加しました。
インデックステンプレートの新規作成で、テンプレート名「export」、出力ファイル名を「export.xml」として、以下のテンプレートを作成します。
exportテンプレート
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/1.0/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
<wp:wxr_version>1.0</wp:wxr_version>
<title><$MTBlogName$></title>
<link><$MTBlogURL$></link>
<description><$MTBlogDescription$></description>
<language>ja</language>
<wp:base_site_url><$MTBlogURL$></wp:base_site_url>
<wp:base_blog_url><$MTBlogURL$></wp:base_blog_url>
<mt:Categories show_empty="1">
<wp:category><mt:ignore></mt:ignore><wp:category_nicename><$mt:CategoryBasename$></wp:category_nicename><mt:ignore></mt:ignore><wp:category_parent><mt:ParentCategory><$mt:CategoryLabel$></mt:ParentCategory></wp:category_parent><mt:ignore></mt:ignore><wp:cat_name><![CDATA[<$mt:CategoryLabel$>]]></wp:cat_name><mt:ignore></mt:ignore><wp:category_description><![CDATA[<$mt:CategoryDescription$>]]></wp:category_description><mt:ignore></mt:ignore></wp:category>
</mt:Categories>
<mt:Tags>
<wp:tag><mt:ignore></mt:ignore><wp:tag_slug><$mt:TagName$></wp:tag_slug><mt:ignore></mt:ignore><wp:tag_name><![CDATA[<$mt:TagName$>]]></wp:tag_name><mt:ignore></mt:ignore></wp:tag>
</mt:Tags>
<mt:Entries lastn="0" sort_order="ascend">
<item>
<title><$mt:EntryTitle$></title>
<link><$mt:EntryPermalink$></link>
<pubDate><$mt:EntryDate format_name="rfc822"$></pubDate>
<dc:creator><![CDATA[<$mt:EntryAuthor$>]]></dc:creator>
<mt:EntryCategories>
<category><![CDATA[<$mt:CategoryBasename$>]]></category>
</mt:EntryCategories>
<mt:EntryTags>
<category domain="tag"><![CDATA[<$mt:TagName$>]]></category>
</mt:EntryTags>
<guid isPermaLink="false"><$mt:EntryPermalink$></guid>
<description></description>
<content:encoded><![CDATA[<$MTEntrybody$><mt:IfNonEmpty tag="MTEntryMore"><!--more--><$MTEntryMore$></MTIfNonEmpty>]]></content:encoded>
<excerpt:encoded><![CDATA[<$mt:EntryExcerpt$>]]></excerpt:encoded>
<wp:post_id><mt:Ignore><$mt:EntryID$></mt:Ignore></wp:post_id>
<wp:post_date><$mt:EntryDate format="%Y-%m-%d %H:%M:%S"$></wp:post_date>
<wp:post_date_gmt><$mt:EntryDate format="%Y-%m-%d %H:%M:%S"$></wp:post_date_gmt>
<wp:comment_status><mt:IfCommentsAccepted>open<mt:Else>closed</mt:IfCommentsAccepted></wp:comment_status>
<wp:ping_status><mt:IfPingsAccepted>open<mt:Else>closed</mt:IfPingsAccepted></wp:ping_status>
<wp:post_name><$mt:EntryBasename$></wp:post_name>
<wp:status><$mt:EntryStatus lower_case="1"$></wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>0</wp:menu_order>
<wp:post_type>post</wp:post_type>
<wp:post_password></wp:post_password>
<mt:Comments lastn="0">
<wp:comment>
<wp:comment_id><$mt:CommentID$></wp:comment_id>
<wp:comment_author><![CDATA[<$mt:CommentAuthor default="??"$>]]></wp:comment_author>
<wp:comment_author_email><$mt:CommenterEmail$></wp:comment_author_email>
<wp:comment_author_url><$mt:CommentURL$></wp:comment_author_url>
<wp:comment_author_IP><$mt:CommentIP$></wp:comment_author_IP>
<wp:comment_date><$mt:CommentDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date>
<wp:comment_date_gmt><$mt:CommentDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date_gmt>
<wp:comment_content><![CDATA[<$mt:CommentBody$>]]></wp:comment_content>
<wp:comment_approved><mt:IfCommentsActive>1<mt:Else>0</mt:IfCommentsActive></wp:comment_approved>
<wp:comment_type></wp:comment_type>
<wp:comment_parent>0</wp:comment_parent>
<wp:comment_user_id>0</wp:comment_user_id>
</wp:comment>
</mt:Comments>
<mt:Pings lastn="0">
<wp:comment>
<wp:comment_id><$mt:PingID$></wp:comment_id>
<wp:comment_author><![CDATA[<$mt:PingTitle$>]]></wp:comment_author>
<wp:comment_author_email></wp:comment_author_email>
<wp:comment_author_url><$mt:PingURL$></wp:comment_author_url>
<wp:comment_author_IP><$mt:PingIP$></wp:comment_author_IP>
<wp:comment_date><$mt:PingDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date>
<wp:comment_date_gmt><$mt:PingDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date_gmt>
<wp:comment_content><![CDATA[<$mt:PingExcerpt$>]]></wp:comment_content>
<wp:comment_approved><mt:IfPingsActive>1<mt:Else>0</mt:IfPingsActive></wp:comment_approved>
<wp:comment_type>trackback</wp:comment_type>
<wp:comment_parent>0</wp:comment_parent>
<wp:comment_user_id>0</wp:comment_user_id>
</wp:comment>
</mt:Pings>
</item>
</mt:Entries>
<!-- ここからはページ -->
<mt:Pages lastn="0" sort_order="ascend">
<item>
<title><$MTPageTitle$></title>
<link><$MTBlogURL$><MT:PageBaseneme></link>
<pubDate><$MTPageDate format_name="rfc822"$></pubDate>
<dc:creator><![CDATA[<$MTPageAuthorDisplayName$>]]></dc:creator>
<mt:PageTags>
<category domain="tag"><![CDATA[<$mt:TagName$>]]></category>
</mt:PageTags>
<guid isPermaLink="false"><$MTBlogURL$><MT:PageBaseneme></guid>
<description></description>
<content:encoded><![CDATA[<$MTPageBody$><mt:IfNonEmpty tag="MTPageMore"><!--more--><$MTPageMore$></MTIfNonEmpty>]]></content:encoded>
<excerpt:encoded><![CDATA[<$MTPageExcerpt$>]]></excerpt:encoded>
<wp:post_id><mt:Ignore><$MTPageID$></mt:Ignore></wp:post_id>
<wp:post_date><$MTPageDate format="%Y-%m-%d %H:%M:%S"$></wp:post_date>
<wp:post_date_gmt><$MTPageDate format="%Y-%m-%d %H:%M:%S"$></wp:post_date_gmt>
<wp:comment_status><mt:IfCommentsAccepted>open<mt:Else>closed</mt:IfCommentsAccepted></wp:comment_status>
<wp:ping_status><mt:IfPingsAccepted>open<mt:Else>closed</mt:IfPingsAccepted></wp:ping_status>
<wp:post_name><$MTPageBasename$></wp:post_name>
<wp:status>publish</wp:status>
<wp:post_parent>0</wp:post_parent>
<wp:menu_order>0</wp:menu_order>
<wp:post_type>page</wp:post_type>
<wp:post_password></wp:post_password>
<mt:Comments lastn="0">
<wp:comment>
<wp:comment_id><$mt:CommentID$></wp:comment_id>
<wp:comment_author><![CDATA[<$mt:CommentAuthor default="??"$>]]></wp:comment_author>
<wp:comment_author_email><$mt:CommenterEmail$></wp:comment_author_email>
<wp:comment_author_url><$mt:CommentURL$></wp:comment_author_url>
<wp:comment_author_IP><$mt:CommentIP$></wp:comment_author_IP>
<wp:comment_date><$mt:CommentDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date>
<wp:comment_date_gmt><$mt:CommentDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date_gmt>
<wp:comment_content><![CDATA[<$mt:CommentBody$>]]></wp:comment_content>
<wp:comment_approved><mt:IfCommentsActive>1<mt:Else>0</mt:IfCommentsActive></wp:comment_approved>
<wp:comment_type></wp:comment_type>
<wp:comment_parent>0</wp:comment_parent>
<wp:comment_user_id>0</wp:comment_user_id>
</wp:comment>
</mt:Comments>
<mt:Pings lastn="0">
<wp:comment>
<wp:comment_id><$mt:PingID$></wp:comment_id>
<wp:comment_author><![CDATA[<$mt:PingTitle$>]]></wp:comment_author>
<wp:comment_author_email></wp:comment_author_email>
<wp:comment_author_url><$mt:PingURL$></wp:comment_author_url>
<wp:comment_author_IP><$mt:PingIP$></wp:comment_author_IP>
<wp:comment_date><$mt:PingDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date>
<wp:comment_date_gmt><$mt:PingDate format="%Y-%m-%d %H:%M:%S"$></wp:comment_date_gmt>
<wp:comment_content><![CDATA[<$mt:PingExcerpt$>]]></wp:comment_content>
<wp:comment_approved><mt:IfPingsActive>1<mt:Else>0</mt:IfPingsActive></wp:comment_approved>
<wp:comment_type>trackback</wp:comment_type>
<wp:comment_parent>0</wp:comment_parent>
<wp:comment_user_id>0</wp:comment_user_id>
</wp:comment>
</mt:Pings>
</item>
</mt:Pages>
</channel>
</rss>
ウェブページを出力する必要がない場合は、コメント<!– ここからはページ –>から、</mt:Pages>までを削除します。
保存・再構築すると、公開ディレクトリに「export.xml」というファイルができるので、FTPでダウンロードし、WordPress側で、インポートします。
インポートの際は、「ダッシュボード」→「インポート」で「WordPress」を選択、必要に応じてプラグイン「WordPress Importer」がインストールされ、ファイルアップロード画面になるので、ダウンロードしたファイルをアップロードすれば、OKです。
Movable Type側のアーカイブテンプレート設定と、WordPress側のパーマリンク設定ですが、本サイトのように、Movable Type側で「サイトURL/archives/yyyy/mm/dd-hhmmss.php」となっている場合は、WordPress側のパーマリンク設定を「/archives/%year%/%monthnum%/%day%-%hour%%minute%%second%.php」に、「サイトURL/entry_basename.html」の場合は、WordPress側のパーマリンク設定を「/%postname%.html」といった具合です。
ただし、このテンプレート利用する方法もはいくつか問題があります。
ウェブページのパーマリンクに関して
Movable TypeのウェブページをWordPressのページにインポートする場合、このテンプレートで記事、タグを引き継ぐことはできますが、パーマリンクを引き継ぐことはできません。
- WordPressでは、ウェブページに拡張子がつけられない。
- Movable Typeは実ディレクトリと実体ファイルで階層管理をしているのに対し、WordPressではページ自体をディレクトリとして見立てて、ページ間の親子関係を設定することで階層管理をしている。
ですので、このテンプレートでは、<$MTBlogURL$><MT:PageBaseneme>といった具合に、サイトのルートディレクトリ直下にあるものとしてウェブページを出力、WordPressでインポート後、各ページ間の親子関係を手動で設定し、Movable Typeでの公開パス再現する方法をとってます。再現するには、Movable Typeでのアーカイブマッピングが「folder-path/page-badename/index.html(.php)」であることが条件となります。
アーカイブが
A:「folder-path/page-basename/index.html(.php)」の場合
「folder-path/」がルートディレクトリか、上位のページが格納されているディレクトリの場合、上記の手順で、パーマリンク構造を再現することができます。
Movable Type側
サイトURL/page1/index.html
└サイトURL/page1/page2/index.html
WordPress側
サイトURL/page1
└サイトURL/page1/page2 ←インポート後、「page2」の親を「page1」に設定
ただし、実体ファイル「/index.html」のリクエストに対しては404エラーになるので、外部からのリクエストに対してはリダイレクトさせ、サイト内リンクに対しては修正するしかありません。
又、「folder-path/」に該当する部分が、実ファイルのない空のディレクトリだった場合は、WordPress側で、「folder-path/」該当する空の親ページを作る必要があります。
B:「folder-path/page-basename.html(.php)」の場合
残念ながら、リダイレクトさせるしか手段がありません。
「folder-path/」サイトのルートディレクトリの場合、そのまま実ファイル「page-badename.html」に対するリクエストを「http://サイトURL/page-badename」にリダイレクトさせます。
又、Aのときと同様、「「folder-path/」に該当する部分が、実ファイルのない空のディレクトリだった場合は、WordPress側で、「folder-path/」該当する空の親ページを作る必要があります。
ちなみに、当サイトの場合、Bのパターンだったので、リダイレクトさせてます。
.htaccessはこちら「ミケネコの htaccess リファレンス」か、稚拙ながら当サイトのこの記事を参照ください。
尚、リダイレクトさせる場合は、自分で.htaccessを作るのではなく、WordPressが生成する公開ディレクトリ直下の.htaccessに追記する形になります。
カテゴリに関して
前述の通り、WordPressの場合、カテゴリアーカイブの対して「サイトURL/archives/category/カテゴリ名/サブカテゴリ名」といった具合に、必ず「category/」というパスがつくので、予めプラグイン「Top Level categorys」をインストールする必要がります。
また、カテゴリの階層関係は、2階層までしかできません。
Movable Typeで、孫に設定したカテゴリは全てトップレベルカテゴリに置き換わってしまうので、WordPressにインポート後手動で修正する必要があります。
尚、WordPressにインポート後、一部のカテゴリが管理画面上に表示されない場合もありますが、カテゴリの親子関係を編集すれば、正常に表示されます。
未公開記事はインポートされない
ネットスクランダーの記事にも記載されてますが、正確には、Movable Type側で未公開記事がエクスポートされません。
一度、公開状態にしてからエクスポート/インポートする必要があります。
カスタムフィールドはインポートされない
カスタムフィールドを使ってないので、あまり重視していないのですが、カスタムフィールドはインポートされません。
テンプレートでカスタマイズで出力した記事本文内容はインポートされない。
投稿画面で記述した内容しか、エクスポートされません。テンプレートをカスタマイズし、記事本文に出力された内容はエクスポートされません。
<p>~</p>で括られていない文章の改行は、<p>タグに変換される
<p>~</p>限らず、ブロック要素で括られてない改行は、勝手にWordPress側で<p>~</p>タグに変換されてしまうようです。
エクスポートされるのは、テンプレートを含まないあくまでも「記事本文」なので、テンプレートが記事本文をブロック要素で括っていたとしても、それは無視されてしまいます。
気になる人は、予めMovable Type側で記事を修正したほうが良いでしょう。
画像ファイルは先にアップロードしておく
記事内に大量の画像を使っている場合は、先にアップロードしておいたほうが、WordPress側で負荷軽減になるようです。
画像をアップロードせずに、大量の画像を使っているインポートした記事を開いたら、正常に表示されない場合があるようです。
次回は、実際の移行手順について詳細に書きたいと思います。
ミケネコの htaccess リファレンス
- 古い: Movable Typeオワタ
コメント:0
コメントを投稿するにはログインしてください。
トラックバック:1
- この記事のトラックバック URL
- http://marqueemoon.info/archives/2010/08/22-203601.php/trackback
- トラックバックの送信元リスト
- Movable Type4.3からWordPress3.0.1に移行~その(1) - *Marquee Moon より
- pingback - Communication for the rest of us » Blog Archive » Movable Type 4からWordPress 3へ移行しました より 2010年9月5日
[...] きます。 ■参考URL 【参考URL1】Movable Type4.3からWordPress3.0.1に移行~その(1) http://marqueemoon.info/archives/2010/08/22-203601.php 【参考URL2】WordPressのパーマリンク問題は、「mt-style-post-name」によって [...]