Entryの並べ替えのキーに"keywords"は指定できるか?
<MTEntries sort_by="keywords" sort_order="ascend">
<$MTEntryTitle$>
</MTEntries>
ってのは効くのか? マニュアルには excerpt には対応しているとの記述があるが...
ということで MT::Template::ContextHandlers.pm の _hdlr_entries を眺めていたのだが、excerpt は良くて keywords が駄目ってところがどう見てもないような...じゃぁ、Entry.pm で excerpt だけインデックス指定されているのかというと...そうでもない。
じゃぁ、やっちまえってことで実験。効いているようだ。
何故 excerpt じゃだめかというと、ちゃんと理由があるのだ。
並べ替えのキーになるフィールドにコメントタグを入れて番号を振っていこうとしていたんだけど問題が2つあって1つめは「<$MTEntryTrackbackData$>」の中に 「dc:description=excerpt」という感じで概要が入るのだが、これに並べ替えのためのコメントが入ってしまう点。もう一つはエントリーからトラックバックを送る際に、こちら側のエントリーの概要がコメントタグになってしまう点。
title でも同じことがひっかかるし、日付は日付でちゃんと持っていたいし...ということで上述のように keywords でやってみたらちゃんと並べ替えられるじゃないか...というヲチ。
テンプレートタグやハンドラの上書きは可能か?
キーワードで並べ替えられるのはいいとして、今度はこの並べ替えのためのコメントが出力されなくなるようにする方法について。
まず、思いつくのはグローバルフィルターを書いてちょん切ってやるやり方。
以下のようなプラグインを書いて remove_num="1" を追加する。
# <$MTEntryKeywords remove_num="1"$>
# ex : <!--item-sort-0001--> => ""
MT::Template::Context->add_global_filter(remove_num => ¥&_Remove_Num);
sub _Remove_Num {
my $text = shift;
my $beg = quotemeta('<!--item-sort-');
my $end = quotemeta('-->');
$text =~ s/^$beg[0-9]{4}?$end//;
return $text;
}
ところが、「テンプレート書き換えるのが面倒」みたいな話が出て来て(どこでだよ?)、以下のようにすると優先されるようだ。でも思いっきり非推薦、自己責任というか、こういうノウハウって開発元の方には嫌がられるだろうから、あくまでもメモです。良い子は真似しないこと。
MT::Template::Context->add_tag(EntryKeywords => ¥&_Alt_EntryKeywords);
アプリケーションの「__mode」を追加する, 上書きする
今まではよく分かっていなくて Transformer プラグイン でテンプレートが呼び出される時に無理矢理違う動作をさせていたんだけど「オリジナルの__mode が追加できる」とリファレンスにもあるのでやってみた。
sub init_app {
my $plugin = shift;
my ($app) = @_;
return unless $app->isa('MT::App::CMS');
$app->add_methods(itemsort => ¥&_Itemsort);
}
として、mt.cgi?__mode=itemsort&blog_id=1 とかすると、あら動いたわ。
ついでに、既に指定されている __mode をプラグインで指定してやるとどうか。
$app->add_methods(ping => ¥&_Alt_Ping);
上書き(プラグインで書いたものが優先)されるようだ。これも嫌がられる感じがするので良い子は真似しないこと(<=もうええわ!)。
カテゴリー: MovableType


コメント (3)
読者です。
この変更によって、フィードのフォーマットが不正になってしまい、フィードリーダーでこのエントリ以降の更新を確認することができない状態になっています。
具体的には category 要素の term 属性値が CDATA セクションにエスケープされてしまってます。( 属性値で CDATA セクションは利用できません。)
今後も読み続けたいので、対処していただけると嬉しいです。よろしくお願いします。
投稿者: drry | 2007年05月11日 03:26
日時: 2007年05月11日 03:26
>具体的には category 要素の term 属性値が CDATA セクションにエスケープされてしまってます。
encode_xmlの挙動みたいですね...
修正したつもりですがいかがでしょう。
ついでに、AdSenseとか鬱陶しいかと思うのでフィードからスクリプトとコメント(ついでにonmousedown, onmouseup, onclick, onmouseover, onmouseout属性も)を削除してみました。
投稿者: Junnama | 2007年05月11日 11:09
日時: 2007年05月11日 11:09
確認できました。対応ありがとうございます。
JavaScript のイベントハンドラは JavaScript のために JavaScript によって追加して、XHTML には直接記述しない方法もありますね。
投稿者: drry | 2007年05月12日 05:10
日時: 2007年05月12日 05:10