お客様のご希望により、WPの記事にトラックバックを実装することになりました。
あちこち調べながらいろいろとやってみたので、とりあえずメモメモ。
基本的には、記事ごとにトラックバック用のURLを提示して、そこにユーザー側からトラックバックを打ってもらえばOK。WordPressでトラックバックURLを表示するタグは以下の通りです。
<?php trackback_url(); ?>
PHPの値として使うときには、パラメータとしてFALSEを指定してやればOKです。
これを記事のテンプレートに入れてやるだけで解決。らくちんらくちん、と思いきや、そのお客様がメインで使っているブログシステムにはトラックバック機能がないことがわかりました。ああ・・・うん、まあ、スパムの温床みたいな一面もありますしね・・・。
で、ここで初めてトラックバックとはなんぞや、という視点で調べてみたところ、ある一定のフォーマットに則って該当のURLにPOSTしてやれば、あとは受け側で処理されるとのこと。ならば、フォーマットに沿った入力フォームを用意すれば良いのでは?という結論に。
参考までに、トラックバックの基本フォーマットは以下の通り。これを渡せばいいらしい。
Content-Type: application/x-www-form-urlencoded; charset=utf-8 title=タイトル&excerpt=概要&url=リンクしてもらうURL&blog_name=ブログ名
と、いうことで、上記に則って作ったフォームが以下
<form action="<?php trackback_url(); ?>" method="post" enctype="application/x-www-form-urlencoded; charset=utf-8"> タイトル:<input name="title" type="text"><br> URL:<input name="url" type="text"><br> 概要:<input name="excerpt" type="text"><br> ブログ名:<input name="blog_name" type="text"><br> <input type="submit"> </form>
各項目を入力して送信を押してみたところ、無事にトラックバックが送られてきました。こんなに簡単なのか・・・。こりゃあ、トラックバックスパム、流行るはずですよね。自動送信で狂ったように送りまくるプログラム、僕でも作れそうです。や、作っちゃダメですけどね。スパム、ダメ、ゼッタイ。
さて、トラックバックを受け付ける門戸を広く解放することには成功しましたが、実はもう一個課題がありました。集まったトラックバックを、リスト形式で右カラムに表示したいとのご要望。
そもそもWordPressはトラックバックとコメントが一緒くたに処理されてるようなのです。普通にコメントを実装すると書き込まれたコメントとトラックバックが、記事の下に一緒に表示されますよね。でもWordPress2.7以降から、パラメータで絞ることでトラックバックやコメントに分けてリスト表示することができるようになっています。タグは以下の通り
<ul> <?php wp_list_comments('type=trackback'); ?> </ul>
type=のところに’all’, ‘comment’, ‘trackback’, ‘pingback’, ‘pings’のどれかを指定すれば、トラックバックやコメントで抽出するできます。デフォルトは’all’で、’pings’は’trackback’, ‘pingback’を一括指定できるみたいです。吐き出されるソースはデフォルトだと<li>からになるので、その外枠にあたる<ul>などが必要です。
さて、デフォルトの表示フォーマットだと全ての情報が表示されてしまうので、それをリストの形に見えるようにカスタマイズする必要があるのですが、パラメータや設定で簡単に変えることはできなくて、コールバック関数という方法を使って整形するなんていう、ちょっと面倒な手順が必要です。記述としては以下の通り。
<?php wp_list_comments('type=trackback&callback=mytheme_comment'); ?>
callback=mytheme_commentというのが、関数を呼んでる部分。整形されたHTMLのテンプレートを呼び出してそれにはめ込んで表示する形になります。その関数(テンプレート)は、お使いのテーマフォルダに入っているfunctions.phpに記述します。以下は、CODEXに記載されていた記述例です。
function mytheme_comment($comment, $args, $depth) { $GLOBALS['comment'] = $comment; ?> <li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>"> <div id="comment-<?php comment_ID(); ?>"> <div class="comment-author vcard"> <?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?> <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?> </div> <?php if ($comment->comment_approved == '0') : ?> <em><?php _e('Your comment is awaiting moderation.') ?></em> <br /> <?php endif; ?> <div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(), get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),' ','') ?></div> <?php comment_text() ?> <div class="reply"> <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?> </div> </div> <?php }
末尾がphpの開始タグで終わっているのは、間にphpの一文を挟み込む為の記述で、ミスではありません。上記を、functions.phpのどこでもいいので追加し、前述のタグからcallback=の形で呼び出せば、リストタグの中がこのフォーマットに従った形に強制的に整形されます。
とりあえずそのまま書いてみると、デフォルトとまったく同じ見た目に整形されます。ここから、削りたい変数を削るなり、外枠のdivやspan等を付け加えるような形でカスタマイズを進めればわかりやすいかな、と思いました。
これで、任意の場所に好きな見た目でトラックバックリストを出せそうです。まあ今後この知識が生きるかどうかは謎ですけどね・・・ふふふ・・・
それにしてもなにかと登場するfunctions.php侮りがたし。とりあえずfunctions.php。三度の飯よりfunctions.phpですね。や、三度の飯の方が明らかに好きですが。