Wordpressのユーザーアバター その2

SLとはあんま関係ない話が続いてます。

Wordpressのユーザーアバターについての2回め。
プロフィール表示に使われるアバターですが、内部的にはwp-includesディレクトリ下のpluggable.phpで処理されています。get_avatarという関数が定義されていてテンプレートとかに

<?php echo get_avatar($user_id); ?>

とか書いておくと、ココが呼び出されてアバター画像の<img>タグが挿入されるようになってますん。

当然、このget_avatar関数にも前回触れたフックが使えるので add_filter関数を使って

add_filter( 'get_avatar', 'my_get_avatar',10,4 );

とかfunction.phpに書き込んで、my_get_avatar関数を用意すればget_avararの処理後に独自のカスタマイズを加えることができます。




公式ドキュメントを見ていただくとadd_filter関数の使い方は分かると思いますが、ざっくり解説すると

add_filter(tag,function_name,priority,accepted_args);


tagは文字列で利用したいフック名。公式ドキュメントのフック一覧にでている名称。

function_nameは文字列で独自の関数名。自前で定義したカスタマイズ処理の関数。

priorityは整数値で優先度。数値が多いと後回しになります。デフォルトは10です。必須ではないので、省略すると10になります。あんま少なくすると順序がコアな処理より先になってエラー出たり、多すぎると相当後回しになったりするので、やたら重いとかエラーやワーニングが出るとかでないかぎりは10でいいと思うっす。

accepted_argsは整数で受け取る引数の個数。フックする関数から何個かデータが送られてくるんですが、カスタマイズ処理の必要不要にあわせて増減させてください。


という感じになっております。まあ、だいたいadd_filter( 'get_avatar', 'my_get_avatar');という感じで3番目と4番目のパラメータは省略しても大丈夫なことが多いです。

コードの雰囲気としては
function my_get_avatar($avatar,$id_or_email,$size,$default){
//独自の処理

return $avatar;
}
add_filter( 'get_avatar', 'my_get_avatar',10,4 );
みたいな感じになるのが定番でしょう。
このコードは関数を定義して、フックフィルタの定義をしてるだけなので、関数の定義とフィルタの定義の順番は逆でも構わないです。そういうサンプルもよく見ます。

で、話をget_avatarの話に戻します。

この乗っ取った関数my_get_avatarはアバター画像がWordpressで必要な時に必ず呼び出されます。

んで、この時に変数$avatarにはテキストでHTMLのimgタグが入ってるんですが、これがWordpress側のアバター画像データになるので、独自の処理のところでヘラっとすり替えてリターン$avatarってやると、カスタマイズ処理完了と相成るわけですな。

しかし、やっかいなのは、自分だけでなく他の投稿者や通りすがりのコメント書いた人のアバターの処理でもこの関数は呼ばれてしまうので、無分別に画像を自分のSLプロフ画像にしちゃうと、誰も彼も自分のプロフ画像がアバターになってしまって奇妙なブログになってしまいますん(;´Д`)

で、このへんの識別処理は、まさにフック前のget_avatar関数がお手本になります。

Wordpress内のwp-includes/pluggable.php.で処理しているので、参考にしましょう。



コントロールパネルの項目もフックで追加できるので、こんな感じで組み込むと切り替えも楽ちんですなあ。

こうしておくと、SLのプロフ画像とブログのプロフ画像が同期するので、SLのほうを新しい画像にすると自動的にブログも変わりますんヾ(´・∀・)ノ




がんばってPHPコード書いた割りには、ボクは割りとどこのプロフ画像も全部同じだったという。。。。。orz そんなオチです(´ω`;)

コメント