二〇〇三年 十月 十九日(

旧暦 九月二十四日 友引
癸未年 九月廿四日

MT 同じカテゴリ内で前の/次のエントリへのリンクをつくる

個別エントリのページ(Individual Entry Archive)には、

« 「前のエントリ」|メイン|「次のエントリ」 »

というようなリンクがついているが、これと似たような感じで、同じカテゴリ内の「前のエントリ/次のエントリ」へのリンクを付けるというのを考えてみた。

どうして、同じカテゴリで「前のエントリ/次のエントリ」へのリンクが必要かというと、このblogでは容量を節約するために、エントリの本文は個別エントリのページ(Individual Entry Archive)だけに書き込まれるようにしており、月別のアーカイブやカテゴリ別のアーカイブには各エントリへのリンクだけを列挙して、各個別エントリのページへ飛ばすようにしている。

個別エントリのページのデフォルトのテンプレートでは、前のエントリと次のエントリへのリンクが付くわけだが、これは登録日時順で付くようになっているので、カテゴリ別アーカイブのページから来た場合などのように、エントリをアーカイブ別に順に見ていきたい場合にはちょっと不便である。

同じようなイメージで、今見ているエントリと同じカテゴリに含まれる前のエントリと次のエントリが見れると、なんとなく便利そうな感じが・・・しますよね?

で、無い知恵を絞ったのが次のような方法。ちょっとややこしくなったけどJavaScriptで実現している。


手順その1
MTのblogのメインメニューから「Templateの編集」画面を開き、「Archive-Related Template」のところで、「新しい Archive Template を作る」をクリックする。
「Template の名前」には「Category Entry List」と入力し(別に他の名前でもOK)、Templateの中身には次のように記述する。


function CatEntryList(){
var entries = new Array(<MTEntries sort_order="ascend">
"<$MTEntryID pad="1"$>","<$MTEntryTitle$>",
</MTEntries>"");
return entries;
}


手順その2
サーバ上でMTのアーカイブを入れているディレクトリ(ここでは /blog/archives とする)以下に、/catlist というディレクトリをつくり、書き込みできるパーミッションを設定しておく。(777とか)


手順その3
「BLOGの設定」画面の「アーカイブの設定」でAdd Newボタンを押して、「Archiveの種類」には「Category」を選び、「Template」ではさきほど作成したTemplateの名前(Category Entry List)を選択し、Addボタンを押す。


手順その4
「アーカイブの設定」画面には、いま追加したテンプレート(Category Entry List)が追加されているが、その横のテキストフォームの中に、「catlist/<$MTArchiveCategory dirify="1"$>.js」と入力する。
(このとき、Category Archiveの前に付いているラジオボタンを操作する必要はない)


手順その5
つぎのようなJavaScriptのファイルを作成し、「categorylinks.js」と名前を付けて保存し、先ほどサーバ上に作った /catlist ディレクトリ内に転送する。

// categorylinks.js
function CatEntryPrev(num){
var e = CatEntryList();
var n;
var r = new Array;
for(i=0;i<e.length;i=i+2){
if(num == e[i]){
n = i;
break;
}
}
if(i-2 < 0){
r[0] = "";
r[1] = "";
}else{
r[0] = e[i-2]+".html";
r[1] = e[i-1];
}
return r;
}
function CatEntryNext(num){
var e = CatEntryList();
var n;
var r = new Array;
for(i=0;i<e.length;i=i+2){
if(num == e[i]){
n = i;
break;
}
}
if(e[i+2] == ""){
r[0] = "";
r[1] = "";
}else{
r[0] = e[i+2]+".html";
r[1] = e[i+3];
}
return r;
}

手順その6
「Templateの編集」画面に戻り、Individual Entry Archiveのテンプレートを編集する。
まず、headタグ内の最後の方のscriptタグの終わっている後に、次のように追加する。


<script src="catlist/<MTEntryCategory dirify="1">.js"></script>
<script src="catlist/categorylinks.js"></script>


さらに、同じカテゴリ内の前の/次のリンクを付けたい部分に、次のようにスクリプトを追加する。


<script language="JavaScript">
var e = CatEntryPrev('<$MTEntryID pad="1"$>');
var strLink = e[0];
var strTitle = e[1];
if (e[0] != ""){
document.write("« ");
document.write("<a href='",strLink,"'>");
document.write(strTitle,"</a>");
document.write(" | ");
}
</script>
同じカテゴリ
<script language="JavaScript">
var e = CatEntryNext('<$MTEntryID pad="1"$>');
var strLink = e[0];
var strTitle = e[1];
if (e[0] != ""){
document.write(" | ");
document.write("<a href='",strLink,"'>");
document.write(strTitle,"</a>");
document.write(" »");
}
</script>


その後、saveして全体をリビルドする。

以上で作業は終わり(のはず)。

この方法を考えるにあたっては、
Scriptgoddess - How to's: Next/Prev Links Specific to Categories in MT - v.2
を参考にさせていただいた。ここでは同じことをphpによって実現されていて、方法としてはかなり違うのだが、エントリのリストをCategoryTemplateを用いた外部JavaScriptファイルにするというのは、このサイトの記述を見ていて思いついたことである。


また、問題点としては、一つのエントリに複数のカテゴリを指定している場合、そのページではPrimaryのカテゴリを基準に前後のリンクを作ってしまう点である。
つまり、カテゴリ別のリンクを辿ってきて表示したエントリで、そのカテゴリがSecondary以下のカテゴリに指定されている場合は、そこからカテゴリがそのエントリでPrimaryに指定されているカテゴリに変わってしまうことがあるという点である。(ややこしい・・・。)
このエントリの前後を参照のこと。「カレー」のカテゴリで入ってくると、このエントリでカテゴリが「日常」に変わってしまう。)

この機能って、いずれMTがバージョンアップするとともに、いかにも補完されそうな機能って感じがするけど、まあ、それまでの繋ぎで利用してみようと思う。

あと、リンクの見せ方だよなぁ・・・。きれいな方法が思いつかない。

追記:2003.10.20
違う方法を発見。
Chitatopops: カテゴリー内で前後のエントリーへリンク
SQLプラグインというのを使わなきゃならないが、実現できればこの方法のほうがずっとスマート。(ただ、実体参照か何かの具合で、上手く動いていないらしい)
2番目に書いてある方法は、基本的には上述したphpを用いたScriptgoddess による方法と同じようだ。


また、同じ記事を言及したものを発見。
ARTIFACT −人工事実− | 個別記事の前後のリンクをカテゴリー内にする
日付からみて、SQLプラグインによる方法と思われるが、記事更新時に問題があることが書かれている(記事追加時に、最新記事へのリンクが付かないこと)。


追記:2003.10.22
非常にシンプルなプラグインを発見。
EntryCategoryLinks
求めていたものは、これだぁ! って感じ。
まだ試してないけど、このスクリプトは参考になるなぁ。

Posted by mura at 2003年10月19日 14:30 | トラックバック
コメント

先に紹介したSQLプラグインを使う方法は、ARTIFACTで指摘されているように問題があるんで、今ではEnlightened Dreamsに書かれてる方法でやってます。プログラミングのことは全然わからないんで比較は出来ませんが、今のところ何の問題もないんでおすすめです。

Posted by: jaga at 2003年10月21日 07:35

コメントありがとうございます。
ワタシも最初に見つけたのが、よく似たphpでのやり方だったんですが、ずっとhtmlでアーカイブを作ってきたので断念しました。
今回の方法は、「phpが使えなくてもできる」「アーカイブの拡張子を変えなくてもできる」という点が利点だと思っています。

***
話はそれますが、Chitatopopsのデザインは相当素敵です。
文句なしにワタシの好きなblogデザインの五指に入ります。

Posted by: mura at 2003年10月21日 19:35

コメントをいただいたももです。
早速やってまいりました!
うちのサイトのIndividual Entry Archiveのテンプレートに問題があるようで、リビルドされないまま今にいたっています。(しかも今日全てのリンクがカテゴリにいく、という恐ろしい事態になったので・・・(;_;)ウウウ)
カテゴリ内で移動する方法、いつ試せるかわからないんですけど、また試してみたらご報告しますね!

Posted by: もも at 2003年11月 7日 00:40

なんだか恐ろしげなエラーですね。テンプレートの問題でしょうか。

ワタシのところは幸いまともに動いているのですが、blogのMLではCPUの使いすぎでEntryできないとか、サーバから使用停止を食らったとかいう話もあるようですし。。。
あんまり複雑なテンプレートやプラグインの多用も考え物だなぁ、と思う今日この頃。

Posted by: mura at 2003年11月 7日 10:13
コメントする









名前、アドレスを登録しますか?






トラックバック

MT 同じカテゴリ内で前の/次のエントリへのリンクをつくる
概要 やってみることにしよう。...
Weblog: pinelabo
時刻: 2005年06月12日 15:20

このエントリのトラックバックURL

http://www.villagewood.net/mt/mt-tb.cgi/40

◇このサイトのサーバの調子によって、トラックバックを送信してもエラーが表示されたり、すぐにこのページに反映できないときがあります。ですが、トラックバック自体は送られていますので、重ねて送っていただかなくても大丈夫です。こちらでも出来るだけ早く反映できるようにrebuildしますので、ご容赦ください。
参照元URL
関連エントリ