Sep 012006
 

WordPress to Drupal migration utilityを使ってWordPress記事をDrupalに移行する際、シーケンス番号も元記事と同じにする方法を探ってみました。
元記事の番号がきれいに揃っていればこんなことを考えなくてもよいのですが、削除などで途中が歯抜けになっていると、移行後は順番に詰められた状態になってしまうので、アーカイブ番号でリンクを貼りまくっていたりすると不便です。

移行ユーティリティのmigration.phpを眺めてみると、記事の保存はnode_saveというDrupal functionを使っておこなっています。
ものは試しと、この直前に

$node->nid = $post['ID'];
$node->vid = $post['ID'];
node_save($node);

と入れてみたのですが、動きはまったく変わりません。
Drupalのnidやvidは、{sequences}テーブルに保存されているシーケンス番号を元に算出されるようになっています。
node_saveをおこなうと、シーケンス番号+1で記事が作成されるので、WordPressの記事番号-1をnode_save直前に設定するようにしてみました。

$ diff -u modules/wp2drupal/migrate.php.default modules/wp2drupal/migrate.php
--- modules/wp2drupal/migrate.php.default       2006-06-19 12:55:20.000000000 +0900
+++ modules/wp2drupal/migrate.php       2006-09-01 15:43:25.000000000 +0900
@@ -146,7 +146,7 @@
        mysql_free_result($result);

        // posts
-  $query = _wp2d_prepare_wp_query("SELECT * FROM {posts} ORDER BY post_date;");
+  $query = _wp2d_prepare_wp_query("SELECT * FROM {posts} ORDER BY ID;");
   $result = mysql_query($query, $wp_connection);
   while ($post = mysql_fetch_assoc($result)) {
        $wp['posts'][] = $post;
@@ -402,6 +402,10 @@
     global $user;
     $previous_uid = $user->uid;
     $user->uid = $node->uid;
+
+    db_query("UPDATE {sequences} SET id=%d WHERE name='node_nid'",           $post['ID'] - 1);
+    db_query("UPDATE {sequences} SET id=%d WHERE name='node_revisions_vid'", $post['ID'] - 1);
+
     node_save($node);
     $user->uid = $previous_uid;

おぉ。とりあえず記事だけは意図通りの番号になりました 🙂 こんなんで大丈夫なのかな?

Sorry, the comment form is closed at this time.