2004
08.15

カテゴリー内前後移動リンク作成

日記

なかよしこよし: 同一カテゴリー内で記事の前後移動

MTの場合、普通に「記事の前後移動」は出来るが
「同一カテゴリー内の記事」に限定しての前後移動は出来ない。
そこで
nlog(n)様:同一カテゴリの前後ナビゲーションと自動再構築
を参考にして構築してみた。

MOVABLETYPEの基本機能として、記事別に単体で表示している時に、上部に

<前の記事>| メイン |<前の記事>

というリンクが生成されますよね。これって便利なんですけれど、カテゴリーから見に行った記事でも単純に作成された順番の記事のリンクなのです。
つまり、カテゴリーから選択して記事を見ているときには当然、カテゴリー内の前後の記事にリンクしたいのですけれど、それが出来ていないのです。
そこで、どうにか出来ないのかと、探していたのですが、どうやら標準のMOVABLETYPEでは無理のようです。そう言う要望に応える、プラグインが出ている。これを使ってみることにした。


1.「PreviousNextInCategory」とというplug-inのダウンロード。

まず、「phil ringnalda dot com」サイトから「Previous and next in category」plug-inをダウンロードします。英語なので、さっぱりわかりませんが、ひとまずダウンロードしましょう。
(^^ゞ

最初説明文の

「I’m not sure how generally useful this is, but if you need it, it may be close to what you need. PreviousNextInCategory is a plugin that adds two container tags, <MTEntryPreviousInCategory> and <MTEntryNextInCategory> that work just like the <MTEntryPrevious> and <MTEntryNext> tags, except that they give you the previous and next entries that are in the same category as the primary category of the current entry.」

の下線部分にあります。

2.解凍しましょう。

ダウンロードしたファイルはZIP圧縮されているので、解凍しましょう。
解凍すると

PreviousNextInCategory.pl

というファイルが作られます。

3.パッチをしましょう!

「なかよしこよし」さんサイトで紹介されているパッチをしましょう(情報公開をありがとうございます)。
解凍した、「PreviousNextInCategory.pl」に以下の、下線部分のロジックを追加します。

sub _hdlr_entry_previous_in_category {

my $cat = $e->category
or return ”;
if ($ctx->stash(‘category’) ne ”) {$cat = $ctx->stash(‘category’);}
my $prev = $e->previous(1);

}

sub _hdlr_entry_next_in_category {

my $cat = $e->category
or return ”;
if ($ctx->stash(‘category’) ne ”) {$cat = $ctx->stash(‘category’);}
my $next = $e->next(1);

}

続いて、これに合わせて「MTPath/lib/MT.pm」にも以下の下線部分のロジックの追加をします。

return 1 unless $param{BuildDependencies};

my $cats = $entry->categories;
# previous
for my $cat (@$cats) {
my $prev = $entry->previous(1);
if ($prev && !$prev->is_in_category($cat)){
do {
$prev = $prev->previous(1);
} while ($prev && !$prev->is_in_category($cat));
if ($prev) {
$mt->_rebuild_entry_archive_type(Entry => $prev,
Blog => $blog,
ArchiveType => ‘Individual’)
or die $mt->errstr;
}
}
# next
my $next = $entry->next(1);
if ($next && !$next->is_in_category($cat)){
do {
$next = $next->next(1);
} while ($next && !$next->is_in_category($cat));
if ($next) {
$mt->_rebuild_entry_archive_type(Entry => $next,
Blog => $blog,
ArchiveType => ‘Individual’)
or die $mt->errstr;
}
}
}

## Rebuild previous and next entry archive pages.

「Individual Entry Archive」を環境に合わせて以下のようなパッチをして下さい。

<span>
<MTEntryCategories>
<br /><MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink category_type="Individual"$>"
title="このカテゴリの前の記事">«<$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryLabel$>の記事一覧"><strong><$MTCategoryLabel$></strong></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink category_type="Individual"$>"
title="このカテゴリの次の記事"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
</MTEntryCategories>
</span>

パッチしたファイルをサーバー側で更新します。
「PreviousNextInCategory.pl」は「MTPath/plugins」の中にアップします。

3.リビルドしましょう。

さて、今までの修正やアップロードの場所に間違いがなければ、リビルドしていましょう。すると、うちのサイトのようにカテゴリー間の前後へのリンクが追加されると思います。

※ちょいと、リビルドが遅くなったかな?まあ、しょうがないかな?

  • りんもん

    そうですね。
    改造するときは僕は、コメントを入れるようにしています。
    コメントする際に自分のニックネームを入れておいて後で、検索して見つけられるようにしていますよ。
    リビルドは、以前のバージョンだとコメント時にもされていたので遅さが気になりますが、3.0からは、コメントの処理は許可制にしたから、ちょっとはましかな。

  • こだるま

    はじめまして♪
    やはりリビルドが遅くなりました?
    前後の記事も一緒にリビルドしますので、仕方ないのかも知れませんねぇ。
    うちのほうにも追記で書いておいたのですが
    プラグインの使用をやめるときには
    MT.pmに施した改造は元に戻しておいたほうがいいですね~!