MODXからWordPressへのデータ移行に挑戦した(割と無茶)
GW最終日、ちょっと見通しが効かないと危ないなと思う仕事があったので、結局午後丸々プログラムと格闘してました。MODXというCMSで作られた論文データベースを、WordPressサイトにリニューアルしつつ、移行するという仕事。で、論文って、様々な付帯情報があるんですよね。というわけで、10年分くらいのデータベースを移行するとなると、手入力なんかじゃとてもやってられないので、データをうまいことインポート / エクスポートしてやらないととてもじゃないけど、無理でしょうと。
このMODX、国産のCMSだそうで、僕はデータベースのバックアップをSQLで受け取りました。これをまずうちのテストサーバにインポートしてテーブルの中身を見てみる。データベースの構成要素のうち、論文に紐づくところは大体わかったので、そこから必要なデータ抽出すれば良い。わけなんですが、そんな簡単ではないですねこれ。あそうそう、MODXもMySQL使ってました。これは助かった。
とりあえず、こんなSQLを書きました。
SELECT mx_site_tmplvar_templates.*,mx_site_tmplvars.*,mx_site_tmplvar_contentvalues.*,mx_site_content.id,mx_site_content.parent FROM mx_site_tmplvar_templates LEFT JOIN mx_site_tmplvar_contentvalues ON (mx_site_tmplvar_templates.tmplvarid = mx_site_tmplvar_contentvalues.tmplvarid) LEFT JOIN mx_site_tmplvars ON (mx_site_tmplvar_contentvalues.tmplvarid = mx_site_tmplvars.id) LEFT JOIN mx_site_content ON (mx_site_tmplvar_contentvalues.contentid = mx_site_content.id) ORDER BY mx_site_content.id ASC
これで一応、カスタムフィールドモノ的なものが記事ごとに羅列された状態になりました。ここからWordPress。
while ($row = mysql_fetch_assoc($results)) { if($row['contentid'] > 21) { $id = $row['contentid']; $desc = $row['desc']; $value = $row['value']; $parent = $row['parent']; $title = ''; if($parent == '18') { if($desc == '論文タイトル(和文)') { $title = $value; } } elseif($parent == '17') { if($desc == 'Volume') { $vol = $value; } if($desc == 'Number') { $num = $value; } if($desc == '発行年') { $year = $value; } if(!empty($vol) && !empty($num) && !empty($year)) { $title = 'Volume '.$vol.' Number '.$num.' '.$year; } } if($id > $past_id) { $post = array(); $post['guid'] = $id; if($parent == '18') { $post['post_type'] = 'report'; } elseif($parent == '17') { $post['post_type'] = 'journal'; } $post['post_title'] = $id; $post['post_status'] = 'publish'; $post['post_author'] = '1'; $postid = wp_insert_post($post); } $post = array(); $post['ID'] = $postid; $post['post_title'] = $title; if($parent == '18') { $post['post_type'] = 'report'; } elseif($parent == '17') { $post['post_type'] = 'journal'; } $post['post_status'] = 'publish'; $post['post_author'] = '1'; wp_insert_post($post); add_post_meta($postid, $desc , $value, true); $past_id = $row['contentid']; $past_title = $title; }
こんなん個別事案なので、あんまり参考にならないと思いますが、とりあえず、新しいIDが出て来たら、wp_insert_postで記事を作っちゃいます。んで、タイトルに入れられるだけ情報が集まったら再度wp_insert_postして記事名を更新。論文とジャーナルってのがあるので、それぞれ別のカスタム投稿タイプになるように切り分けてます。で、間に出てきた論文の付帯情報はadd_post_metaでカスタムフィールドに突っ込んでいく。これを延々とやらせると、すげえ重いし、スマートさ皆無ですが、一応、MODXのデータベースにある情報をWordPressに持って来れました。
本当はSQLの後に配列綺麗にしてやればいいんだと思うんですけどね。なんかそれも大変そうなので、人海戦術というか、原始的な方法でやりました。去年の仕事が結構役に立ったのというと、ちょっと勉強になったとも思うのですが、こういう仕事ばかり来るのはしんどそうだなとも思ったりw。
とりあえず、見通しがたって良かった、というところ。

加藤 康祐 / 企画・設計
プランナー、デザイナー。加藤康祐企画設計代表。Webデザインを入り口に、2005年よりフリーランスとしてのキャリアスタート。主な仕事としてベンチャー企業でのサービスのUXデザイン、独法との防災メディアの運営、社会的養護の子どもたちの自立を支援するNPOのサポート。ラグビーと料理、最近イラスト。
是非、フォローしてください!
Twitter / Instagram
売り上げランキング: 14,705
100円
フリーランスとして働き始めるってどういうことだったのか?フリーランスとして働くってどういうことなのか?フリーランスが目指すことってなんなのか?5年間の自分の経験から書きました。(2010年執筆)