≪HOME(21世紀のアフィリエイト通販生活)

個別アーカイブに同カテゴリへの前後リンクを設置~MovableType

MovableType標準では個別アーカイブに<MTEntryPrevious>や<MTEntryNext>などのテンプレートタグを使って、時系列にのっとった前後記事へのリンクが付いています。

しかしカテゴリ分けして新エントリーを書いていく以上、前後記事ってのは必ずしも同一カテゴリの記事ではありません。

これについて何とかならないかとぼんやり思っていると、やっぱり世の中には同じ事を考える人って居るもんですね。色んなサイトを参考にチャレンジしてみました。

参考にさせて貰ったのはこちらです。感謝感謝です!m(_"_)m
同一カテゴリの前後の記事へのリンクを表示と自動再構築 ~HiLOG
同一カテゴリの前後ナビゲーションと自動再構築 ~nlog(n)
カテゴリ内の次・前リンク ~Play with Weblog!
同一カテゴリーの前後記事を個別ページに表示 ~アフィリエイトは我が魂に及び
同一カテゴリー内で記事の前後移動 ~なかよしこよし
複数Categoryなページめくりの再構築(プラグインありなし判定) ~Ruby site

今回やりたい事のまとめ

☆個別ページでの同一カテゴリ内への前後移動。
☆個別ページでの前後移動のリンクタイトル数を増やす。標準では前後に各一つずつ。

使用するプラグインは以下の二つです。
PreviousNextInCategory ~ 個別ページで同一カテゴリへの前後ナビゲーションを設置できます。
Again Plugin ~ 個別ページで前後リンクのタイトル数を増やせます。

ただし、PreviousNextInCategoryプラグインはそのままでは複数カテゴリに対応してないので、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');}

終わったら各プラグインをpluginsフォルダにアップします。

次に個別アーカイブに同一カテゴリ内への前後リンクを表示させる為に以下のコードを挿入します。エントリーが属するカテゴリ情報を表示させる為に、全体を<MTEntryCategories>で囲みます。また<MTAgain limit="3">では前後リンクの数を調整できます。

<MTEntryCategories>
▽カテゴリ<a href="<$MTCategoryArchiveLink$>">[<$MTCategoryLabel pmhc=""$>]</a>内の前後の記事<br />
<MTAgain limit="3">
<MTEntryNextInCategory>
<$MTAgainHere$>
↑ <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTEntryNextInCategory>
</MTAgain>

→ <$MTEntryTitle$><br />

<MTAgain limit="3">
<MTEntryPreviousInCategory>
↓ <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
<br />
<$MTAgainHere$>
</MTEntryPreviousInCategory>
</MTAgain>
</MTEntryCategories>
≪<a href="<$MTBlogURL$>">HOME</a>

これで終了と言いたい所ですが、このままでは新エントリーを投稿した時に、カテゴリ内の1つ前の記事は再構築されない、という重大な問題があります。つまりカテゴリ内で1つ前の記事からのリンクは更新されず、機能しないというトラブルが発生します。まぁ手動で別途再構築すれば済む話ですが正直面倒です。

これを解決する為に、lib/MT.pmを開き以下の修正を加えます。以下の修正はHiLOGさんの同一カテゴリの前後の記事へのリンクを表示と自動再構築を参考にしました。ちなみに以下は前後3つの記事を自動再構築する為の修正です。

return 1 unless $param{BuildDependencies};
#この下に次のコードを挿入します。
my $cats = $entry->categories;
for my $cat (@$cats) {
# previous 1
my $prev = $entry->previous(1);
if ($prev) {
if (!$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;
}
}
# previous 2
if ($prev) {
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;
# previous 3
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 1
my $next = $entry->next(1);
if ($next) {
if (!$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;
}
}
# next 2
if ($next) {
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;
# next 3
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;
}
}
}
}

これで終了です。但しlib/MT.pmを以上のように修正すると、PreviousNextInCategoryプラグインを使ってなくても、同カテゴリの前後の記事を自動再構築してしまいます。同プラグインを外す時は、元に戻すのを忘れないようにしましょう。

追記:
MT3.2以降では、lib/MT.pm ではなく /lib/MT/WeblogPublisher.pm を修正します。191行目あたりに、下記記述があるので、その下に丸々上記コードをコピペします。

return 1 unless $param{BuildDependencies} || $param{BuildIndexes} ||
$param{BuildArchives};
#ここに入れる!

全部完了して思ったのは、全体の再構築時間が増えてしまったのは正直マイナスでした。(MovableType 3.20以降では改善!)
ただ訪問者にとっては、こちらの方が優しいナビになっていると思います(思いたいです)。

投稿者 Locutus : 2005年02月09日 17:44 EDIT   カテゴリ⇒ MovableTypeカスタマイズ

この記事のトラックバックURL :
トラックバック

[HP製作]PreviousNextInCategoryプラグイン導入方法 from アロハカメラ@はてな
http://www.55link.com/archives/2005/02/09-1744.html [続きを読む]

トラックバック時刻: 2005年10月18日 18:07

同一カテゴリ内の前後の記事へのリンクを張る from iandeth.
個別アーカイブページ(各エントリ記事)にて、<MTEntryNext>や<MTEntryPrevious>タグによる投稿日付順の次... [続きを読む]

トラックバック時刻: 2005年11月15日 03:17

MTのエントリーアーカイブの前後リンク。 from Fake iTunes Feat.SITE159 Base Designed by APPLE
個別アーカイブに同カテゴリへの前後リンクを設置~MovableType まあ、前... [続きを読む]

トラックバック時刻: 2006年03月08日 13:06

≪HOME(21世紀のアフィリエイト通販生活)

王冠 ナンバー1の稼ぎ頭 王冠

エーハチ・ネット

一番複数サイトがある場合は、同じアカウントのまま簡単追加!広告コード取得が簡単なのでも有名です。

最近の記事
エックスサーバーのメリット
エックスサーバーのデメリット
エックスサーバーがMovableTypeのインストールマニュアルを公開
ノートン・インターネットセキュリティ
レッチリ~ダニー カリフォルニア♪
最近のトラックバック&コメント
カテゴリー
月別アーカイブ[過去記事]
BlogPeople
自分のリンクリストに登録する!
ブログ作成・お役立ちリンク
ブログの記事&タイトル考察リンク