2013/5/7

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。

とりあえず、見通しがたって良かった、というところ。

ひとり仕事: フリーランスという働き方
(2012-10-5)
売り上げランキング: 14,705
100円
WordPressデザインレシピ集
狩野 祐東
技術評論社
売り上げランキング: 197,569
WordPress 高速化&スマート運用必携ガイド
こもりまさあき 岡本渉
エムディエヌコーポレーション
売り上げランキング: 435,263