top

カテゴリーを好きな順番で並べる(4) sort_method編

カテゴリ並び替えへのコメントをいただいた時、ふと思い出したので、カテゴリ並び替えには他にこんな方法もありますよ、てことでちょっとメモ。これ、実は3.3以前から存在するけっこう昔からある技なんです。

カテゴリの並べ替えには皆さん苦労されてるようですが、実はMTにはカテゴリを好きな順番で並び変える方法がデフォルトで用意されていたことはご存知でしょうか。出典はMovable Type例解テンプレートタグ辞典より。

■基本編
以下の内容でファイルを作り、CategorySort.pmという名前にします。これをMT本体のextlib以下にアップします。

package CategorySort;
my %category_priorities = (
'カテゴリ名C' => 1,
'サブカテゴリ名C-2' => 01,
'サブカテゴリ名C-1' => 02,
'カテゴリ名B' => 2,
'カテゴリ名A' => 3,
);
sub cat_sort ($$) {
my ($a, $b) = @_;
my $a_pri = $category_priorities{$a->label} || 1000;
my $b_pri = $category_priorities{$b->label} || 1000;
unless ($a_pri == 1000 && $b_pri == 1000) {
return $a_pri <=> $b_pri;
}
return $a->label cmp $b->label;
}

以下のMTタグに赤字の部分を追加。

<MTTopLevelCategories sort_method="CategorySort::cat_sort">

すると青字の番号で指定した通りの順番で並びます。この例だと、

カテゴリ名C
 サブカテゴリ名C-2
 サブカテゴリ名C-1
カテゴリ名B
カテゴリ名A

こんな感じの順番で並びます。またこの数字順はトップレベルカテゴリどうし、サブカテゴリどうしで機能しますから、それぞれに順を指定することが出来ます。

☆MTのタグリファレンスではMTSubCategoriesのモディファイアとして載っていますが、MTTopLevelCategoriesでも使えます(けど使い方の説明が具体的に書いてないので、これではよく分からないですよねえ)。

■応用編
本によるとカテゴリ名が日本語では上手くいかないこともあるようなことが書かれてます(私が試した範囲では問題なく動作しましたが)。もしそういう場合は、カテゴリ名ではなく、カテゴリのベースネームで並び変えることもできます。
以下は基本編を自分なりにアレンジしたものです。といっても「label」を「basename」で置き換えただけなんですが。カテゴリ名の部分はベースネーム(ファイル名)にします。

package CategorySort;
my %category_priorities = (
'cat2' => 1,
'cat4' => 01,
'cat3' => 02,
'mt' => 2,
'cat1' => 3,
);
sub cat_sort ($$) {
my ($a, $b) = @_;
my $a_pri = $category_priorities{$a->basename} || 1000;
my $b_pri = $category_priorities{$b->basename} || 1000;
unless ($a_pri == 1000 && $b_pri == 1000) {
return $a_pri <=> $b_pri;
}
return $a->basename cmp $b->basename;
}

ベースネームは自分で設定している場合は設定した名前を記入。MT任せの場合はカテゴリ一覧や出力ファイル名で確認して下さい(日本語名はcat1など、英数混じりはカテゴリ名の英数字部分になっていると思います)。

なお、CategorySort.pmやsort_method="CategorySort::cat_sort"で使われているCategorySortの文字列ですが、ファイル名・ファイルの中の1行目・sort_method内に使われる名前の3か所を同じ文字列にして統一しておけば、CategorySortでもCatSortでも何でもいいようです。

で、なんでカテゴリの並び替えがこういう方法で出来ることに気付きながら、半角法だとかデコード法だとかを使って苦労していたかというと。実はこの技、

ダイナミック・パブリッシングでは動かないんですorz。

つまりダイナミック派には存在しないも同じ技だったわけでして(汗)。

てことで私的には圏外技のためこれまで触れてこなかったのですが、何かの役に立つこともあるかもしれない、ということで覚え書きしておきます(^^;。

 

コメント

もしかしてなんですが、

http://blog.webcreativepark.net/2008/03/24-153609.html
ダイナミックパブリッシング環境でSortCatFldプラグインを利用する。[to-R]

この手で、使えちゃったりしないですかね?

情報ありがとうございます。
…が、試してみたけど動きませんでした…(何も表示されなくなりました)。残念。
sort_methodってプラグイン作りにもよく利用されてるみたいですね。