August 21, 2004

mt-favorite-entries プラグインで「よりぬき NDO::Weblog」

[ Movable Type ]

ふとアクセスログを見ていたらとあるキーワードで Yahoo! Japan、MSN からの検索経由でのトラフィックがたくさん来ていました。ところがその検索結果、個別の記事、つまり permalink へのリンクではなくて Main Index へのリンクになっていました。

このままだと、検索エンジンで検索してトップページに来たけど、肝心の話題がすでに流れてしまって見つからない、ということになってしまいます。そこで、トップページに「よりぬき NDO::Weblog」というコーナーを用意して、検索エンジン経由の閲覧者向けのナビゲーションを行ってみました。

ログを見ていると、しっかり「検索エンジンで検索 → トップページ → よりぬきコーナーから個別の記事へ」という導線が描けているようです。

この「よりぬき」コーナーですが、テンプレートに HTML 直書きというのも何なので、指定したエントリIDの記事を抜き出し、Movable Type テンプレートタグで定義するようにしました。そこで、プラグイン Hack。

# $Id: mt-favorite-entries.pl,v 1.8 2004/08/20 19:51:44 naoya Exp $
package MT::Plugin::FavoriteEntries;
 
use strict;
use warnings;
use MT::Template::Context;
 
our $VERSION = 0.01;
 
## for Movable Type 3.0
if (MT->can('add_plugin')) {
    require MT::Plugin;
    my $plugin = MT::Plugin->new;
    $plugin->name("Favorite Entries Plugin " . $VERSION);
    $plugin->description("You can choice your favorite entries and show them.");
    MT->add_plugin($plugin);
}
 
MT::Template::Context->add_container_tag(FavoriteEntries => \&favorite_entries);
 
sub favorite_entries {
    my ($ctx, $args) = @_;
    my $content = '';
    my $builder = $ctx->stash('builder');
    my $tokens  = $ctx->stash('tokens');
    my @entries_id = map { s/\s+//g; $_ } split(/,/, $args->{favorite_entries});
    for my $e (map { MT::Entry->load($_) } @entries_id) {
	my $saved_entry = $ctx->stash('entry'); # Hack
 
	$ctx->stash('entry', $e);
	local $ctx->{current_timestamp} = $e->created_on;
	local $ctx->{modification_timestamp} = $e->modified_on;
	defined(my $out = $builder->build($ctx, $tokens))
	    or return $ctx->error($builder->errstr);
	$content .= $out;
 
	$ctx->stash('entry', $saved_entry);
    }
    $content;
}
 
1;

このプラグインは、好みのエントリを抽出するコンテナタグ <MTFavoriteEntries> 〜 </MTFavoriteEntries> を使えるようにするもの。エントリIDは favorite_entries オプションで指定します。このコンテナタグの中では <$MTEntryTitle$> などの、標準のエントリ関連タグが使えるところがポイントです。

<MTFavoriteEntries favorite_entries="1,2,3">
<a href="<$MTEntryPermalink>"><$MTEntryTitle$></a><br />
</MTFavoriteEntries>

といった具合で。こういった感じでよりぬきコーナーのテンプレートを定義して、テンプレートモジュールにし Main Index から Include してあります。

ちとエントリIDを属性で定義するあたりの仕様がしょぼいので、管理用のCGIでも作ってそれと連携させるのもいいかなと思ったのですが、めんどくさくてやめました。

プラグインコードのミソは、ロードした MT::Entry オブジェクトを stash に保存する際、ラベル (stash の第一引数) を 'entry' にしているころ。ラベルを 'entry' にすると、コンテナでのループに対してMT::Template::Context で定義されている一連のハンドラが呼び出され、自分でタイトルを表示するタグとかリンクを表示するタグといったものを定義する必要がなく、MTEntries コンテナタグ内で使えるタグが利用できます。

ただし、単に stash のラベルを entry にしただけだと、Movable Type がもともと内部で保持していた MT::Entry オブジェクトを上書してしまうので、一度テンポラリ ($saved_entry) に保存して、用が済んだら戻してやるということをしています。

Posted by naoya at August 21, 2004 12:01 PM | トラックバック (4)  b_entry.gif
トラックバック [4件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/1194
おすすめ記事リストをつけてみました
Excerpt: ブログではどうしても古い記事が奥に行ってしまうため、読まれにくくなります。このブログがどんなブログなのかを端的に伝えるためにも、おすすめ記事を出してみたいなと以...
Weblog: 小林Scrap Book
Tracked: August 22, 2004 08:51 PM
おすすめ記事つけてみる
Excerpt: NDO::Weblogさんのmt-favorite-entries プラグインで...
Weblog: Magic White
Tracked: September 14, 2004 03:17 AM
特定のEntryIDの記事だけを抜き出すPlugin
Excerpt: こんなん見つけてみました。 >特定のEntryIDの記事だけを抜き出すPlugi...
Weblog: New White - Blog
Tracked: June 15, 2005 01:07 AM
オンラインソフトの発表の場としてのウェブログ
Excerpt:  ここ数年、ブログブーム(?)でウェブログ(Weblog、以下、ブログ)形式のサ...
Weblog: Open MagicVox
Tracked: August 3, 2005 10:57 AM
コメント [4件]

ブラウザでページ開いてすぐに最新エントリが見えないのがちょっと不便です

[1] Posted by: アセテート at August 21, 2004 01:34 PM [返信]

検索エンジンからきたときだけでるように、

if (document.referrer.match(/(yahoo|google|msn)/)) {
document.write('...');
}

ってかこってやるといいかも。

[2] Posted by: miyagawa at August 21, 2004 01:37 PM [返信]

やってみた。 > javascript

単価の高い広告がでてるエントリを露出するという目的もあったので、このまま続行するかはちょっと考え中...

件数多すぎたかな。

[3] Posted by: naoya at August 21, 2004 03:45 PM [返信]

やっぱり二件にしてみました。

もちっとやり方考えよう。

[4] Posted by: naoya at August 21, 2004 03:59 PM [返信]
コメントする









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