d3blog→MovableType へのデータ移行

ある案件で、現在Xoops を使って運用しているサイトを、Movable Typeでリニューアルするというモノがあった。

ここ数年、当社で受託する案件のうち、CMSを使ったサイト構築では100% WordPress を採用していたので、MovableTypeについてはほぼ全くの素人。

しかし、お客様がどうしてもWordpressは嫌で、MovableTypeでなくてはいけないということで、「当社はMovableTypeについてはほとんど経験がない」という前提でお引き受けした。

 

大半のページは完全リニューアルだったのだが、ブログを使い、ユーザ自らこつこつと作り上げてきたコンテンツは、全て移管したいというご要望があった。

これらのコンテンツはd3blog上で作成されており、これをMovableTypeへ移管せねばらないということになったわけだ。

 

d3blog にはエクスポート機能が実装されていない!

ところが、d3blog についてはエクスポート機能が実装されていない!

データベースを直接参照して、データを引き出さなくてはいけないのか?とも考えたが、非常に面倒だし、そもそも、確実に解析して、納期までに対応できる自信がない。

そこで、いろいろ調べたところ、d3blogをWordpressに移管するという方法なら、ネットでもいくつかの方法が公開されていた。

2014年9月の段階では、ネット上の情報量としては、MovableTypeよりも、Wordpressの方が圧倒的に多く、というよりも、MovableTypeの情報はほとんどヒットしない。

MovableTypeへのデータインポート方法も、検索しても有益な情報はほとんどヒットしなかった。

そこで、d3blogのデータをいきなりMovable Typeへ移管するのではなく、いったんWordpressに移管し、Wordpressから出力したデータをMovableTypeへ移管するという方針をとることにした。

以下、その手順をまとめておく。

Step1: d3blogからデータをエクスポートする

 d3blogには、データを一括エクスポートする機能はない。

しかし、Wordpress には、データ取り込みの方法として、RSS から取り込むことが可能となっている。

d3blog にももちろんRSS配信機能が実装されている。

そこで、d3blogにて配信されるRSSについて、全記事を出力するように改造することで、Wordpressに全記事を移すことができるようになる。

1. /xoops_trust_path/modules/d3blog/main/rss.php を修正

/xoops_trust_path/modules/d3blog/main/rss.php ファイル

56行目あたり

$limit = intval($myModule->getConfig(‘max_rdf’));

$limit = 0;

66行目あたり

foreach($entries as $entry) {
$item[‘title’] = xoops_convert_encoding($entry->getVar(‘title’));
$item[‘link’] = sprintf(‘%s/modules/%s/details.php?bid=%d’, XOOPS_URL, $mydirname4show, $entry->bid());
$item[‘guid’] = sprintf(‘%s/modules/%s/details.php?bid=%d’, XOOPS_URL, $mydirname4show, $entry->bid());
$item[‘pubdate’] = d3blog_rfc2822_date($entry->published());
$item[‘description’] = xoops_convert_encoding($entry->pingExcerpt(0));
$items[] = $item;
}

 これを、以下のように変更

$all_categories =& $cat_handler->getAll();
foreach($entries as $entry) {
$category =& $all_categories[$entry->cid()];
$arr =& $entry->getStructure();
$item[‘title’] = xoops_convert_encoding(htmlspecialchars($entry->getVar(‘title’, ‘n’), ENT_QUOTES));
$item[‘link’] = sprintf(‘%s/modules/%s/details.php?bid=%d’, XOOPS_URL, $mydirname4show, $entry->bid());
$item[‘guid’] = sprintf(‘%s/modules/%s/details.php?bid=%d’, XOOPS_URL, $mydirname4show, $entry->bid());
$item[‘pubdate’] = d3blog_rfc2822_date($entry->published());
$item[‘description’] = xoops_convert_encoding($entry->renderContents(false,’e’));
$item[‘category’] = xoops_convert_encoding($category->getVar(‘name’));
$item[‘creator’] = xoops_convert_encoding($arr[‘blogger’][‘uname’]);
$items[] = $item;
}

※ 変更後、ファイルを/xoops_trust_path/modules/d3blog/main/rss.php に上書きアップロード(上記リンクをクリック→名前を付けて保存 すれば、修正後のファイルをダウンロードできます)

2.RSS関連テンプレートを修正

元サイトでは、altsys モジュールを利用していたので、ALTSYSの「テンプレート管理」メニューから、変更予定のd3blog の「****_main_rss.xml」を以下のように修正

※ 上記の**** 部分は、d3モジュールとしてアップロードした名前が入る(デフォルトは d3blog)

<?xml version=”1.0″ encoding=”UTF-8″?>
<rss version=”2.0″
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:atom=”http://www.w3.org/2005/Atom”
xmlns:sy=”http://purl.org/rss/1.0/modules/syndication/”
xmlns:slash=”http://purl.org/rss/1.0/modules/slash/”
>
<channel>
<title><{$feed.title}></title>
<link><{$feed.link}></link>
<description><{$feed.desc}></description>
<lastBuildDate><{$feed.lastbuild}></lastBuildDate>
<docs>http://backend.userland.com/rss/</docs>
<generator><{$feed.generator}></generator>
<category><{$feed.category}></category>
<language><{$feed.lang}></language>
<{if $logo_url != “”}>
<image>
<title><{$feed.title}></title>
<url><{$feed.logo_url}></url>
<link><{$feed.link}></link>
<width><{$feed.logo_width}></width>
<height><{$feed.logo_height}></height>
</image>
<{/if}>
<{foreach item=item from=$entries}>
<item>
<title><{$item.title}></title>
<link><{$item.link}></link>
<pubDate><{$item.pubdate}></pubDate>
<author><{$item.creator}></author>
<category><{$item.category}></category>
<description><{$item.description}></description>
</item>
<{/foreach}>
</channel>
</rss>

「更新して編集終了」ボタンをクリックすればOK

これで、d3blog のRSSで、過去の記事全件が出力されるようになる。

※ このファイル(d3blog_main_rss.zip)が、筆者が保存したデータ

3. d3blog のRSSデータを取り出す

(1) http://www.example.com/modules/d3blog/index.php?page=rss にてRSSを表示

※ www.example.com は対象となるサイトのURL

※/d3blog/ はd3モジュール名 

(2) 表示されたRSS画面の「ソースコードを表示」させる

(3) 表示されたソースコードを全てコピーし、テキストファイルに貼り付け、保存する

 事例では、xoops_d3blog_rss.xmlという名称で、utf-8 にて保存した。

 Step2. 画像データをダウンロードする

 rssには画像へのリンクデータはあっても、画像そのものは存在しない。

したがって、リンクデータから、画像をダウンロードする必要がある

1. rssデータから、リンクURLを抽出する

いちいち手動でデータを取り出すなんてことはできないので、absurl というツールを使う

(1) absurl を実行して表示される画面にて、入力ファイルの横にある「開く」ボタンを押下

01_absurl_file_open_btn

(2) d3blogから取り出したrssファイルを選択し「開く」ボタンを押下

02_absurl_file_open_dialog

(3) 一番上の「開く」ボタンを押下

03_absurl_file_make_btn

(4) 画像データの一覧はhtmlファイルとして出力されるので、そのhtmlファイルの名前を「ファイル名」欄に入力し、「保存」ボタンを押下する

04_absurl_file_make_dialog

(5) 「抽出」ボタンを押下

05_absurl_file_pickup_btn

※ ボタンを押下しても、特にメッセージは出力されないので、本当に動いたのか不安になるかもしれないが、(4) で指定したフォルダ、ファイル名を開くと、確かに一覧が生成されていることがわかる

2.出力したリンク集から、画像データを一括ダウンロードする

出力されたリンクから、画像データをダウンロードするわけだが、これも、いちいちダウンロードしているのは面倒。

Firefoxであれば、先のリンク集htmlファイルを開いて、Add-on のDown Them All を用いることで、一括ダウンロードできる。

【参考】Jugem から WordPress へのデータ移行方法

ここでは、別の方法を紹介しておく

(1) イメージ・ダウン を実行し、URL欄に上記で出力した htmlファイルをフルパスで入力し、「移動」ボタンを押下する。

※ 筆者の環境では ctrl+p で貼り付けができなかったがマウスの右クリック→「貼り付け」では入力することができた。
06_image_down-default

(2) オプションボタンを押下

07_image_down-option_btn

(3)「フォルダ」タブをクリック

08_image_down-option_folder_tab

(4)「追加」ボタンを押下

09_image_down-option_folder_add_btn

 

(5)名称欄に、適当な名前を付け、(事例では「example downloads」とした)、ダウンロード先フォルダをフルパスで入力する

10_image_down-option_folder_add_dialog

 

 

(6)「確定」ボタンを押下

11_image_down-option_folder_add_dialog_fix_btn

(7)「確定」ボタンを押下

12_image_down-option_folder_fix_btn

 

(8)画像ファイル一覧にて、ダウンロードしたいファイルにチェックを入れ、「標準フォルダへダウンロード」または「フォルダを指定してダウンロード」ボタンを押下

13_image_down-download_start_btn

 

以上の手順で、インポート元のd3blog で扱っていた画像を全てローカル環境へ取り込むことができる

Step3. インポート予定のRSSデータに記述されている画像リンク先を、移行先環境に合わせて変更する

やはり、この作業が最もやっかいで、面倒な作業である

基本的には、d3blog から得たrssデータはテキストファイルであるため、置換ツールを使って行うのが最も効率的である。

このとき、textss を用いて変換するのが最も容易な方法だと思う。

Jugem から WordPress へのデータ移行方法

ただ、前回のJugem のような、リンク構造がよくわからないという状況はなかったため、一般的なテキストエディタの置換機能を用いても、十分対応できるだろう。

この時点では、筆者は秀丸エディタの「超(?)~高速全置換マクロ」を用いて置換を行った。

 Step4. 新システム上に、画像データをFTP (Over SSL) にて一括アップロードする

Step2 にてダウンロードした画像データを、全て新サーバへアップロードする。

Step5. WordPress にインポートする

最終目標はMovableTypeだが、まずはWordpress へ移行させる

1.仮サーバ上のWordpress において、「ツール」→「インポート」リンクをクリック

019-wp-import-link

2.「RSS」リンクをクリック

14_wordpress_import_menu_rss_link

※ 初めて利用する場合は、インポート機能のインストールが始まるので、以下の3.へ。
※ すでにこの機能を利用したことがある場合は、インストール済みなので ■■■■へ

 3.「いますぐインストール」ボタンを押下

14_wordpress_rss-importer_install_start_btn

4.「プラグインを有効化してインポートを実行」リンクをクリック

16_wordpress_rss-importer_install_asctivate_link

5.「ファイルを選択」ボタンを押下

17_wordpress_rss-importer_select_file_btn

 

6.インポートするRSSファイルを選択し、「開く」ボタンを押下

18_wordpress_rss-importer_select_file_open_btn

 

7.「ファイルをアップロードしてインポート」ボタンを押下

19_wordpress_rss-importer_start-import_btn

 

8.インポートが完了すると、「全て完了しました。ではお楽しみください!」と表示される

20_wordpress_the-end-of-rss-import

 

念のため、本当に正しくインポートできたかは、確認しておくとよい。

Step6. Wordpress 形式でデータをエクスポートする

WordPress 形式でデータのインポートができたので、これをMovableTypeに移行する

1.Wordpress の「ツール」→「エクスポート」リンクをクリック

21_wordpress_export_menu-link

2.「エクスポートファイルをダウンロード」ボタンを押下

22_wordpress_export_start_btn

※ 事例では全てのコンテンツとしたが、移行環境や仮サーバの環境によっては投稿記事のうち、特定のカテゴリーのみなど、条件が異なることもあると思われる。

3.ファイルの保存先、ファイル名を入力し、「保存」ボタンを押下

23_wordpress_export_dialog_input_filename

 

Step7. Movable Type にデータを取り込む

移行先のMovableTypeにログインし

1.管理画面の「ツール」→「記事のインポート」リンクをクリック

025-MT-import-menu-click

2. ファイルを選択

027-MT-import-setting-btn

3.Step6. で保存したWP形式の記事データを選択し、「開く」ボタンを押下 

025-MT-import-file-dialogue

 4.インポート元のデータ形式欄で 「Wordpress eXtended RSS(WXR)」を選択

028-MT-import-setting-menu

 

5. 「記事のインポート」ボタンを押下

029-MT-import-start-btn

 

これらの作業でMovable Type に記事がインポートできる

 

追記:なぜかエラーが発生し、インポートできない!

記事の以降完了後、ユーザが20件弱の新記事をアップしていたため、追加20件分の記事の以降を追加して行うことになった。

上記手順でStep7  の 4.まで順調に進んだのに、5. 「記事のインポート」ボタンを押下 を行ったときに、MovableType にて次のエラーが発生した。

インポートの途中でエラーが発生しました : Cannot decode string with wide characters at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/Encode.pm line 173. 。インポートファイルを確認してください。

早速Googleでエラーを調べると、以下の記事を発見した。

マオの徒然日記:MovableTypeでCannot decode string with wide charactersエラー

この記事によると、次のような記載がある。

今回は以下のファイルを修正してなんとかなった。
mt/lib/MT/BackupRestore/BackupFileHandler.pm
413行目付近

sub _decode {
Encode::_utf8_off( $_[0] ); ←追加
Encode::decode_utf8( $_[0] );
}

これが本当に正しい解決方法かどうかは不明。

 

このサーバ環境はお客様の管理者が全て構築、運用を行い、当方から見ると完全なブラックボックスで設定変更を行うことができない。

その状況下で、上記のような変更をするためにはお客様に依頼する必要がある。

ところが、この変更を行ったからといって、正しく動作する保証はない。

今回は、稼働環境特有の問題である可能性が高いと思ったので、なおさらである。

オープンソース版なら問題なくインポートできた!!

そこで、ものは試しと、テスト用に設置したオープンソース版のMovableType にて、同じファイルをインポートしたところ、問題なくインポートできた。

オープンソース版のMovableTypeにて、再度MT形式でデータをエクスポート。

そのデータを、再度本番環境のMovableTypeに移行させようとしたら、問題なくインポートできた。

 

2014年10月現在の日本では、かつては市場を席巻していたMovableTypeを採用することはほとんど見なくなり、当社としても案件の99%は WordPress を採用している。

また、Xoops で稼働するサイトも激減している中、d3blog というモジュールに接することも少なくなった。

今後も、当面の間はWordpress が主流となると思われることから、こうしたデータ移行作業も発生するだろう。

そこで、その手順について、自信のメモとしても残しておく意味で、ブログにアップしておく。

The following two tabs change content below.

岡本 興一

クライアント経営者からは「カウンセラー」と呼ばれている自称「IT活用コンサルタント」。 ホームページ制作の依頼があっても、経営改善のための社長カウンセリングが始まり、なかなか制作が始まらないということで有名。 1971年生まれ。国立大阪大学工学部卒業。 ネットとITに詳しい経営者のサポーターで、仕組み作りのプロフェッショナル。 PHS販売数日本一の通販サイトや、圧倒的な売上を作るホテルのサイトなど多数プロデュースし、インターネットやITを経営に役立てるためのノウハウを常に仕入れ、実践しているだけでなく、経営に関する様々なノウハウ、メソッドの研究を行っており企業の「戦略」策定能力には定評がある。 保有資格:ITコーディネータ / CompTIA e-Biz+ / TCAE /公認情報セキュリティ監査人 / 情報セキュリティアドミニストレータ / CSMS(米国SEW認定SEO/SEM スペシャリスト)など多数
  • Pocket
  • LINEで送る
  • このエントリーをはてなブックマークに追加

関連記事

インターネット上の情報は丸見えであることを多くの人は知らない
なんで、IT業界、ウェブ業界って、いつまでもこんな業者が多いんだっ!
Jugem から WordPress へのデータ移行方法
NAS Linkstation LS-WX2.0TL/R1J の故障~2TB×2本(RAID1)に容量増加して復旧
し、知らなかった・・・Gmail の検索で、OR は or と小文字にしてはいけない
8年愛用したマウスが突如故障!!
WordPress のメディア追加の際、画像へのリンクをデフォルトで「なし」にする方法
企業のWebサイト(ホームページ)構築にWordPress をオススメする理由
さようならRSSリーダー! Google リーダーの終了でThe Old ReaderかFeedlyを使おうと思ったけれど、そんなもの要らないってことがわかった
結構危険! フリースポット(無料無線LAN, フリーWi-Fi)
WordPressサイトの機能追加には、WordPress本体の改造ではなく、プラグインを用いるべき
悪徳?SEO対策業者からの仰天回答が今頃届いた!(続報:なんで、IT業界、ウェブ業界って、いつまでもこんな業者が多いんだっ!)
Twitter アカウントを、ウエディング業界向けのキューレーションサービス提供窓口にしてみた
WordPressサイトの高速化に効果のあったCDN(Cloud Flare)とプラグイン
なぜ戦略を立案しても達成することができないのか?

Menu

HOME

TOP