X

[WordPress]コメント等に使用されるアバターをカスタムフィールドに指定した画像に変更する

Contents

アバターを自分の好みの画像に変更したい

WordPressは、Gravatorというシステムと連動してアバターを表示しています。

Gravatar
https://ja.gravatar.com/

アバターを変更する場合は、このGravatorに自分のメールアドレスを登録する必要があるのですが、結構面倒だと言われることが有ります。

今回、そんな時のために、ユーザカスタムフィールドに画像を登録してもらい、それをアバターとして表示するようにカスタマイズします。

アバターを取得している場所

アバターを取得している処理は、wp-includes/link-template.php のget_avatar_data関数っぽいです。

get_avatar_data関数の以下のフィルターフックの値をフィルタ(add_filter)します。

/**
 * Filter the avatar data.
 *
 * @since 4.2.0
 *
 * @param array $args Arguments passed to get_avatar_data(), after processing.
 * @param int|object|string $id_or_email A user ID, email address, or comment object.
 */
return apply_filters( 'get_avatar_data', $args, $id_or_email );

ちなみにこのフィルタの第一引数の$argsは以下のように設定されています。
$args[“url”]を書き換えてあげればアバターで使用する画像が変わります。

var_dump($args);
/*
array(14) {
 ["size"]=>
 int(160)
 ["height"]=>
 int(80)
 ["width"]=>
 int(80)
 ["default"]=>
 string(2) "mm"
 ["force_default"]=>
 bool(false)
 ["rating"]=>
 string(1) "g"
 ["scheme"]=>
 NULL
 ["processed_args"]=>
 NULL
 ["extra_attr"]=>
 string(0) ""
 ["alt"]=>
 string(0) ""
 ["class"]=>
 NULL
 ["force_display"]=>
 bool(false)
 ["found_avatar"]=>
 bool(true)
 ["url"]=>
 string(76) "http://0.gravatar.com/avatar/ca0440a1432580931ef1bdc554f38e2f?s=160&d=mm&r=g"
}
*/

 

functions.php に処理を追加しましょう

さあ、フィルタを使って書き換えて見ましょう。

ちなみに今回はACF(Advanced Custom Fields Plugin)を使っていますので、流用される場合は、適宜修正してくださいね。

お使いのテーマのfunctions.phpに以下を書き込みます。

/**
 * 登録ユーザの写真があれば使用する
 */
add_filter( 'get_avatar_data', 'onocom_get_avatar_data', 10, 2 ); // 2はフィルタで渡される引数の数を示します。重要なので忘れぬように!
function onocom_get_avatar_data( $args, $id_or_email ) {
    if( is_object($id_or_email) && isset( $id_or_email->user_id ) && $id_or_email->user_id !== "0" ) {
        $id = $id_or_email->user_id;
        $profile_image_id = get_field( "profile_image", "user_" . $id );
        if( $profile_image_id ) {
            $src = wp_get_attachment_image_src($profile_image_id, "thumbnail", false);
            if ($src) {
                $args["url"] = $src[0];
            }
        }
    }
    return $args;
}

これをすることで、該当するユーザがコメントの書き込みを行った場合、以下のような$args[“url”]に書き換わり、アバターの画像を変えることができます。

var_dump($args);
/*
array(14) {
 ["size"]=>
 int(160)
 ["height"]=>
 int(80)
 ["width"]=>
 int(80)
 ["default"]=>
 string(2) "mm"
 ["force_default"]=>
 bool(false)
 ["rating"]=>
 string(1) "g"
 ["scheme"]=>
 NULL
 ["processed_args"]=>
 NULL
 ["extra_attr"]=>
 string(0) ""
 ["alt"]=>
 string(0) ""
 ["class"]=>
 NULL
 ["force_display"]=>
 bool(false)
 ["found_avatar"]=>
 bool(true)
 ["url"]=>
 string(87) "http://example.com/wp-content/uploads/2016/02/profile-img-300x300.jpg"
}*/

まとめ

WordPressでは、様々なフィルターフックやアクションフックが用意されているため、フックする箇所に目星をつけることができれば、コアファイルを触ること無く簡単に結果を制御できます。

ぜひご活用ください。

View Comments (3)

  • 初めまして。
    突然のコメント失礼します。

    ユーザーのプロフィール画像をプラグイン・Gravatarなしで変更できないかと探していたところ辿り着きました。

    ご質問ですが、アバターに表示する画像をテーマ内のフォルダにある画像から指定することはできますでしょうか?
    【テーマ/img/画像】

    お手数をおかけいたしますが、ご教授いただけませんでしょうか。
    何卒よろしくお願いいたします。

    • つっちーさんご質問ありがとうございます。
      こんな感じで書き換えてあげたらいかがでしょうか?

      add_filter( 'get_avatar_data', 'onocom_get_avatar_data', 10, 2 );
      function onocom_get_avatar_data( $args, $id_or_email ) {
      	$args["url"]  = get_template_directory_uri() . "/img/avator.jpg";
      	return $args;
      }
      

      要は$args["url"]に、アバター画像の場所を指定してあげれば変更できます。
      上記コードの以下の部分を、希望するファイル名やパスに変えてあげてくださいませ。

      $args["url"]  = get_template_directory_uri() . "/img/avator.jpg";
      
  • すみません。こちらを参考にやってみましたが画像が反映されません。なぜでしょう?