2003年11月04日

特定のカテゴリのアーカイブのみをリビルドする方法

[カテゴリ: MovableType関連 ]

次に、特定のカテゴリの category archive のみを rebuild する cgi も作ってみました。この cgi も「カテゴリ」を直接指定するのではなく、「エントリ」を指定することで、間接的にカテゴリを指定します。

下に示すスクリプトを mt-rebuild-category.cgi という名前で保存し、mt.cfg と同じディレクトリに置きます。使い方は、以下の通り。

  • mt-rebuild-category.cgi
    最新のエントリの所属する「カテゴリ(複数の場合あり)」の catagory archive(s) のみを rebuild します。
  • mt-rebuild-category.cgi?エントリID
    「エントリID」で指定したエントリの所属する「カテゴリ(複数の場合あり)」の catagory archive(s) のみを rebuild します。

例えば、エントリIDが 86 のエントリの所属するカテゴリが aaa と bbb の場合

mt-rebuild-category.cgi?86

は、「aaa」 と「bbb」の category archives を rebuild することになります。

以下に、スクリプトを示します。

#!/usr/bin/perl -w
# mt-rebuild-category.cgi       04 Nov 2003
#    written by H.Tsujimura (tsupo@na.rim.or.jp)
use strict; 
use CGI::Carp qw(fatalsToBrowser);

my($MT_DIR);
BEGIN {
   if ($0 =~ m!(.*[/\\])!) {$MT_DIR = $1;} else {$MT_DIR = './'; }
   unshift @INC, $MT_DIR . 'lib';
   unshift @INC, $MT_DIR . 'extlib';
}

require MT;
my $mt = MT->new(Config => $MT_DIR .'mt.cfg',
                 Directory => $MT_DIR)
             || die print "Error".(MT->errstr);

require MT::Blog;
require MT::Entry;

print "Content-type: text/html\n\n<html lang=\"ja\">\n";
print "<head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html;";
print " charset=UTF-8\" />\n";
print "<title>rebuild monthly archive</title>\n</head>\n\n<body>\n";

my $entry_id = $ENV{'QUERY_STRING'};

my $entry;
my $blog_id=1;
my $blog = MT::Blog->load($blog_id);
if (!$blog) {print "failed to load blog $blog_id\n";  exit 1;}

if (!$entry_id) {
  # entry_id が指定されていない場合は、最新のエントリを対象とする
    my $iter = MT::Entry->load_iter(
            { blog_id => $blog_id },
            { 'sort' => 'created_on',
              direction => 'descend',
              limit => 5 });
    $entry = $iter->(); # いちばん最新のエントリ
}
else {
  # entry_id が指定されている場合は、当該エントリを対象とする
    $entry = MT::Entry->load($entry_id);
}

# 指定エントリの所属するカテゴリの category archive(s) のみを rebuild する
#   (エントリの所属するカテゴリが aaa と bbb ならカテゴリ aaa と bbb の
#    category archives のみを rebuild する)
print "<p>Rebuild Category Archive ... </p>\n<blockquote>\n";
    my $cats  = $entry->categories;
    print "EnteryTitle    = ".($entry->title)."<br>\n";
    print "EnteryDateTime = ".($entry->created_on)."<br>\n";

    for my $cat (@$cats) {
        print "Category #".($cat->id).": ".($cat->label)." (";
        print $cat->description, ") ...<br>\n";
        $mt->_rebuild_entry_archive_type(
            Entry => $entry, Blog => $blog,
            Category => $cat, ArchiveType => 'Category'
        ) or die $mt->errstr;
    }

if ( $blog_id != $entry->blog_id ) {
    $blog_id = $entry->blog_id;
    $blog = MT::Blog->load($blog_id);
}

print "</blockquote>\n<p>done.</p>\n<hr>\n";
print "<font class='message'>\n";
print "Completed: ".($blog->name).", elapsed time = ".(time - $^T);
print " seconds </font><br><br>\n";

END {
print "</html>","\n";
}    
投稿者: tsupo 投稿時刻: 2003年11月04日 18:15
コメント

 Categoryに関してRebuildができなくなってきており・・・
 こちらのスクリプトを使わせて頂こうとしているのですが、どうしても、「Software error:
You did not set your Local Archive Path」というエラーメッセージが出てしまい、進めません。

 打開策をご教示願えたらとてもうれしいです。

投稿者: 大津和行 投稿時刻: 2004年02月23日 00:01

すぐにわかるかどうかわかりませんが、どういうときにそのエラーメッセージが出るのか、調べてみます。

問題が発生している blog は
http://www.motenai.net/mt7/
でよろしいですか?

カテゴリの名前に日本語を使うようにしているようですが、カテゴリの名前はアルファベットのまま、カテゴリの説明を日本語にして、カテゴリの説明の方を index template で表示させる、という方法を使ってるんですよね? その方法だったら、問題なく使えるはずなんですが。

それとも、別の方法でカテゴリの日本語表示を実現しているのでしょうか?

投稿者: tsupo 投稿時刻: 2004年02月23日 02:18

早速のお返事ありがとうございます。
はい、問題が発生している blog は
http://www.motenai.net/mt7/
です。

カテゴリーに関しては、名前を直接日本語にできてしまっています。説明は空欄です。

みらのさん(以前は 
http://rebecca.ac/milano/mt/
にブログがあったのですが、今はアクセスできないようです)という方の作られた日本語化パッチを当てているのですが。

ちなみに、同様のエラー表示は、月ごとの更新をする時も出ます。

よろしくお願いします。

投稿者: 大津和行 投稿時刻: 2004年02月23日 07:00

みらのさんところの URL は変わってません。サーバが移転したんですが、どうもうまく DNS に反映されきってないようで、プロバイダによってはちゃんとアクセスできないみたいです。

カテゴリの名前を日本語でつけちゃうとカテゴリアーカイブのファイル名が予想もつかないような名前になるなど、弊害があるので、カテゴリの名前は英語でつけて、説明に日本語を使い、カテゴリ一覧には、カテゴリの名前ではなく、説明の方を使う、というテクニックが割と一般的です。

たぶん、カテゴリのリビルド用スクリプトがうまく動かないのは、カテゴリの名前に日本語を使っているから、という可能性が高いです。

月別の方もうまくいかないんですか? すぐには原因がわかりません。何か手がかりがあるといいんですが。

投稿者: tsupo 投稿時刻: 2004年02月24日 03:52

早速のお返事ありがとうございます。

 Categryのお話はよくわかりましたが・・・、月別の方もまったく同様のエラーメッセージが出ます。パーミッションの設定などが問題かもと色々試行錯誤していますが、なかなか・・・

 Categryの全部Rebuildができないだけなので、ブログは一応そのままにして今後も試行錯誤を続けようと思います。

 また、質問させて頂くこともあるかと思います。その際はよろしくお願いいたします。

 迅速なご回答に感謝しています。

 

投稿者: 大津和行 投稿時刻: 2004年02月26日 00:01

A really good website. Easy to use, quick to re-draw and no un-necessary detail per page. It really is good.

投稿者: inflatable mattress 投稿時刻: 2005年02月23日 08:52
コメントを投稿する
コメント投稿時に Internal Server Error と表示されることがありますが、ほとんどの場合、コメントの投稿はうまくいっています。このエラーが出たときは無視してください。









名前、アドレスを登録しますか?








Access Count:
Last Modified: Friday, 18-Apr-2008 05:28:25 JST

Google