6.12 ブログ記事に同一カテゴリのブログ記事の前後リンクを表示する ★
P.455
メインカテゴリに属するブログ記事の前後ナビゲーションを表示する
●サンプルテンプレートをカスタマイズする
「ブログ記事」アーカイブテンプレート(サンプルテンプレート)
...前略...
<div id="contents" class="clearfix">
<div id="main">
<div class="content-nav">
<mt:entryPreviousInCategory>
<a href="<mt:entryLink archive_type="Individual" />">« <mt:entryTitle encode_html="1" /></a> |
</mt:entryPreviousInCategory>
<a href="<mt:link template="main_index" />">メインページ</a> |
<a href="<mt:link template="archive_index" />">アーカイブ</a>
<mt:entryNextInCategory>
| <a href="<mt:entryLink archive_type="Individual" />"><mt:entryTitle encode_html="1" /> »</a>
</mt:entryNextInCategory>
</div>
<div class="content">
<h2 class="entry-header"><mt:entryTitle encode_html="1" /></h2>
...後略...
●デフォルトテンプレートをカスタマイズする
「ブログ記事」アーカイブテンプレート(デフォルトテンプレート)
...前略...
<div id="alpha">
<div id="alpha-inner">
<div class="content-nav">
...中略...
</div>
<div id="entry-<$MTEntryID$>" class="entry-asset asset hentry">
<div class="asset-header">
...後略...
全カテゴリに属するブログ記事の前後ナビゲーションを表示
●プラグインの修正
PreviousNextInCategory.pl
...前略...
sub _hdlr_entry_previous_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryPrevious');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $prev = $e->previous(1);
...中略...
}
$res;
}
sub _hdlr_entry_next_in_category {
my($ctx, $args, $cond) = @_;
my $e = $ctx->stash('entry')
or return $ctx->_no_entry_error('MTEntryNext');
my $cat = $e->category
or return '';
if($ctx->stash('category') ne '') {
$cat = $ctx->stash('category');
}
my $next = $e->next(1);
...中略...
}
$res;
}
...後略...
P.456
●テンプレートをカスタマイズする
「ブログ記事」アーカイブテンプレート(サンプルテンプレート)
...前略...
<div id="contents" class="clearfix">
<div id="main">
<div class="content-nav">
<mt:entryCategories>
<p>
<mt:entryPreviousInCategory>
<a href="<mt:entryLink archive_type="Individual" />">« <mt:entryTitle encode_html="1" /></a> |
</mt:entryPreviousInCategory>
<a href="<mt:link template="main_index" />">メインページ</a> |
<a href="<mt:link template="archive_index" />">アーカイブ</a>
<mt:entryNextInCategory>
| <a href="<mt:entryLink archive_type="Individual" />"><mt:entryTitle encode_html="1" /> »</a>
</mt:entryNextInCategory>
</p>
</mt:entryCategories>
</div>
<div class="content">
<h2 class="entry-header"><mt:entryTitle encode_html="1" /></h2>
...後略...
★「ブログ記事」アーカイブテンプレート(デフォルトテンプレート)
...前略...
001:<div id="alpha">
002: <div id="alpha-inner">
003: <div class="content-nav">
004: <mt:entryCategories>
005: <p>
006: <mt:entryPreviousInCategory>
007: <a href="<mt:entryLink archive_type="Individual" />">« <mt:entryTitle encode_html="1" /></a> |
008: </mt:entryPreviousInCategory>
009: <a href="<mt:link template="main_index" />">メインページ</a> |
010: <a href="<mt:link template="archive_index" />">アーカイブ</a>
011: <mt:entryNextInCategory>
012: | <a href="<mt:entryLink archive_type="Individual" />"><mt:entryTitle encode_html="1" /> »</a>
013: </mt:entryNextInCategory>
014: </p>
015: </mt:entryCategories>
016: </div>
017: <div id="entry-<$MTEntryID$>" class="entry-asset asset hentry">
018: <div class="asset-header">
...後略...
元のテンプレートに004~015を追加します。
P.457
前後記事の再構築をするカスタマイズ
PreviousNextInCategory.pl
package MT::Plugin::PreviousNextInCategory;
use strict;
use warnings;
use base qw( MT::Plugin );
use MT;
use MT::Template::Context;
my $plugin = MT::Plugin::PreviousNextInCategory->new({
id => 'PreviousNextInCategory',
name => 'PreviousNextInCategory',
});
MT->add_plugin($plugin);
MT::Template::Context->add_container_tag('EntryPreviousInCategory' => \&_hdlr_entry_previous_in_category);
MT::Template::Context->add_container_tag('EntryNextInCategory' => \&_hdlr_entry_next_in_category);
MT->add_callback('MT::App::CMS::CMSPostSave.entry', 10, $plugin,
sub { $plugin->runner('_rebuild', @_) } );
sub _rebuild {
my $plugin = shift;
my ($eh, $app, $entry) = @_;
my $cats = $entry->categories;
for my $cat (@$cats) {
my $prev = $entry->previous(1);
while ($prev && !$prev->is_in_category($cat)) {
$prev = $prev->previous(1);
}
$app->rebuild_entry(Entry => $prev->id) if $prev;
my $next = $entry->next(1);
while ($next && !$next->is_in_category($cat)) {
$next = $next->next(1);
}
$app->rebuild_entry(Entry => $next->id) if $next;
}
return 1;
}
sub runner {
my $plugin = shift;
my $method = shift;
return $_->($plugin, @_) if $_ = \&{"$method"};
}
sub _hdlr_entry_previous_in_category {
...中略...
}
sub _hdlr_entry_next_in_category {
...中略...
}
1;