ふとアクセスログを見ていたらとあるキーワードで 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) に保存して、用が済んだら戻してやるということをしています。
検索エンジンからきたときだけでるように、
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 [返信]