記事本文
トラックバックが反映されない
実は Movable Type をインストールするのは、この hxxk.jp で 5 回目くらいになるのです。 インストール直後の設定変更やテンプレートのカスタマイズはもう慣れっこ。 これまでの経験から、テンプレートの記述を簡略化しつつリビルド時の負荷を軽減し、かつサーバ上に静的に生成されるファイルのサイズ節約のノウハウなどもたくさん学べました。
しかし、慣れは同時に手抜きを生み出します。 インストールを繰り返すうちに、途中でつまづくこともなくなり、ある種機械的に手順をこなすようになりました。 そこで起きた今回の失敗が、必要なプラグインのインストール漏れと、ユーザーテストの実施忘れです。
トラックバックを送ったけどhttp://hxxk.jp/2004/09/02/0132には反映されていないみたいなので、あちらのトラックバックフォームを通じてもう一回送ったら、http://hxxk.jp/weblog/ではどうやら反映されている様で二重トラックバックになってしまいました、しかもパースエラーが。 真琴さん、お手数をおかけすることになってホントにごめんなさい・・
既に、この失敗に起因することによって leva さん ( Software Linkage | Linkage Note! ) が謝られているのですが、これは完全に私のミスなのです。 私がカスタマイズしたテンプレートでは、トラックバックが行われた場合に、 Main Index にて hxxk.jp に向けてトラックバックを送信した記事と、トラックバックが送信された hxxk.jp の記事を表示し、 Individual Entry Archive にて hxxk.jp に向けてトラックバックを送信した記事とその概要を表示させるようにしています。
しかし、 Movable Type 2.x のインストール直後の状態では、これは実現できません。 インストール後に、以下の作業を行う必要があります。
- MTPingedEntry Plugin のインストール
- /Install directory/lib/MT/App/Trackback.pm の書き換え
これらの作業については、既に Junkline - MTPingedEntry Plugin および Junkline - Individual Entry Archive と Date-Based Archive にも TrackBack を自動で反映されるようにし隊という実践記事があるため、ここで手順を書くことは割愛します。
で、これらの作業をすっかり抜かせたまま公開していた Weblog hxxks ですが、どういった現象が起こってしまうかを記録しておこうと思います。
Trackback.pm を書き換えた場合と書き換えなかった場合
標準状態の Trackback.pm では、
$app->rebuild_indexes( Blog => $blog )
or return $app->_response(Error =>
$app->translate("Rebuild failed: [_1]", $app->errstr));
といった記述になっています。 大雑把に表すと、「トラックバックを受信したらインデックス・テンプレートをリビルドする」といった感じでしょうか。 逆に言うと、 Individual Entry Archive などのアーカイブ・テンプレートはリビルドされません。 トラックバックを受信した後に、その記事に新たにコメントが投稿されるか、記事の作成者がその記事を修正して保存するかなどの能動的なアクションがなければトラックバックは反映されません。
よって、トラックバックを送った人が Indevidual Entry Archive を確認しても、
トラックバックを送ったけどhttp://hxxk.jp/2004/09/02/0132には反映されていない
といった状況が生まれます。
そこで、
$app->rebuild_entry( Entry => $entry )
or return $app->_response(Error =>
$app->translate("Rebuild failed: [_1]", $app->errstr));
という記述を追加して、「トラックバックを受信したら各エントリもリビルドする」ようにすることにより、トラックバックを受信したら自動的に反映することができるようになるのです。
MTPingedEntry Plugin をインストールしなかった場合
MTPingedEntry Plugin をインストールしているという前提で書いた私の Main Index テンプレートの Recent Trackbacks 周りの記述はこのようになっています。
<dl>
<MTPings sort_order="descend" lastn="10">
<dt><MTPingedEntry><a href="<$MTPingedEntryLink$>"><$MTPingedEntryTitle$></a></MTPingedEntry> へのトラックバック</dt>
<dd>
<ul>
<li><a href="<$MTPingURL$>"><$MTPingBlogName$> - <$MTPingTitle$> : <$MTPingDate format="%Y-%m-%d %H:%M"$></a></li>
</ul>
</dd>
</MTPings>
</dl>
このソースコードの中に登場するテンプレートタグの中で、
<MTPingedEntry><$MTPingedEntryLink$><$MTPingedEntryTitle$>
の 3 つが MTPingedEntry Plugin によるオリジナルのテンプレートタグであり、プラグインをインストールしていない限りタグとして認識されません。 プラグインをインストールした状態でトラックバックを受信すると、インデックス・テンプレートがリビルドされ、
<dl>
<dt><a href="http://hxxk.jp/weblog/2004/09/02/0132.php">index に最新記事を配置するということ</a> へのトラックバック</dt>
<dd>
<ul>
<li><a href="http://diary.sakura.ne.jp/?date=20040902#p05">Linkage Note! - [weblog] トップページに最新記事を配置と言うこと : 2004-09-02 04:56</a></li>
</ul>
</dd>
</dl>
といったようなソースコードとして生成されます。 しかし、プラグインをインストールしていない状態でトラックバックを受信し、インデックス・テンプレートがリビルドされると、
<dl>
<dt><a href=""></a></MTPingedEntry> へのトラックバック</dt>
<dd>
<ul>
<li><a href="http://diary.sakura.ne.jp/?date=20040902#p05">Linkage Note! - [weblog] トップページに最新記事を配置と言うこと : 2004-09-02 04:56</a></li>
</ul>
</dd>
</dl>
といったようなソースコードとして生成されます。
em 要素で強調していますが、強調するまでもなく分かるとおり、 well-formed ではなくなっています。
また、 XHTML ではない要素の終了タグ、 </MTPingedEntry> も出現しています。
hxxk.jp のほとんどのリソースは、 HTTP ヘッダの Content-Type を application/xhtml+xml としてサーバからクライアントに送り出すようにしているので、この状態で application/xhtml+xml に対応している UA で表示しようとしても、
XML パースエラー: タグが整合していません。必要なタグ: </dt>. 場所: http://hxxk.jp/weblog/ 行番号 167/列 30: <dt><a href=""></a></MTPingedEntry> へのトラックバック</dt> -----------------------------^
といったパースエラーの結果が返ってくるだけです。 ( なお、 application/xhtml+xml に対応していない UA ( IE など ) には Content-type を text/html として返しているので、パースエラーは起こりません。 not Valid な HTML であることに変わりはありませんが。 )
お詫び
こうして、事前にテンプレートなどの検証を行って、万全を期したつもりで公開したつもりが、 leva さんにご迷惑をかける結果になってしまいました。 現在は修正を行い、二重トラックバックも片方を削除しています。 leva さん、こちらのミスでご心配をおかけして申し訳ありませんでした。

