この記事の概要
しばらく前からここのサイトのトラックバックURLがちょっと違うって気づきました?
長いURLを収めるためにフォームの入力フィールドを置くのはやだな、とミタメ的な理由で改造をしてたんですが、今回はその解説。__mode=rss(まみおさんの改造版で対応)についてもついでに。
action.phpからの解放
URLがやたら長いのは、action.phpを通してプラグイン名などのいろんなパラメータを受け渡してるから。なので、こっち側からの送信はともかく、外からのトラックバックを受信するURLだけはaction.phpを通さないしくみを作りたい。
ということで、action.phpがあるディレクトリにtrackback.phpというファイルを置いて、そこにトラックバック受付専用の仕事をさせることに。その中身がこれ。
$CONF = array();
include('./config.php'); // common functions
$pluginName = 'TrackBack';
// only continue when the plugin is really installed
if (!$manager->pluginInstalled('NP_' . $pluginName))
exit;
$plugin =& $manager->getPlugin('NP_' . $pluginName);
if (!$plugin) exit;
if ( requestVar('id') ) $_REQUEST['tb_id'] = requestVar('id');
else if ( requestVar('entry_id') ) $_REQUEST['tb_id'] = requestVar('entry_id');
$plugin->handlePingXML();
ファイル置きました:Trackback Ping Receiver
やってることは、このファイルからNP_Trackbackのping処理部を呼んでるだけなので割りとシンプル。記事idの受け取りはentry_idでも受け付けるようにしてます。理由は後述。
追記:この記事はv1.2系のNP_Trackback用です。v2系用の場合、最後の行はhandlePingXML()ではなく、handlePing()になります。
またv2系にはすでにプラグイン側で短縮URLが用意されてるので、それを利用したほうがいいかも。詳細は「NP_Trackback v2系への移行&Tips」のほうに書いてます。
URL表示を修正
今までのURLではなくtrackback.phpのほうを指すために、NP_Trackbackの中身をいじります。オリジナルのgetTrackBackUrl()関数を・・・
function getTrackBackUrl($itemid) {
global $CONF;
return $CONF['ActionURL'] . '?action=plugin&name=TrackBack&tb_id=' .$itemid;
}
下の記述に変更。
function getTrackBackUrl($itemid) {
global $CONF;
//hack
$baseurl = preg_replace('{^(.+)/action.php}', '$1/', $CONF['ActionURL']);
return $baseurl.'trackback.php?id=' .$itemid;
}
追記:最後に、NP_Trackback のはじめのほうにあるHTMLの入力フィールドを省けば終了です。<tburl>をふつうのテキストとして表示してもうるさく感じないはず。
トラックバック情報のロボット収集もOK?
これをやっておくとVer1.23bj7で対応してる __mode=rss と絡めて、"トラックバックURL?__mode=rss&entry_id=xxx"という Movable Type っぽい呼び出しができるので、'item' スキンタイプにきちんと <%TrackBack(tbcode)%> を埋め込んでおけばトラックバック情報をrssで収集するロボットにも対応できてそう。
同じようにMTらしく __mode=view も実装できなくはないけど Nucleus では意味が無いので省略。
pukka:
こちらの tips、早速 参考にさせていただきました。
おかげでスッキリしましたです。どうもありがとうございます。