MT4i相互乗り入れ実験

Ver1.81β3で新たに追加になった「自Blog内のMT4i表示」機能ですが、やっぱり他のMT4i利用サイトさんへのリンクも、そのままMT4iで表示するようにしたいわけです。

さて、太鉄さんが実装された「自Blog内のMT4i表示」は、PermalinkのURLを正規表現で自Blog内かどうかを判断し、エントリーIDを取り出して表示するというものです。でも、他Blogではそういう訳にもいきません。

そこで他サイトのMT4iと連携する方法をいくつか考えてみましたが、一番現実的なのはやはりHTMLに<link rel=”alternate” …>でMT4iへのリンクを指定する方法ではないかと思います。

MT4iでそれをパースし、見つかった時はMT4iのリンクを優先すればよいわけです。

で、さっそく実験してみます。思い立ったが吉日ってやつです。

まず、MTのテンプレートをいじります。今回はとりあえずMain Indexと、Individual Archiveのみ。(カテゴリーアーカイブなんかもやろうと思えばできると思いますが)

もしmt.cgiと同じディレクトリにmt4i.cgiを配置しているのなら、Main Index Templateの、<link rel=”stylesheet” …の下辺りに、

<link rel="alternate" type="application/x-httpd-cgi" title="MT4i" href="<$MTCGIPath$>mt4i.cgi?id=<$MTBlogID$>" /> 

Individual Archive Templateの、<link rel=”stylesheet” …の下辺りに、

<link rel="alternate" type="application/x-httpd-cgi" title="MT4i" href="<$MTCGIPath$>mt4i.cgi?id=<$MTBlogID$>&mode=individual&eid=<$MTEntryID$>" />

などと追加します。

要するに、hrefがそのページのMT4i版URLを正しく示すように、<link…/>タグをTemplateに追加します。

MT4i側では、

# リンク先を取得
my $mt4ilink = "";
require LWP::Simple;
my $content = LWP::Simple::get($url);
if ($content) {
  require HTML::TokeParser;
  if (my $p = HTML::TokeParser->new(\$content)) {
  while (my $token = $p->get_tag('link')) {
    # attr check
    my $rel   = $token->[1]{rel};   # alternate
    # ダブル・シングルクォーテーションを取り除く
   $rel =~ s/"//g;
    $rel =~ s/'//g;
    # MT4iへの完全URL
    my $href  = $token->[1]{href};
    # application/x-httpd-cgi
    my $type  = $token->[1]{type}; 
    my $title = $token->[1]{title}; # MT4i
    $title =~ s/"//g;
    $title =~ s/'//g;
    if ((lc $rel) eq 'alternate' 
            && (lc $title) eq 'mt4i') {
      $mt4ilink = $href;
    }
  }
}

のようなコードを追加して、linkタグのhrefに指定されているMT4iリンクを取得してそれに置き換えます。これで他のBlogについても、Mt4iで表示できるようになります。(CPANモジュールのLWP::SimpleとHTML::TokeParserを利用しています)

ただ、いくつか問題もあります。

HTMLヘッダーで<link rel=”alternate=”…>が指定されていないサイトへのリンクは当然MT4iへのリンクにはなりません。これは仕方がないですが(苦笑)

あともう一つは、既にお気づきの方もいらっしゃるかもしれませんが「記事の通し番号」(noで取り回されているもの)がTemplateで指定できないこと。こちらのほうは、MT4i側で通し番号の扱いを変更するしかないのかな・・・。

とりあえず今回は実験なので、noを指定しないでやってみました。したがってIndividualではタイトル表示で通し番号が表示されていません。更に「前の記事へ」というリンクが表示されません。

動作サンプルはこちら

自動相互乗り入れ機能をご覧になるには、ここの「この記事」というリンクをたどってみてください。リンク先は自Blog内なのでイマイチ分かり辛と思いますが、ご勘弁を。

変更したmt4i.cgiはここに置いておきます。

13 Comments

  • Pingback: 人生迷い箸

  • 2005/4/11 月曜日 - 13:08:14 | Permalink

    始めまして!レトルトと申します。

    MT4iであいのりを設定して、まずは自サイトのリンクへMT4iベースで移動できるようになって感動しました。
    すばらしい機能を提供いただきていへん感謝しています。
    ありがとうございます。

    ところで、「カテゴリーアーカイブなんかもやろうと思えばできると思いますが」とありますが、この辺は対応の予定がありますでしょうか?カテゴリーアーカイブへのリンクを多用していますのでできるとうれしいなぁと思っています。

    あまりニーズがないのかな?とも思いますが・・・
    よろしければお教えください。

  • 2005/4/11 月曜日 - 14:10:46 | Permalink

    レトルトさん、はじめまして。

    「あいのり機能」は要するに link タグで飛び先を指定しているだけなので、カテゴリアーカイブのテンプレートにも適切なMT4iへのURLを link タグで追加できれば、あいのり可能になります。

    たとえば、MT4i のカテゴリセレクタで何かのカテゴリーを選択した場合のURLは、

    http://yourdomain/mt4i.cgi?cat=<CategoryID>&id=<BlogID>

    のようになると思うんですが、このCategoryIDをうまくやれば良いわけです。

    でもこれはちょっと単純にはいかないみたいなんですよね。運用次第では<$MTArchiveTitle$>なんかでうまくできる場合もあると思いますが、無理がありますし。

    今ちょっと色々忙しくて試せないのですが、多分カテゴリアーカイブでカテゴリIDを引っ張ってこられるようなタグを追加するPluginを作成するか、MT4i自体に手を入れればできるようになると思いますので、そのうち挑戦してみようと思います。

    ご期待に添える回答ではなく申し訳ないですが、とりあえずこんなところで……。m(_,_)m

  • 2005/4/11 月曜日 - 14:26:21 | Permalink

    こんなに素早い回答ありがとうございました。

    > でもこれはちょっと単純にはいかないみたいなんですよね。

    やはり、そうですよね。自分でも見よう見まねでテンプレートに追記したりしてみたのですが、カテゴリIDをひねり出せませんでした。

    > ご期待に添える回答ではなく申し訳ないですが、とりあえずこんなところで

    とんでもないです。いいかげんなお願いに丁寧に答えていただき充分ありがたい回答でした。これから長く使って行くと思いますので急ぎません。
    無理なさいませんよう。でも期待してますので今後とも宜しくお願いいたします。

  • 2005/4/12 火曜日 - 9:15:09 | Permalink

    ヴァリウム男爵さん、お世話になっていますレトルトです。

    お話を聞かせていただいて、そうか~と思うところがあったのでもう一度試してみた結果、根本解決ではありませんが、とりあえず、運用でしのいでみました。根本解決ではないとおもいますが時間は稼げる?(笑)と思いましたのでご報告させていただきます。

    MTIncludePlusプラグインをインストール

    Category Archiveテンプレートに以下を記述

    <・・・・mt4i.cgi?cat=<MTIncludeModule><$MTArchiveTitle$></MTIncludeModule>&id=<$MTBlogID$>” />

    テンプレートモジュールを<$MTArchiveTitle$>で取得できるカテゴリ名を名前にしてその数だけ作成。モジュールの中身に対応するCategoryIDを記述。

    アドバイス中のオススメで無い方法をトライしてしまった感じで、そんなことするの~って感じがないでもないので、引き続きよろしくお願いします。
    ほんとありがとうございました。

  • 2005/4/12 火曜日 - 9:59:11 | Permalink

    レトルトさん、どうも。

    MTIncludePlus。初めて知りましたこのプラグイン。なるほど若干アクロバティックですけど確かにできそうですね。

    あれから僕も色々やってみましたが、こんな風に記述する方法もありますね。

    <MTEntries lastn=”1″><MTEntryCategories><$MTCategoryID$></MTEntryCategories></MTEntries>

    これでカテゴリアーカイブ内でカテゴリIDを出力することができます。こっちも決してスッキリしてるとは言い難いですが……。(苦笑)

  • 2005/4/12 火曜日 - 12:45:12 | Permalink

    ヴァリウム男爵さん

    お忙しいところ、スミマセン。やっぱり気になりますよね。
    ほんと申し訳ない。

    今回教えていただいた方法、これでスッキリじゃないでしょうか。
    すぐに書き換えちゃいました(嬉)

    で、全部確認してみたら、一部、二つのidがつながって(45,46が並んでるとして4546みたいに)出力されるところがあるようなのですが(そんなこと起きるでしょうか?)、固有の問題と思われるので解決、この方法でいきたいと思います。

    ほんと、相談させてもらってよかったです。

  • 2005/4/12 火曜日 - 14:41:28 | Permalink

    >で、全部確認してみたら、一部、二つのidがつながって
    >(45,46が並んでるとして4546みたいに)出力されるとこ
    >ろがあるようなのですが

    あ、そうか。そうなっちゃいますね。

    <MTEntries lastn=”1″><MTEntryCategories><$MTCategoryID$></MTEntryCategories></MTEntries>

    だと、そのカテゴリアーカイブの先頭エントリが複数のカテゴリを持ってる場合、そのIDを全部つなげて出力してしまいます。

    しかも<MTEntryCategories>には出力回数を制限するアトリビュートがない。

    またものすごく無理やりな方法ですが、

    <MTEntries lastn=”1″><MTEntryCategories glue=”&amp;”><$MTCategoryID$></MTEntryCategories></MTEntries>

    とすることで、なんとかそういうカテゴリでも飛べるようにはなります。複数カテゴリがある場合、cat=1&2&3 のように後続カテゴリIDをCGIパラメータとして無理やり分割してしまうわけです。これで一応、MT4iでは無効なパラメータとして無視されていればうまく動くわけです。

    でももちろん、まったくお勧めできるような方法ではないんですが……とりあえず動作はするんじゃないかと思います。

  • 2005/4/12 火曜日 - 21:18:23 | Permalink

    こんばんはレトルトです。

    試してみたら、cat=1&2&3の2が必要なカテゴリIDになるケースがあるようなのです(全部みたつもりが抜けもあったようで)。
    時間とってもらって、良い報告ができなくて申し訳ないのですが、試した結果はご報告しないと・・・辛い。複数カテゴリ登録結構してたんだなぁと、後悔先に立たず。

    ん~、自由にならないですね。

  • 2005/4/13 水曜日 - 11:12:12 | Permalink

    >試してみたら、cat=1&2&3の2が必要なカテゴリIDにな
    >るケースがあるようなのです

    なるほど。<MTEntryCategories>でカテゴリID順にリスティングされちゃうんでしょうかね。本来ならプライマリカテゴリのIDを出さないとまずいわけですし。

    とりあえず、やっぱりMT4iに手を入れるよりもプラグインで対処した方が良いと思ってPlugin Directoryで探してみたところ、見つけました。

    http://www.nonplus.net/
    software/mt/MTCategoryOfArchive.htm

    ここのプラグインを使い、Category Archive Template内で

    <MTCategoryOfArchive><MTCategoryID></MTCategoryOfArchive>

    とすれば CategoryID が出力できますので試してみてください。

  • 2005/4/13 水曜日 - 12:52:24 | Permalink

    ヴァリウム男爵さん

    完璧でした。

    やはり探す人が探すと良いものが見つかるようで・・・
    結局、フルにお付き合いいただいてしまって大丈夫だったでしょうか?

    ありがとうございました。と、書くしかできませんが相互テストのような機会で手が必要なときはお手伝いさせていただきたいと思いますのでよろしくお願いいたします。

    本当にありがとうございました。

  • 2005/4/13 水曜日 - 13:26:06 | Permalink

    いえいえ。お役に立てて何よりです。

    この件はそのうち「あいのりTips」としてエントリを立てるか、Wikiの方に追記しておこうと思います。

    あと、うちの息子がもう少し大きくなったら「あそぶログ」を参考に色々と楽しませていただきたいと思いますので、今後ともよろしくお願いいたします。;)

  • Pingback: 人生迷い箸

  • コメントを残す

    メールアドレスが公開されることはありません。