ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応)

ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応)

Posted at November 18,2008 12:55 AM
Tag:[Category, Entry, MovableType, Plugin]

ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」の Movable Type 4.2 版のプラグインを公開します。

元記事の内容は Movable Type 4.1 の内容であり、Movable Type 4.2 では前後リンクが正常に表示されない場合があります。

2009.01.05 追記:Movable Type 5.0 で動作することを確認しました。

1.プラグインの概要

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

ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」では、元のプラグイン「Previous and next in category」を修正する形で書いてましたが、修正箇所が多いため、プラグインファイルで公開します(ファイル内に元プラグインの著者を掲載しています)。

このプラグインは Movable Type 4.1 / 4.2 / 5.0 で動作することを確認しています。

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

下記の PreviousNextInCategory.zip をクリックして、プラグインアーカイブをダウンロード。

PreviousNextInCategory.zip

プラグイン開発やサポート等にご支援・ご賛同くださる方からの寄付をお待ち申し上げます。下記の「寄付」のリンクをクリックすると Paypal によるお支払いページにジャンプします。

3.PreviousNextInCategory プラグインのアップロード・インストール

プラグインアーカイブを展開し、中にある PreviousNextInCategory フォルダごと、Movable Type のアプリケーションディレクトリの plugins ディレクトリにアップロード。

システム管理画面のプラグイン一覧で、「PreviousNextInCategory ~」が表示されればインストール完了です。

プラグイン一覧

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

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

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

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

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

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

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

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

6.元プラグインの変更点

一応、元プラグイン 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);
    my $res = '';
        while ($prev && !$prev->is_in_category($cat)){
            $prev = $prev->previous(1);
    }
    if ($prev) {
        my $builder = $ctx->stash('builder');
        local $ctx->{__stash}->{entry} = $prev;
        local $ctx->{current_timestamp} = $prev->created_on;
        my %cond = %$cond;
        $cond{EntryIfAllowComments} = $prev->allow_comments;
        $cond{EntryIfCommentsOpen} = $prev->allow_comments eq '1';
        $cond{EntryIfAllowPings} = $prev->allow_pings;
        $cond{EntryIfExtended} = $prev->text_more ? 1 : 0;
        my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
        return $ctx->error( $builder->errstr ) unless defined $out;
        $res .= $out;
    }
    $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);
    my $res = '';
        while ($next && !$next->is_in_category($cat)){
            $next = $next->next(1);
    }
    if ($next) {
        my $builder = $ctx->stash('builder');
        local $ctx->{__stash}->{entry} = $next;
        local $ctx->{current_timestamp} = $next->created_on;
        my %cond = %$cond;
        $cond{EntryIfAllowComments} = $next->allow_comments;
        $cond{EntryIfCommentsOpen} = $next->allow_comments eq '1';
        $cond{EntryIfAllowPings} = $next->allow_pings;
        $cond{EntryIfExtended} = $next->text_more ? 1 : 0;
        my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
        return $ctx->error( $builder->errstr ) unless defined $out;
        $res .= $out;
    }
    $res;
}

4.2 対応の変更(赤色が 4.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 $terms;
    $terms->{category_id} = $cat->id;
    my $prev = $e->previous(1, $terms);
    my $res = '';
        while ($prev && !$prev->is_in_category($cat)){
            $terms->{category_id} = $cat->id;
            $prev = $prev->previous(1, $terms);
    }
    if ($prev) {
        my $builder = $ctx->stash('builder');
        local $ctx->{__stash}->{entry} = $prev;
        local $ctx->{current_timestamp} = $prev->created_on;
        my %cond = %$cond;
        $cond{EntryIfAllowComments} = $prev->allow_comments;
        $cond{EntryIfCommentsOpen} = $prev->allow_comments eq '1';
        $cond{EntryIfAllowPings} = $prev->allow_pings;
        $cond{EntryIfExtended} = $prev->text_more ? 1 : 0;
        my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
        return $ctx->error( $builder->errstr ) unless defined $out;
        $res .= $out;
    }
    $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 $terms;
    $terms->{category_id} = $cat->id;
    my $next = $e->next(1, $terms);
    my $res = '';
        while ($next && !$next->is_in_category($cat)){
            $terms->{category_id} = $cat->id;
            $next = $next->next(1, $terms);
    }
 
    if ($next) {
        my $builder = $ctx->stash('builder');
        local $ctx->{__stash}->{entry} = $next;
        local $ctx->{current_timestamp} = $next->created_on;
        my %cond = %$cond;
        $cond{EntryIfAllowComments} = $next->allow_comments;
        $cond{EntryIfCommentsOpen} = $next->allow_comments eq '1';
        $cond{EntryIfAllowPings} = $next->allow_pings;
        $cond{EntryIfExtended} = $next->text_more ? 1 : 0;
        my $out = $builder->build($ctx, $ctx->stash('tokens'), \%cond);
        return $ctx->error( $builder->errstr ) unless defined $out;
        $res .= $out;
    }
    $res;
}
関連記事
トラックバックURL


トラックバック

MTEntryNext,Previousの拡張(とか改良?とか)。 from Junnama Online (Mirror)
# 何回も書いてる気がするなぁ、これ。 小粋空間: ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2対応) ... [続きを読む]

Tracked on November 19, 2008 5:25 PM

ブログ記事に同一カテゴリーの前後リンクを表示する from Ubuntuでマルチメディア
小粋空間さんの「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」を... [続きを読む]

Tracked on January 8, 2009 11:15 PM

同一カテゴリで前後リンク+特定の記事のみ抜かす from ELLIPTiCUS
MTでまるまるひとつのサイトを作った時に、記事の前後にリンクは貼りたい。けれども、他のカテゴリーまで表示されるのは困る。って事多いですよね。<MTE... [続きを読む]

Tracked on March 23, 2010 8:06 PM

同カテゴリ内の前後記事へのリンク from 道化師ラッパンのぼやき
一応、記事の下には、前後の記事のリンクを貼ってあるんやけど、同カテゴリ内における前後の記事で表示させることにした。 またもやお世話になったのは小粋さん。... [続きを読む]

Tracked on March 24, 2010 3:40 PM

PreviousNextInCategoryかEntryPageNextPrevか from 裏バーチャル山中家
要は、 ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応) MTEntry... [続きを読む]

Tracked on June 10, 2013 11:00 PM
コメント

はじめまして。

このページにあるカテゴリー内のリンク生成をするプラグインを利用させていただいておりましたが、Movabletype 5に使用してみたところ、利用できないようでした。

管理人さんはどのように回避、または別の方法で同じことをできるようにしていますか?

[1] Posted by gimic : January 4, 2010 12:49 PM

>gimicさん
こんにちは。
ご質問の件ですが、オリジナルのプラグインは新しいMTでは正常に動作しないので、2項の「PreviousNextInCategory プラグインのダウンロード」にあるリンク(リファクタリングしたもの)からプラグインをダウンロードしてください。
MT5で正常に動作することを確認しました。
それではよろしくお願い致します。

[2] Posted by yujiro logo : January 5, 2010 12:46 PM

いつも参考にさせて頂いております。
このプラグインを使用してフォトアルバム的なものを作れないかと試行錯誤しております。
写真の枠を真ん中に置いて最新の写真をそこに表示させる、左右にPreviousとNextInを使用して、という形を想定しているのですが上手くいきませんT-T

そういった事は出来るでしょうか。
可能であればアドバイスを頂ければありがたいです。
よろしくお願い致します。

[3] Posted by MOMO : May 25, 2010 8:54 PM

たびたびすみません!
エントリーアーカイブの設定が間違えてました・・・
何とか自己解決し、思ったとおりのフォトアルバムが作れました!
お騒がせして申し訳ございませんm(_ _)m

[4] Posted by MOMO : May 25, 2010 9:35 PM

>MOMOさん
こんばんは。
ご連絡ありがとうございました。
ご質問の件、自己解決されたようで良かったです。
ではでは!

[5] Posted by yujiro logo : May 26, 2010 2:41 AM
コメントする
greeting

*必須

*必須(非表示)


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

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

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

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