同一カテゴリー内でエントリーの移動(MT3.2)

  • 投稿日:
  • by

これも前々から導入したかったカスタマイズです。

同一カテゴリー内でエントリーの移動

これには、2通りのやり方があるようです。

1. プラグイン「EntryCategoryLinks」を使う方法

2. プラグイン「PreviousNextInCategory」を使う方法


しかし、どちらのプラグインにも同一の問題がある。

カテゴリ内の1つ前の記事は再構築されない。したがって、1つ前の記事からのリンクは更新されないという問題がある。

ということである。

それでは一つずつ解決方法を記す。

●プラグイン「EntryCategoryLinks」を使う方法


上記サイトに、「EntryCategoryLinks」と併用することで問題を解決できる別なプラグインそのものを公開されています


具体的には、

EntryCategoryLinks

をダウンロードし、MT/pluginsにUPする。

同様に、上記サイトの「RebuildPrevNextInCategory.pl」をダウンロードし、
MT/pluginsにUPする。

そして、エントリーテンプレートに、以下のようなタグを挿入する。


<MTEntryPrimaryCategory>
<MTEntryPrevInCategory>
<a href="<$MTEntryPermalink$>">≪ <$MTEntryTitle$></a> |
</MTEntryPrevInCategory>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> ≫</a>
</MTEntryNextInCategory>
</MTEntryPrimaryCategory>


後は、エントリーアーカイブをリビルドすれば完了。


●プラグイン「PreviousNextInCategory」を使う方法


下記サイトより、「PreviousNextInCategory」をダウンロードする。

phil ringnalda » Blog Archive » Previous and next in category


そのプラグインファイルに以下のように赤文字の部分を加える

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);
...
}

編集後、MT/pluginsにUPする。


次に、MT/lib/MT/WeblogPublisher.pm193行目あたりに、以下のスクリプトを追加する。
 (MT3.1xは、MT/lib/MT.pmを編集する。


return 1 unless $param{BuildDependencies} || $param{BuildIndexes} ||
     $param{BuildArchives};

if((defined $MT::Template::Context::Global_handlers{'EntryPreviousInCategory'}->{'is_container'})
&& (defined $MT::Template::Context::Global_handlers{'EntryNextInCategory'}->{'is_container'})) {

 my $cats = $entry->categories;
# previous
  for my $cat (@$cats) {
   my $prev = $entry->previous(1);
   if($prev && !$prev->is_in_category($cat)) {
   $prev = $entry->previous(2);
   while ($prev && !$prev->is_in_category($cat)){
   $prev = $prev->previous(1);
   }
   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)) {
  $next = $entry->next(2);
  while ($next && !$next->is_in_category($cat)){
   $next = $next->next(1);
  }
  if ($next) {
   $mt->_rebuild_entry_archive_type(Entry => $next,
   Blog => $blog,
   ArchiveType => 'Individual')
   or die $mt->errstr;
   }
  }
 }
}


そして、エントリーテンプレートに以下のようなタグを挿入する。

<MTEntryPreviousInCategory> <div class="side"> &laquo; <a href="<$MTEntryPermalink category_type="Individual"$>" title="このカテゴリの前の記事"><$MTEntryTitle$></a> </div> </MTEntryPreviousInCategory> <MTEntryNextInCategory> <div class="side"> <a href="<$MTEntryPermalink category_type="Individual"$>" title="このカテゴリの次の記事"><$MTEntryTitle$></a> &raquo; </div> </MTEntryNextInCategory> </MTEntryCategories>


これでエントリーアーカイブをリビルドすれば完了。

で。。。。


結局、両方試してみたが、つまるところ
これを導入すると、複数カテゴリーが設定してあるエントリーには何も出てこない。。。


これと、通常の「<MTEntryPrevious>」「<MTEntryNext>」の両方を表示しようかと思ったが、
これではリビルドに時間がかかりすぎる。。。。


なんせ、このブログでは複数カテゴリー指定をしているエントリーがほとんどだからである(笑)

リビルドの時間を取るか、ユーザービリティーを取るかで、今悩んでいる。。。。(^^;)


ま、とりあえず、複数カテゴリーを使用していない、
サブブログ、「リラックマ・ショッピングモール」では前者を導入している


なにかいい解決方法はないだろうか。。。。