BLOG

Go to top


Movable Type 4のクローン機能でエントリを複製させない方法

July 18, 2007 1:35 AM

初めてMT4のクローン機能を触ってみたとき、本当にそっくりそのまま複製してしまうので、エントリやカテゴリなんかも母体のブログと同じものがデフォルトで入っていることになります。僕には正直このクローン機能が意図しているところがよくわからなくて、設定なんかだけをコピーした新しい「入れ物」を作成するならともかく、すでに中身が入ったものを作ることの理由がつかめません。複製したブログの記事を改めて削除する必要があるなら、最初から複製しなきゃいいのに…と思うわけです。

これは「複製したブログをどう使うか」ということに大きくかかわってきますが、基本的にはまったく同じものを用意する必要性があまりイメージできません。どちらかというと、「ブログの新規作成」機能を補完するものとして、最初から母体と同じ設定になっている新しい「エントリの入れ物」を作成すると考えたほうがいろいろ使い道ありそうな気がするんだけど…

で、ちょっと必要があったので、エントリ以外のクローンを作成する方法を考えてみました。より具体的にいうと、クローン作成の際に、エントリを複製させない方法です。とりあえず超簡単にできる方法を紹介してみます。

「mt/lib/MT/Blog.pm」の509行目をコメントアウトする

これだけでできます。ただし、この「509行目」はベータ6での場合なので、他のバージョンでは変わっているかもしれません。念のため、該当箇所のソースを書いておきます。

501:        while (my $entry = $iter->()) {
502:                   $callback->($state . " " . MT->translate("[_1] records processed...", $counter), 'entries')
503:                   if $counter && ($counter % 100 == 0);
504:                   $counter++;
505:                   my $entry_id = $entry->id;
506:                   delete $entry->{column_values}->{id};
507:                   delete $entry->{changed_cols}->{id};
508:                   $entry->blog_id($new_blog_id);
509:#                    $entry->save or die $entry->errstr;
510:                   $entry_map{$entry_id} = $entry->id;
511:        }

この、「$entry->save or die $entry->errstr;」をコメントアウトするだけで、エントリが複製されなくなります。コメントアウトするには、「mt/lib/MT/Blog.pm」をエディタで開いて、上記のように行頭に「#」を入れます。要はエントリのオブジェクトの保存をさせなくしただけなのですが、これで十分目的はなされます。

同様に、カテゴリも複製したくないのであれば、今度は534行目をコメントアウトします。具体的には以下。

522:        while (my $cat = $iter->()) {
523:                   $callback->($state . " " . MT->translate("[_1] records processed...", $counter), 'cats')
524:                   if $counter && ($counter % 100 == 0);
525:                   $counter++;
526:                   my $cat_id = $cat->id;
527:                   my $old_parent = $cat->parent;
528:                   delete $cat->{column_values}->{id};
529:                   delete $cat->{changed_cols}->{id};
530:                   $cat->blog_id($new_blog_id);
531:                   # temporarily wipe the parent association
532:                   # to avoid constraint issues.
533:                   $cat->parent(0);
534:#                   $cat->save or die $cat->errstr;
535:                   $cat_map{$cat_id} = $cat->id;
536:                   if ($old_parent) {
537:                           $cat_parents{$cat->id} = $old_parent;
538:                   }
539:        }

これで、「エントリの入れ物」としてのブログを複製することができます。ただ問題は、このやり方は内部ソースの改変なので、CMSとしてシステムの提供をすることができなくなります。なので、プラグインとして作成してみようとかなあと思っているのですが、コールバックが起こせるタイミングでもなさそうだし、ちょっと難しいかもしれません。というか、上記の方法で内部をいじらなくても、エントリとかカテゴリとか空っぽのブログを複製用に用意しとけばいいんだけど。

Comments


Contact me

Copyright © 2005 - 2017 okayama All rights reserved.