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
| トラックバック