Movable Type 備忘録

 

 カテゴリ内で前・次リンクを行う

MovableType(ムーバブルタイプ)を既にインストールして使われている人ならご存知だと思いますが、 MovableType(ムーバブルタイプ)では、前リンク、次リンクのリンク先は、エントリを作った順( 日付順 )にリンクされてしまいます。
つか、これが普通なのかな (; ̄∇ ̄A

せっかくカテゴリで関連したエントリでまとめてるのに、まったく関係ないエントリが前リンク、次リンクとしてリンクされてしまいますよね。

以前、MovableType(ムーバブルタイプ)を使うようになって気に入らないことの1つにカテゴリを任意の順番に並べ替えるを記事にしましたが、 今回の前・次リンクも気に入らないことの1つに入ります。 ということで、カテゴリ内で前・次リンクさせちゃいましょう ( ̄∇ ̄)b

今回参考にさせてもらったサイトはPlay with Weblog!様です。

今回のカスタマイズは、いろいろいじくらなければならないので特に詳細に明記していきます。 カスタマイズすることは3つです。

  • プラグインをカスタマイズします。
    プラグインを後で入手しますが、そのプラグインは複数カテゴリに対応していないそうなので、 複数カテゴリに対応するよう、プラグイン自体をカスタマイズします。

  • 既存のファイルをカスタマイズします。

    category.gif

    今回使用するプラグインには致命的な!? 問題点があります。 それは、新規エントリを追加して前後エントリとリンクしたとしても、その前後のエントリたちは、その先の前後のエントリとリンクしないそうなんです。
    図にすると右みたいなかんじ。
    青い部分しかリンクしてくれないそうなんです。

    これをカテゴリ内のエントリすべてに、前リンク、次リンクを張るようなカスタマイズを入れます。

  • 個別エントリ・テンプレートを修正します。
    個別エントリ・テンプレートに前リンク・次リンクのコードを埋め込みます。

以上が今回のカスタマイズ内容です。

カスタマイズ方法

今回使用するプラグインは、PreviousNextInCategoryプラグインを使用します。
このプラグインは、該当エントリの前リンク・次リンクを同じカテゴリ内から検索して、前リンク・次リンクとして返してくれています。

▼PreviousNextInCategoryプラグインの入手はこちらから▼
http://weblog.philringnalda.com/2004/02/05/previous-and-next-in-category

入手したPreviousNextInCategoryプラグインを解凍します。

解凍するとPreviousNextInCategory.plというファイルがありますので、そのファイルをテキストエディタ( メモ帳でも何でもいいです )で開いてください。

次に、以下のコード中の青い字の行の間に赤い字の行を追加します。

行番号でいうと13行目と40行目あたりの2箇所に追加です。

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);
:
                      :
$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);
:
                      :
$res;
}

追加したらファイルを保存して、サーバ上の mt/plugins の下にアップロードしてください。

mt/lib/MT/WeblogPublisher.pm というファイルを修正します。

このファイルは既存のファイルですので、バックアップを取るようにしてくださいね☆ 先程と同様にテキストエディタで mt/lib/MT/WeblogPublisher.pm ファイルを開いてください。 そして、同じような要領で青い字の行の間に赤い字の行を追加します。 行番号でいうと193行目あたりになります。


:
                      :
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;
}
}
}
}
## ここまで追加したよ

if ($param{BuildDependencies}) {
                      :
                      :


追加したら速やかにファイル保存して、サーバ上の mt/lib/MT/ の下にアップロードしてください。 上書きしますか?と聞かれると思いますので、バックアップ取ってますよね? バックアップを取ってるのを確認したら上書きしてください。
バックアップとらないで、上書きしてしまうと元に戻せませんから注意してください。

最後に個別エントリ・テンプレートを修正します。

以下は、Play with Weblog!様のコードをそのまま拝借しまたものです。

<MTEntryPrevious>
<a href="<$MTEntryPermalink$>">&laquo; <$MTEntryTitle$></a> |
</MTEntryPrevious>
<a href="<$MTBlogURL$>">INDEX</a>
<MTEntryNext>
| <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> &raquo;</a>
</MTEntryNext><br / >
<MTEntryCategories>
<MTEntryPreviousInCategory>
<a href="<$MTEntryPermalink category_type="Individual"$>">&laquo;
<$MTEntryTitle$></a> |
</MTEntryPreviousInCategory>
<a href="<$MTCategoryArchiveLink$>"><$MTCategoryDescription$></a>
<MTEntryNextInCategory>
| <a href="<$MTEntryPermalink category_type="Individual"$>"><$MTEntryTitle$> &raquo;</a>
</MTEntryNextInCategory>
</MTEntryCategories>

そして、以下はわたしのコードです。

<div>
  <MTEntryCategories>
    <MTEntryPreviousInCategory><a href=<$MTEntryPermalink category_type="Individual"$>>&laquo;<$MTEntryTitle$></a> |</MTEntryPreviousInCategory>
    <a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
    <MTEntryNextInCategory>| <a href=<$MTEntryPermalink category_type="Individual"$>><$MTEntryTitle$> &raquo;</a></MTEntryNextInCategory>
  </MTEntryCategories>
</div>

何が違うかというと、わたしのコードは純粋に «前リンク|カテゴリ名|次リンク» だけが欲しかったので、いただいたコードから必要なものだけを残したものです。 自分の好みに合わせてお使いください。

以上で修正は終わりです。再構築して確認してみてください♪

SEE YOU ( ̄∇ ̄)/

 Trackback Pings(0)

No trackbacks found.

 Comments(24)

#1: Posted by ぱきこ [RES]

はじめまして、ぱきこと申します。
こちらのガイドに従って、«前リンク|カテゴリ名|次リンク»をつけようとしてみたのですが、、うまくいかず悩んでおります。
おかしいなという点は、手順どおりにすすめ、エントリーアーカイブのページに備忘録さんの«前リンク|カテゴリ名|次リンク»が表示されるコードを書き、保存・再構築したにもかかわらず、通常の前後リンク(投稿順にリンクしてしまう使えないやつですね)の表示が残っていて機能も前のままになってしまうのです。
どうしてパブリッシュされないのかお心当たりはあるでしょうか・・・

ちなみに、PreviousNextInCategory.plは修正してアップしたあと権限を755などに変更しなくても大丈夫なんでしょうか?

どうぞよろしくお願いいたします。

#2: Posted by bzbell [RES]

>>1 ぱきこ さん

はじめまして^^

> 保存・再構築したにもかかわらず、通常の前後リンク(投稿順にリンクしてしまう使えないやつですね)の表示が残っていて機能も前のままになってしまうのです。

それはおかしいですね。
ちなみに再構築はどのアーカイブを再構築しましたか。

無難にすべてを再構築してみてください( ̄∇ ̄)b

> ちなみに、PreviousNextInCategory.plは修正してアップしたあと権限を755などに変更しなくても大丈夫なんでしょうか?

はい。プラグインの方はパーミッションを変更しなくても大丈夫です。

#3: Posted by ぱきこ [RES]

忘さま

ぱきこでございます。
早速のお返事ありがとうございました。
再構築は「すべて」で試してみましたが、同じ結果でした(ぐっすん)
昨日から一睡もせずにやっているので、ちょっと頭がおかしいんでしょうか。

パーミッションの件、変更しないでよしとのこと。
了解しました。
ありがとうございます。

少し頭冷やして再度チャレンジしてみます。

#4: Posted by ぱきこ [RES]

忘さま

ぱきこでございます。
さきほど、コメントしてしまったのですが自己解決いたしました。
archiveパスを設定していたことをすっかり忘れて(というか理解が足りなくて)再構築のあと見ていた場所が違いました!(うわーんっ)
正しいパスのページをみたら、きちんと前次リンクができておりました。

お騒がせして本当にすみませんでした。。

#5: Posted by bzbell [RES]

>>4 ぱきこ さん

ほっ( ̄∇ ̄;)とりあえず、結果OKということで♪
良かった、良かった(*^。^*)

> お騒がせして本当にすみませんでした。。

もうちょと連絡遅かったら、納得いかなかったので、家帰ってプラグイン削除して実際に調べるつもりでした。

ホント良かった、良かった( ̄∇ ̄;)

#6: Posted by 起動戦車ガンタンク [RES]

忘さん、先程分割化の件でレスを頂きましたが浮気して、
こちらのカスタマイズを実行して無事に動作を確認する事
ができました♪

しかしながら、前のエントリーのタイトルの長さが長く、次
のエントリーのタイトルが短いとバランスがイマイチだなと
思うようになりました。

指定した字数以上のタイトルだと自動的にはみだした部
分は省略するようにカスタマイズできますか??

#7: Posted by bzbell [RES]

>>6 起動戦車ガンタンク さん

こんにちわ^^

> 指定した字数以上のタイトルだと自動的にはみだした部分は省略するようにカスタマイズできますか??

はい。
できますよ。
こちらの長くなった文字列をトリミングで見栄えよくするを参考にしてみてください♪

#8: Posted by 起動戦車ガンタンク [RES]

PHP化、Ver3.3という条件で動作するか不安でしたが、
TrimjプラグインとPreviousNextInCategoryプラグイン
の組み合わせでスッキリしました。

忘さんいはマヂで脱帽です^^

#9: Posted by bzbell [RES]

>>8 起動戦車ガンタンク さん

こんにちわ^^

良かったです(●^O^●)
こちらこそ、http://bizcaz.com/2006/10/08-151140.phpの件でコメントしていただいてありがとうございます。

結局、いろんな人からの助言で、プーの絵を差し替えることにしました。。。残念ですけど(つω-`。)

今度来る時は起動戦車ガンタンクさんのブログURLを教えていただけると嬉しいです♪
マヂ遊びに行きますので( ̄∇ ̄)/

#10: Posted by 起動戦車ガンタンク [RES]

MTをやる為に自宅サーバーを運用したばかりですので、
「テスト」の文字が画面一面に躍ってる状態です。

テンプレの件は残念ですね。個人的にシャアのテンプレが
欲しかったッス。「当サーバーは通常の3倍早いです」って
な感じで。

#11: Posted by comco [RES]

はじめまして。
PCもMTも初心者ですが、こちらでいろいろ勉強させてもらっています。
PreviousNextInCategoryプラグイン設置の件ですが、
ttp://weblog.philringnalda.com/2004/02/05/previous-and-next-in-category
よりPreviousNextInCategory.plをダウンロードし解凍後、mt/plugins にアップロードすると
MTにログインできなくなってしまいます(mt.cgiが実行できない:500内部サーバエラー)
(PreviousNextInCategory.plの修正前も後も同じ)
WeblogPublisher.pm は修正してアップ済ですが、個別エントリ・テンプレートにアクセスできない状態です。
PreviousNextInCategory.plの拡張子をppやpl99などにすると、mt.cgiは動きます。
私の環境のせいでしょうか?
Windows XP,SP2
xrea,s248
Apache 1.3.37
Perl 5.8.8
PHP 5.1.6
RUBY 1.8.5
MySQL 5.1.17

時期はずれのPOSTになってしまいますが、
何かアドバイスいただけたらうれしいです。

#12: Posted by bzbell [RES]

>>11 comco さん

はじめまして^^

考えられることは comco さんの修正ミスくらいでしょうか。

わたしのMovableTypeはVer3.35ですが、comco さんのMTも同じバージョンでしたら、わたしが使用している各ファイルを以下に置きましたので、バックアップを必ず行ってから差し替えてみてください。

実際にわたしが使ってるものなので問題ないと思いますが、もしこれでも動作できない場合にはご連絡ください ( ̄∇ ̄)/

#13: Posted by comco [RES]

>>12 bzbell 様へ

お忙しい中、アドバイスありがとうございました。

MT3.34です。アップしていただいたPreviousNextInCategory.plを
mt/pluginに置いてみましたが、前のものと同じくmt.cgiが実行できなくなります。
----------------------------------------------------------------------------------------------------------------------------
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
Depending on the server configuration,
you can also run this script under CGIWrap debugging.
Usually, either rename or linkthe script temporarily to a file which ends with.cgidextension,
or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
-----------------------------------------------------------------------------------------------------------------------------
ファイル名をtest.plのように変えても同じです。
拡張子を***.plxxのようにするか、削除してしまうとmt.cgiは動作します。

(アーカイブパスは指定してありますが、php化はしていません。
関係ないと思ったけど、VirusBaster2006もオフにしてもみました)

エラーメッセージを見ると、いろいろなcgiまたはテンプレートに原因があるように思えますが、
どこをいじっていいのかわからないのであきらめようと思います。

お騒がせしてすみませんでした。

#14: Posted by bzbell [RES]

>>13 comco さん

こんにちわ^^

えぇーーーΣ( ̄Д ̄;)!!
諦めちゃうんですか!?

残念です。
でも最後にVer3.34のWeblogPublisher.pmをカスタマイズしたものをアップしましたので、気が向いたら試してみてください。
※Ver3.34とVer3.35では違いはありませんでした。

たぶん、プラグインは問題ないと思います。
どちらかといえば、WeblogPublisher.pmの方が怪しいと思ってますの ( ̄∇ ̄)b

では、お力になれなくてごめんなさい。

#15: Posted by comco [RES]

>>14 bzbell 様へ

ありがとうございます。
3回も投稿してすみません。

PreviousNextInCategory.plとWeblogPublisher.pm について、
再修正したもの、アップ・再アップしていただいたもの・・
組み合わせを変えていろいろ試してみましたが
同じ状況なので私の環境が原因だと思います。

ご親切に感謝します。
今後もこちらで勉強させていただきますので
よろしくお願いいたします。

#16: Posted by bzbell [RES]

>>15 comco さん

こんにちわ^^

う~ん(つω-`。)納得いかないですねぇ。
何でだろ。
他のカスタマイズでもサーバがXREAの場合、わたしと違う動作したことがありました!!
以下のエラーを調べてみたところ、

----------------------------------------------------------------------------------------------------------------------------
The script did not produce proper HTTP headers.
Please see the error log to see the detail of the errors.
Depending on the server configuration,
you can also run this script under CGIWrap debugging.
Usually, either rename or linkthe script temporarily to a file which ends with.cgidextension,
or add a AddHandler cgi-script-debug .cgiline to your .htaccess file.
-----------------------------------------------------------------------------------------------------------------------------

「CGIの実行エラーの原因は、同時実行数が多い、実行時間が長い、メモリを使い過ぎている、ループ状態になっているなどがあります。」とのことです。
スクリプトに記述ミスがない場合は、上記のいずれかに該当している可能性があるみたいです。

わたし的にはすっごく気になる(くやしい)ところですが、また何か分かりましたらご連絡ください。

では。

#17: Posted by comco [RES]

>>16 bzbell 様へ

ご報告 (*^^)v

原因が特定できないのでMT3.35で上書きしてみましたが、
やはりPreviousNextInCategory.plがあるとHTTP500!

次に、MT3.35を別ディレクトリに新規インストールし、
デフォルトテンプレートのままテストエントリした後

ご親切にアップしていただいたPereviousNextInCategory.pl
とWeblogPublisher.pmをそのまま所定ディレクトリへFTP。
個別エントリアーカイブを指示どおりに編集してOKでした。

bzbell 様のコードは完璧なのに、
こちらの不備でご迷惑をおかけしてしまいました。
本当に申し訳ありませんでした。

これからは「こっそりと」勉強に伺いますので
よろしくお願いします。

#18: Posted by bzbell [RES]

>>17 comco さん

やりましたねっ!!
よかったですぅ (●>∀<●)

一時は comco さん諦めモードっぽかったので、すっごく残念だったのですが・・・。
わたしの知識が乏しいばかりにお役に立てなくて悔しかったんですの。

> これからは「こっそりと」勉強に伺いますので

はい。こちらこそよろしくお願いします (m;_ _)mペコ

#19: Posted by aik18 [RES]

はじめまして AIK18と申します。

PCに初心者なのでこちらを元に勉強させていただいているところです。

このたびMTを使い自分のサイトを作成中で
こちらに掲載していた«前リンク|カテゴリ名|次リンク»をやってみようと
チャレンジしています。

今回相談させていただきたいのは
mt/lib/MT/WeblogPublisher.pm ファイルの修正までは出来たのですが
次の工程である、エントリー修正でどこを修正すればよろしいでしょうか?
いろいろ入れてみたのですが、うまく表示されません。
勉強不足でこのような質問となり申し訳ないのですが
教えていただけますでしょうか?

#20: Posted by bzbell [RES]

>>19 aik18 さん

はじめまして^^

ご質問の件ですが、aik18 さんはMovableTypeのデフォルト・テンプレートをお使いですか ( ̄∇ ̄)b
その場合には、個別エントリ・アーカイブ内の以下の場所を差し替えることになります。

変更前
<p class="content-nav">
    <MTEntryPrevious><a href="<$MTEntryPermalink$>">&laquo; <$MTEntryTitle remove_html="1"$></a> |</MTEntryPrevious>
    <a href="<$MTBlogURL$>"><MT_TRANS phrase="Main"></a>
    <MTEntryNext>| <a href="<$MTEntryPermalink$>"><$MTEntryTitle remove_html="1"$> &raquo;</a></MTEntryNext>
</p>
変更後
<p>
  <MTEntryCategories>
    <MTEntryPreviousInCategory><a href=<$MTEntryPermalink category_type="Individual"$>>&laquo;<$MTEntryTitle$></a> |</MTEntryPreviousInCategory>
    <a href="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$></a>
    <MTEntryNextInCategory>| <a href=<$MTEntryPermalink category_type="Individual"$>><$MTEntryTitle$> &raquo;</a></MTEntryNextInCategory>
  </MTEntryCategories>
</p>

この説明で分かりますか (; ̄∇ ̄A

#21: Posted by aik18 [RES]

さっそくのレスありがとうございます。
テンプレートはDr.blogさんから頂いたものを使用しています。

その場合でも、上記の場所で大丈夫でしょうか?

#22: Posted by bzbell [RES]

>>21 aik18 さん

こんにちわ^^
Dr.blogさんとこのテンプレートだと以下の場所を差し替えればいいと思いますよ ( ̄∇ ̄)b

81行目
<p class="navi-link"><MTEntryPrevious><a href="<$MTEntryPermalink$>">« <$MTEntryTitle$></a> | </MTEntryPrevious><a href="<$MTBlogURL$>">main</a><MTEntryNext> | <a href="<$MTEntryPermalink$>"><$MTEntryTitle$> »</a></MTEntryNext></p>

確認はしてませんので、aik18 さんの方で試してみてください♪

#23: Posted by aik18 [RES]

ずっとPCの調子がおかしく
レスが遅れませんでした。すいません。。。。。

教えていただいた箇所を修正してみたら
うまく表示できました。
ありがとうございました。
これからも、いろいろと試して行きたいと思いますので
よろしくお願い致します。

#24: Posted by bzbell [RES]

>>23 aik18 さん

こんにちわ^^

よかったですね (●´∀`●)
こちらこそよろしくですの♪

 Post a Comment

コメント用フィード