ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応)
「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」の 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 をクリックして、プラグインアーカイブをダウンロード。
プラグイン開発やサポート等にご支援・ご賛同くださる方からの寄付をお待ち申し上げます。下記の「寄付」のリンクをクリックすると 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;
}
- MTプラグインの重複配置は動作異常になる可能性があります
- 2014年にリリースしたMovable Type(MT)プラグイン一覧
- PageButeプラグインでcanonical属性を変更する「PageButeCanonicalChangerプラグイン」
- Movable Typeで作成したブログ記事をEvernoteにクリップする「ClipToEvernoteプラグイン」
- Movable Typeにインストールしたプラグインがプラグイン一覧に表示されない件について
- Movable Typeでアイテム画像を編集できる「Pixenateプラグイン」
- AssetExporter プラグイン v0.02
- Movable Type プラグインハンドラでのクエリーパラメータ取得方法
- Movable Type 5の記事編集画面に任意のボタンを追加する3つのプラグイン
- Action Streams プラグイン(Movable Type 5 対応)の利用方法:その3
- Movable Type用OAuth対応Twitter投稿プラグイン「PostTweet」
- Movable Type用OAuth対応Twitter投稿プラグイン「PostTwiOauth」
- Action Streams プラグイン(Movable Type 5 対応)の利用方法:その2
- Action Streams プラグイン(Movable Type 5 対応)の利用方法:その1
- Movable Type プラグイン一覧(MT5対応)
≫ MTEntryNext,Previousの拡張(とか改良?とか)。 from Junnama Online (Mirror)
# 何回も書いてる気がするなぁ、これ。 小粋空間: ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2対応) ... [続きを読む]
≫ ブログ記事に同一カテゴリーの前後リンクを表示する from Ubuntuでマルチメディア
小粋空間さんの「ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する」を... [続きを読む]
≫ 同一カテゴリで前後リンク+特定の記事のみ抜かす from ELLIPTiCUS
MTでまるまるひとつのサイトを作った時に、記事の前後にリンクは貼りたい。けれども、他のカテゴリーまで表示されるのは困る。って事多いですよね。<MTE... [続きを読む]
≫ 同カテゴリ内の前後記事へのリンク from 道化師ラッパンのぼやき
一応、記事の下には、前後の記事のリンクを貼ってあるんやけど、同カテゴリ内における前後の記事で表示させることにした。 またもやお世話になったのは小粋さん。... [続きを読む]
≫ PreviousNextInCategoryかEntryPageNextPrevか from 裏バーチャル山中家
要は、 ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する(Movable Type 4.2/Movable Type 5対応) MTEntry... [続きを読む]
はじめまして。
このページにあるカテゴリー内のリンク生成をするプラグインを利用させていただいておりましたが、Movabletype 5に使用してみたところ、利用できないようでした。
管理人さんはどのように回避、または別の方法で同じことをできるようにしていますか?
>gimicさん
こんにちは。
ご質問の件ですが、オリジナルのプラグインは新しいMTでは正常に動作しないので、2項の「PreviousNextInCategory プラグインのダウンロード」にあるリンク(リファクタリングしたもの)からプラグインをダウンロードしてください。
MT5で正常に動作することを確認しました。
それではよろしくお願い致します。
いつも参考にさせて頂いております。
このプラグインを使用してフォトアルバム的なものを作れないかと試行錯誤しております。
写真の枠を真ん中に置いて最新の写真をそこに表示させる、左右にPreviousとNextInを使用して、という形を想定しているのですが上手くいきませんT-T
そういった事は出来るでしょうか。
可能であればアドバイスを頂ければありがたいです。
よろしくお願い致します。
たびたびすみません!
エントリーアーカイブの設定が間違えてました・・・
何とか自己解決し、思ったとおりのフォトアルバムが作れました!
お騒がせして申し訳ございませんm(_ _)m
>MOMOさん
こんばんは。
ご連絡ありがとうございました。
ご質問の件、自己解決されたようで良かったです。
ではでは!