このブログには google AdSense の広告が貼ってあるが、なるべく自然に見えるよう日の区切りごとに 1 つ、つまり MTDateFooter タグで囲んで貼りたいと考えた。
しかし、この広告には 1 ページにつき 3 つまでという制限があるので、そのままだと 4 つ以上表示されてしまう可能性がある。インデックスの表示期限を 3 日にすることも考えたが、更新頻度が低いのでヘタするとメインが空になってしまう。
そこで、MTDateFooter に N 回目まで有効、という属性をつけられないかと試してみた。はじめはプラグインでなんとかならないかと思ったが、いまいち理解できていないので、Context.pm を直接編集してしまうことにした。
MTDateFooter の挙動をそのまま真似て、新たに MTDateFooterN とうタグを作った。コードは以下のとおり。* から始まるのが変更/追加された行。
145行目付近
$ctx->register_handler(DateHeader => [ \&_hdlr_pass_tokens, 1 ]);
$ctx->register_handler(DateFooter => [ \&_hdlr_pass_tokens, 1 ]);
* $ctx->register_handler(DateFooterN => [ \&_hdlr_pass_tokens, 1 ]);
760行目付近
* my $maxFooters = $args->{'footern'};
* my $footerCnt = 0;
for my $e (@entries) {
?略?
if (defined $entries[$i+1]) {
$next_day = substr($entries[$i+1]->created_on, 0, 8);
$footer = $this_day ne $next_day;
* if ($this_day ne $next_day)
* $footerCnt ++;
} else {
$footer++;
* $footerCnt++;
}
my $allow_comments ||= 0;
my $out = $builder->build($ctx, $tok, {
%$cond,
DateHeader => ($this_day ne $last_day),
DateFooter => $footer,
* DateFooterN => $footer && $maxFooters && ($footerCnt <= $maxFooters),
?略?
使うときは次のようにする。
<MTEntries lastn="5" footern="3">
<MTDateHeader>
<div class="ABox">
</MTDateHeader>
<MTDateFooter>
</div>
</MTDateFooter>
<MTDateFooterN>
?ここに広告コード?
</MTDateFooterN>
</MTEntries>
これでめでたく現在のメインページのように、広告が 3 つに収まった。が、イマイチやり方が美しくない気もするので、出来ることなら代替案を見つけたい。