ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する

ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する

Posted at March 21,2008 2:55 AM
Tag:[Category, Customize, Entry, MovableType, Plugin]

Movable Type で、ブログ記事の前後のブログ記事へのリンクを、直近のブログ記事ではなく、同一カテゴリーのブログ記事を表示するカスタマイズです。

2008.11.18 Movable Type 4.2 対応の記事を公開しました。

下の画面の、ブログ記事タイトル上にある前後リンクは、分かりにくいですが、同一カテゴリーのブログ記事です。

ブログ記事の前後のブログ記事へのリンクを同一カテゴリーに絞る

また、ブログ記事に複数カテゴリーを設定している場合は、すべてのカテゴリーの前後リンクも表示します(こんなに表示するのもどうかと思いますが...)。

ブログ記事の前後のブログ記事へのリンクを同一カテゴリーに絞る

以下、カスタマイズ方法です。

1.プラグインのダウンロード

Previous and next in category のサイトに進み、「PreviousNextInCategory」のリンクをクリック。

ブログ記事の前後のブログ記事へのリンクを同一カテゴリーに絞る

2.プラグインのインストール

ダウンロードした PreviousNextInCategory.zip を解凍して、PreviousNextInCategory.pl をpluginsディレクトリにアップロードします。
ブログ管理画面より、「システムメニュー」→「プラグイン」で「PreviousNextInCategory.pl」が表示されればインストール完了です。

ブログ記事の前後のブログ記事へのリンクを同一カテゴリーに絞る

3.プライマリカテゴリーに属するブログ記事のみを表示する場合

ブログ記事アーカイブの任意の位置に下記のサブテンプレートを設定してください。

<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> | 
</MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink archive_type="Category"$>"><$MTEntryCategory$></a>
<MTEntryNextInCategory>
 | <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>

ブログ記事アーカイブを再構築すれば、冒頭のように、同一カテゴリーの前後記事リンクが表示されます。

4.ブログ記事に登録されているすべてのカテゴリーに属するブログ記事を表示する場合

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 '';
    my $prev = $e->previous(1);
     :
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 '';
    my $next = $e->next(1);
     :

の部分に下記の青色の行を追加します。

     :
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);
     :
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);
     :

ブログ記事アーカイブの任意の位置に下記のサブテンプレートを設定してください。

<MTEntryCategories>
<p>
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> | 
</MTEntryPreviousInCategory>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
<MTEntryNextInCategory>
 | <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a>
</MTEntryNextInCategory>
</p>
</MTEntryCategories>

ブログ記事アーカイブを再構築すれば、ブログ記事が属する全カテゴリーの前後記事リンクが表示されます。

5.前後記事の再構築をする

上記の設定だけでは、ブログ記事投稿時に同一カテゴリーの前後記事が再構築されないという問題があります。

ということで、一応、MT4対応のプラグインを作ってみました。

PreviousNextInCategory.zip

元プラグインをかなり改変してしまったので、上記のファイルをダウンロードしたら、元プラグインにある、

_hdlr_entry_previous_in_category
_hdlr_entry_next_in_category

を埋め込んでください(複数カテゴリーに対応させる場合は4項のカスタマイズも行ってください)。
具体的な作業は、ダウンロードしたファイルの最後の方に簡単な説明を入れてますので、それを読んでください。

複数のカテゴリーを設定したブログ記事でも、前後リンクのブログ記事はすべて再構築されます。

なお、再構築は同じカテゴリーのブログ記事を検索するという、元記事のロジックをそのまま使わせてもらってますが、パフォーマンスの問題を解消する改善策がありましたらご教示ください。

6.参考記事

このエントリーは下記の記事を参考にさせていただきました。ありがとうございました。

関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

進め!MovableType4 カテゴリ前後リンク from 笑むなAikoの『お玉杓子は飲み物です』
世の中「あると便利なもの」は多いですが、これは「無いと不便なもの」。そんなプラグインです。 [続きを読む]

Tracked on March 23, 2008 7:04 AM

MTで同一カテゴリーの前後のエントリー(記事)を表示する from CSS Lecture
Movable Type で、ブログ記事の前後へのリンクはプラグインは必要ないのですが、同一カテゴリーのブログ記事を表示するには今回紹介するPreviou... [続きを読む]

Tracked on September 29, 2008 3:51 PM
コメント

いつもお世話になっています。

以前から PreviousNextInCategory.plを使わせていただいていて、ブログ記事の再構築か全記事を保存しない限り、このリンクが中途半端に切れていたためとても不便に思っていました。

早速、試させていただきました。

昨日投稿した記事を保存しましたら、14日離れている同一カテゴリの前記事の前後リンクが更新されました。
有難うございます。本当に助かりました(^^)V。

ちなみに…

_hdlr_entry_previous_in_category
_hdlr_entry_next_in_category

への追加ですが、

> :
>元プラグインの_hdlr_entry_previous_in_categoryを記述
> :

「:」も含めてカットし、この部分に挿入で構わないのですね?。私はカットしちゃいましたが動いてますので問題ないかと思いましたが、同じように戸惑う方もいらっしゃるかもと、質問させて頂きます。もう一点、オリジナルには[ 1;]が最終行にありませんが、これは残したままが宜しい訳ですね?。プラグインの中身まで詳しく分かりませんので、周知の質問でしたら済みません。

[1] Posted by aiko_m logo : March 21, 2008 8:08 AM

この記事をエントリーしてくださってありがとうございます。
あらためて、感謝です。

前後の記事の再構築についてはよくわからなかったので、
ちょっと面倒でも、その都度再構築しようと思っていたので、
さらに助かります。
ほんとうにありがとうございます。

ただ、私も、

「元プラグインをかなり改変してしまったので、上記のファイルをダウンロードしたら元プラグインにある、

_hdlr_entry_previous_in_category
_hdlr_entry_next_in_category

を埋め込んでください(複数カテゴリーに対応させる場合は4項のカスタマイズも行ってください)。複数のカテゴリーを設定したブログ記事でも、前後リンクのブログ記事はすべて再構築されます。」

の部分がちゃんと理解できなくて…。

お忙しいところお手数をかけて申しわけないのですが、
もう少し具体的に説明していただけないでしょうか。

すみません。よろしくお願いします。

[2] Posted by saeko logo : March 21, 2008 2:50 PM

saekoさん初めまして、私がコメントして良いのか分かりませんが、解凍された PreviousNextInCategory.pl
の以下の部分(2箇所あります)、


sub _hdlr_entry_previous_in_category {
:
元プラグインの_hdlr_entry_previous_in_categoryを記述
:
}

「元プラグインの_hdlr_entry_previous_in_categoryを記述」の場所に、オリジナルのPreviousNextInCategory.plからコピーした同じ部分を「{」「}」の間にペーストするだけです。私は前後の「:」も取っちゃいましたが、記事を拝見すると残しておくみたいですね。

その後、オリジナルと入れ替えFTPして元のフォルダに入れるだけでOKです。
もし既に「前後リンクへのカスタマイズ」がお済みで、複数カテゴリーを対象としないのでしたら、プラグインを入れ換えるだけで動作します。

[3] Posted by aiko_m logo : March 22, 2008 1:54 AM

aiko_mさん、ありがとうございました。

無事、プラグインを設定できました!

はじめ、「:」を取り除かないままでFTPしたら、
「読み込みに失敗しました」というエラーが出てしまって、
今度はaiko_mさんと同じように「:」を取っちゃったら、
ちゃんと読み込んでくれました。

やっぱり「:」は要らないということでしょうか。

とにもかくにも、
前後の再構築の部分についてのカスタマイズは、
よくわからずに、「手動で再構築すればいいかな」なんてあきらめかけていたので、
ほんとうに助かりました。

yujiroさん、
aiko_mさん、
ありがとうございます!

[4] Posted by saeko logo : March 22, 2008 6:56 PM

>aiko_mさん
>saekoさん
こんばんは。
ご指摘の箇所につきましては記述を修正いたしました(「:」は前後の行の省略を意味するつもりで書いたのですが、紛らわしいようなので削除しました)。
再度ご確認頂ければ幸いです。

とりあえずうまくできたようでよかったです。
それではよろしくお願い致します。

[5] Posted by yujiro logo : March 22, 2008 9:58 PM

はじめまして。
現在MovableType4.1を使っているのですが、
MTEntryPreviousInCategoryなどの、
MTEntry~のタグを使おうとすると、必ずコンテキスト外で使っていないか、とエラーになってしまいます。
これは仕様なのでしょうか、もしくはテンプレートの挿入位置になにか問題があるのでしょうか。
お忙しいところ、お手数をおかけして申し訳ありませんが、どうか教えていただけないでしょうか。よろしくお願いいたします。

[6] Posted by haru : May 29, 2008 2:50 AM

>haruさん
こんにちは。
ご返事遅くなってすいません。
ご質問の件ですが、エラーからはテンプレートの挿入位置に問題があるように思われます。
どのテンプレートでどのようなサブテンプレートをお使いかお知らせください。
それではよろしくお願いいたします。

[7] Posted by yujiro logo : July 2, 2008 12:57 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)