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;

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

Aug 302006
 

以前も使っていたDrupal熱が再燃してきました。
きっかけはDrupalサイトをいろいろ見かけるようになったことと、WordPress 2系列からDrupal 4.7への移行moduleを見つけちゃったためです。

ざっくりとした移行手順は

  1. Drupalをインストール
    pathautoモジュールの利用が推奨されているのでインストールしておきます。
  2. wp2drupalモジュールをアップロードし有効化
    モジュール配置ディレクトリは書き込み可能にしておく必要があります。
    modulesディレクトリを書き込み可にするのははばかれましたので、wp2drupalディレクトリを作ってchmod +wしました。
  3. Administerメニューの「Import from WordPress」を実行

となります。

それからPHPのiconv()が使える環境でないと実行できないのですが(XREAには入ってません)、WordPressをUTF-8で利用している場合はそもそも不要なので、以下の修正を加えています。

$ diff -u modules/wp2drupal/wp2drupal.module.default modules/wp2drupal/wp2drupal.module
--- modules/wp2drupal/wp2drupal.module.default  2006-06-23 01:51:02.000000000 +0900
+++ modules/wp2drupal/wp2drupal.module  2006-08-30 14:46:02.000000000 +0900
@@ -555,10 +555,12 @@
   }

   // Condition 2: iconv function must be available
+  /*
   if (!function_exists('iconv')) {
     $message .= t('<li>Please enable <strong>iconv</strong> extension on your PHP installation. This extension is mandatory for correct wp2drupal functionality.');
     $result = false;
   }
+  */

   // Condition 3: module directory must be writable
   $test_file = drupal_get_path('module', 'wp2drupal') . '/.writable.test.file';

実際にiconv()を使っているのはmigration.phpですが、WordPressのsite_encodingがUTF-8なときは実行されないコーディングになっているので、上記のように無視しちゃっても問題ありません(UTF-8以外で使っているところではiconv必須です)。

で、とりあえず移行してみたものはhttp://gmt-24.net/でご覧いただけます 🙂

今のところ気になるところは以下の2点。

  • 記事番号(WordPressのpostid、Drupalではnid)が同じにならない
  • 記事の時刻がGMT時刻で表示されてしまう(-9時間)

うーん。2点目はまだ許せるのですが、記事番号が変わらないようにする方法、何かないでしょうか…
WordPressでは/archives/%postid%で永続リンクを設定していたので、ちょっと不便です。

Apr 292006
 

Drupal 4.7.0 RC4がリリースされました。
私は「DrupalをCVS版で利用」している状態ですので、CVS updateで更新してみます。RC4用のCVSタグはDRUPAL-4-7-0-RC-4になります。

contributionsソースの削除対策

前記事でも書いた懸念の通り、contributions/{themes,modules}からチェックアウトしているものにはDRUPAL-4-7-0-RC-4タグがありませんので、-Pオプションで更新するとディレクトリが空になり削除されてしまいます(多分)。
この対策として、ファイルをひとつ追加しておき少なくともディレクトリが消えないようにしておきます。

$ echo "DRUPAL-4-7" > themes/simplex2/.keep_me

.keep_meという空ファイル配置は、その昔NetBSDのcompileディレクトリに使われていた手法です。今回は空ファイルではなく、checkoutしたときのタグを記録しています。
こうしておくことで、チェックアウトしたファイルが消えても上記ファイルとCVSディレクトリは残ることになり、cvs update `cat .keep_me`で簡単に復活させることができます。

Drupal本体の更新

$ cd /path/to/drupal
$ cvs update -Pd -r DRUPAL-4-7-0-RC-4 2>&1 | tee /tmp/cvsupdate.log

ローカルで変更を加えていると、更新内容の衝突が起こる場合がありますので、出力内容をロギングしておきチェックします。衝突が起こった場合、行頭に”C”がつきます。問題なくマージできたものは”M”になります。
衝突がおこったものは目で内容を確認して修正します。

contributions/{themes,modules}の更新

本体の更新によってチェックアウトしていたディレクトリの中身が空になってしまった場合、チェックアウトしたときと同じタグ(.keep_meに書き込んでおいた値)を指定してcvs updateします。

$ cd /path/to/drupal/themes/simlex2
$ cvs update -Pd -r `cat .keep_me` 2>&1 | tee /tmp/cvsupdate.log

こんな感じです。.keep_meファイルをfindしてcvs updateするようにしないと面倒ですね。

Apr 182006
 

WordPressの記事をDrupalに移行すると、Pagesのエントリはきちんとtype=bookのノードとして作成できているのですが、ページの親子関係を編集することができないことに気がつきました。
原因はbookテーブルに対象ノードのエントリがなかったため。

INSERT INTO `book` ( `nid` , `parent` , `weight` , `vid` ) VALUES ('64', '0', '0', '64');

のようにエントリを作成すると親子関係も修正できるようになるのですが…
移行の仕方が何かしらまずかったんですかねぇ 😕

Apr 082006
 

Drupalで最近4.7.0 RC2が出たのでそろそろ4.6から上げてみようかと思ってます。
ですが3月末にRC1が出たばかりでしたので今4.6から4.7RC2にアップグレードしても、すぐに4.7正式版がリリースされそうです。
アップグレードの都度、更新されたファイルをマージするのがなかなか大変なので、この際CVSリポジトリからチェックアウトして、ローカル側更新とのマージ作業を楽にしてみようと思います。
DrupalのCVSリポジトリの情報は本家ドキュメントに載ってますので、詳しくはそちらを参照ください。

cvsログイン

$ cvs -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal login
CVS password: (anonymousを入力)

Drupal本体のチェックアウト

Drupal本体のソースをチェックアウトします。

$ cvs -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal co -r DRUPAL-4-7-0-RC-2 drupal

モジュールのチェックアウト

contributionsから必要なDrupalモジュールをチェックアウトします。
以下の例はtaxonomy_accessモジュールです。チェックアウト先のディレクトリがモジュールが展開されたときと同じ名前になるように-dオプションを使います。

$ cd drupal/modules
$ cvs -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal co -r DRUPAL-4-7 -d taxonomy_access contributions/modules/taxonomy_access

テーマのチェックアウト

contributionsからDrupalモジュール同様テーマをチェックアウトします。

$ cd drupal/themes
$ cvs -d:pserver:anonymous@cvs.drupal.org:/cvs/drupal co -r DRUPAL-4-7 -d friendselectric contributions/themes/friendselectric

更新のやり方

今後更新するときは、cvs updateだけで済めばいいんですが、タグがDRUPAL-4-7-RC-2ですので、正式リリース版ではタグを変更しないといけません(もしくはブランチ)。
Drupal本体のソースに関しては、正式リリース版のタグがDRUPAL-4-7-0だとすれば、

$ cvs update -r DRUPAL-4-7-0 -Pd

で済むんですが、こうするとDRUPAL-4-7でチェックアウトしているモジュールやテーマがおかしくなる可能性があります。
その場合は手間ですが、個別にチェックアウトしたディレクトリで再びcvs updateすることになるかも知れません。

$ cd modules/friendselectric
$ cvs update -r DRUPAL-4-7 -Pd

といった具合に。

DRUPAL-4-7ブランチでまとめてupdateできればいいんですけどね。正式リリース時はブランチ用意されないかなぁ。

CVSとの差分確認

ローカルで独自に加えた変更はcvs diff -uでCVSとの差分を確認できます。

$ cvs diff -u
Index: .htaccess
===================================================================
RCS file: /cvs/drupal/drupal/.htaccess,v
retrieving revision 1.70
diff -u -r1.70 .htaccess
--- .htaccess   24 Mar 2006 18:00:27 -0000      1.70
+++ .htaccess   10 Apr 2006 00:44:21 -0000
@@ -26,6 +26,7 @@
   php_value magic_quotes_gpc                0
   php_value register_globals                0
   php_value session.auto_start              0
+  php_value mbstring.func_overload          0
 

 # PHP 4, Apache 2
@@ -33,6 +34,7 @@
   php_value magic_quotes_gpc                0
   php_value register_globals                0
   php_value session.auto_start              0
+  php_value mbstring.func_overload          0
 

 # PHP 5, Apache 1 and 2
@@ -40,6 +42,7 @@
   php_value magic_quotes_gpc                0
   php_value register_globals                0
   php_value session.auto_start              0
+  php_value mbstring.func_overload          0
 

 # Reduce the time dynamically generated pages are cache-able.
Index: sites/default/settings.php
===================================================================
RCS file: /cvs/drupal/drupal/sites/default/settings.php,v
retrieving revision 1.24
diff -u -r1.24 settings.php
--- sites/default/settings.php  8 Jan 2006 12:10:12 -0000       1.24
+++ sites/default/settings.php  10 Apr 2006 00:44:21 -0000
@@ -139,3 +139,10 @@
 //  'anonymous' => 'Visitor'
 //);

+mb_language('ja');
+ini_set('mbstring.script_encoding',        'UTF-8');
+ini_set('mbstring.internal_encoding',      'UTF-8');
+ini_set('mbstring.http_input',             'pass');
+ini_set('mbstring.http_output',            'pass');
+ini_set('mbstring.detect_order',           'auto');
+ini_set('mbstring.substitute_character',   'none');
$

上記例では、Drupal-jBox.netで説明されている、「Drupal日本語環境向けの設定例」の変更が加わっていることが確認できます 🙂

Mar 142006
 

WordPressが2.0.2になったと思ったら、今度はDrupalも4.6.6が出ました。
Security Fix 4件(うちcriticalは1件)が含まれているようですので、パッチ適用の格好で早速適用。更新対象は以下の5ファイルです。

  • includes/menu.inc
  • includes/common.inc
  • modules/book.module
  • themes/engines/xtemplate/xtemplate.engine
  • modules/user.module

次期バージョンである4.7系列もbeta6がリリースされています。

Mar 132006
 

ちょっと前の話になりますがDrupal-jBox.net | Drupal日本語情報集約サイトというサイトがオープンしたようです。
日本語のコミュニティとしては既に≡ Drupal Japan ≡ | Drupal 日本サイトがありましたが、どういったすみわけになるのでしょうか 😕

それぞれをざっと見ても、互いのサイトに関する話は見当たりません。

Drupal復活するも移行作業ミスでWordPress停止

 announce, article  Comments Off on Drupal復活するも移行作業ミスでWordPress停止
Mar 112006
 

データを破壊してしまったDrupalを復活させました。
以前のWordPressからDrupalへの移行のようにおこなうのですが、こちらのMigration UtilityはWordPress 1.5が前提になります。
WordPressは2.0.1にしてしまってたので、こちらの
WordPress Database Downgrader
を利用して1.5にダウングレードしてからDrupalに移行します。

その後WordPressを再びアップグレードしたのですが、ログインできなくなってしまいました 🙁
皆様お試しになる際は、DBのバックアップを取得することをお奨めします orz

#usermetaテーブルが変になったようなのですが、直すの面倒くさい。

drupalのサイトは閉鎖します

 announce  Comments Off on drupalのサイトは閉鎖します
Feb 282006
 

誤ってdrupalのデータベーステーブルを壊してしまいました(phpmyadminでいろいろ修正していたら、おかしくなってしまったのです)。
バックアップからリストアすることも可能なのですが、最近WordPressと二本立てで書いていて中途半端だったので、この際WordPressに一本化しようと思います。

ちょっとリンクなどでご迷惑おかけするかも知れませんがご容赦ください。そんな見てる人いないと思うけど 🙁

Feb 272006
 

drupalではブログ、ページ、ブックといった様々な種類のコンテンツを作成できますが、一旦作成したコンテンツのタイプを変更する方法がありません。
Drupakサイトのforumにも話題があります。
how to change a node’s type after it’s already been created as something else?
試しにphpmyadminのGUI操作で変更してみたら見事に化けました。
ちょっと面倒ですが、UPDATE SQL文直接のほうが確実そうです。

UPDATE drupal_node SET type='book' WHERE nid=nn;