【修正】WordPressのゲストアバターをいろんな画像で表示するカスタマイズ

WordPressのこと

2019/3/19 get_avatar()を使う仕様に変更しました。
2020/01/30 コードを見直しました。たぶんWP User Avatarプラグインなどとの競合も避けれたかなと思います。

wordpressで利用できる自動生成アバターをオリジナルの画像にしてコメント欄をにぎやかにしたい。

WordPressで運営しているブログにいろんな方からコメントをいただくとうれしいですが、Gravatar登録のない場合、同じデフォルトアバターになってしまって味気なく感じませんか?

あらかじめWordpressで用意されている自動生成アバターならいろんな画像を割り当ててくれるのですが選択肢がどれもいまいち。Idenctionがシンプルでまだ使いやすいので利用されてる方よく見かけますね。

デフォルトアバターをオリジナル画像に設定するカスタマイズは多く知られていますが、今回は自動生成アバターのようにゲストのお名前によって表示アバターを変化させるカスタマイズを考えてみました。

WordPress4.8で確認。PHP・FTPの知識が必要です。
get_avatar_data()は4.2から導入された関数ですので、それ以前のバージョンでは使えません。

functions.phpへコードを書き込み、FTPでアバター画像をアップロードしてください。
このサンプルでは19通りのアバターを使用します。

実際に運用しているサイト(サンプルではないのでテスト投稿はお控えください。)

メールアドレスが未入力だったりgravatarが設定されていない場合に入力された名前を元に用意してある画像を表示させます。画像の数が用意できないので19通りになりましたが、ファイル名を作る部分をカスタマイズすることでお好みの数の画像を使うことができます。

コードと使い方

画像の準備

avatar_1.png~avatar_19.pngの画像を用意。

そのままコピペする場合はテーマディレクトリ(wp-contents/theme/使用中のワードプレステーマのディレクトリ)以下にavatarというディレクトリを作ってそこにFTPでアップロードしてください。

よく使いそうなアップロード先をコメント(行頭に//)で記載してありますので、必要に応じてご利用ください。

functions.phpに以下のコードをコピペ。※2020/01/30修正

function new_get_avatar($avatar, $id_or_email, $size, $default, $alt){
//アバター画像を保存しているディレクトリ名
$dirname = '/avatar/';

//アバター画像のある場所(指定の場所以外はコメントアウトするか削除してください)

//テーマディレクトリ
$avatar_dir = get_stylesheet_directory_uri().$dirname; 

//wp_content直下
//$avatar_dir = content_url() .$dirname;

//サイトURL直下
//$avatar_dir = site_url().$dirname;

$author_email = null;
$hash = null;
$userid = $userid1 = $userid2 = 0;

//ワードプレスのユーザーかチェックし、該当しない場合メールアドレスからグラバターが設定されているかチェックする
$idnum = 0;
if(is_numeric($id_or_email)){
	$idnum = $id_or_email;
}
if(is_object($id_or_email) && isset($id_or_email->user_id)){
	$idnum = $id_or_email->user_id;
}	
if($idnum > 0){
	return $avatar;
}

if(is_string($id_or_email) && !empty($id_or_email)){	
		$author_email = $id_or_email;
		$search_user = get_users(array('search' => $author_email));
		if(!empty($search_user)){
			return $avatar;	}
		}
else{
	if(isset($id_or_email->comment_author_email)){
		$author_email = $id_or_email->comment_author_email;
	}
}

if(! is_null($author_email) ){

	$hash = md5( strtolower( trim( $author_email) ) );
	if(is_ssl()){$uri = 'https://www.gravatar.com/avatar/' . $hash . '?d=404';
}
	else{
	$uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404';
}
	$headers = @get_headers($uri);
	if (preg_match("|200|", $headers[0])) {
	return $avatar;
	}
}

//ランダムにアバターを設定する
if(is_object($id_or_email) && isset($id_or_email->comment_author)){
	$avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
}else{
	$avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($avatar)),1,9);
}
	$userid1 =substr($avatar_hash,1,1);
	$userid2 =substr($avatar_hash,6,1);
	$userid = $userid1 + $userid2 + 1;
	$avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
	$avatar ="<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
	return $avatar;
}
add_filter('get_avatar','new_get_avatar',20,5);
WP User Avatarなどのプラグインを利用される場合には、ゲスト用アバターはプラグインのものではなくGravatarから選んでください。

(2019.7.24追記)ゲストのGravatarを使用しないバージョン

上記コードがうまく稼働しない場合、ゲストのGravatarは使用しないこちらのコードを一度お試しください。
(コメントループ内でのアバターのみ変更)

function new_get_avatar($avatar, $id_or_email, $size, $default, $alt){
$avatar_dir = get_stylesheet_directory_uri().'/avatar/'; //アバター画像のある場所
if(is_object($id_or_email) && isset ($id_or_email->comment_author) && empty($id_or_email->user_id)){
$word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
$userid1 =substr($word,1,1);
$userid2 =substr($word,6,1);
$userid = $userid1 + $userid2 + 1;
$avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
$avatar = "<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
}
return $avatar;
}
add_filter('get_avatar','new_get_avatar',20,5);

解説

ユーザーIDが定義されている場合は書き換えない

Gravatarを設定していなくても他のプラグインで画像を設定している場合などそちらを優先するようにWordpressのユーザーであればGravatarの有無にかかわらず無条件で書き換えないようにしました。

メールアドレスが記入されている場合はGravatarがあるかチェック

メールアドレスからgravatarのURLを生成し画像が存在しているかを確認する方法はWordPress Codexにサンプルがありましたのでほぼそのまま使いました。

Gravatar が存在するかのチェック – Gravatar の使い方

gravatarが存在していた場合のみ$avatarの内容はは変更せずそのまま戻します。

アバターの書き換え

コメントループ内の場合は投稿者の名前をもとにランダムっぽく画像URLを作成し、imgタグに書き出します。それ以外の場所ではランダムがランダムにでてきます。

テーマによってはコメントループ外で直接ユーザーIDやE-mailを指定しアバターを表示していることがあるので、その場合は変更されずデフォルトアバターが表示されます。(テストしたデフォルトテーマのtwentynineteenだと小さく表示されているところが変更できませんでした)

名前を数値化して1~19までの数字に

$word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
$userid1 =substr($word,1,1);
$userid2 =substr($word,6,1);
$userid = $userid1 + $userid2 + 1;
$avatar_url = $avatar_dir.'avatar_'.$userid.'.png';

$word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);

名前($id_or_email->comment_author)をMD5でハッシュ値(文字列)に変換、その中から数字以外を削除して9文字取り出し頭に1を足して10桁の数字にしました。
(1を足しているのはなんとなく一文字目が0になるのが嫌だったからです)


$userid1 =substr($word,1,1);
$userid2 =substr($word,6,1);
$userid = $userid1 + $userid2 + 1;

10桁の数字から2つめ($userid1)と7つめ($userid2)を足してさらに1を足しました。

0~9の数字を2つ足して、それに1をプラスするので$useridは1(0+0+1)~19(9+9+1)になります。これで19種類の画像を割り当てる準備ができました。

使用する画像の数を変更したり、名前以外の要素を利用するならこのへんに手を加えてください。

何度もテストしましたが問題点があればご指摘ください。

2019年3月に大幅に変更しました。

URLだけを書き換えたくget_avatar_data()に対してカスタマイズしていましたが、一つのアバターを表示させるのに何度かget_avatar_data()を呼び出しているっぽいのが気になったので最終的なimgタグを出力するget_avatar()に対してのカスタマイズに変更しました。

修正前のコードも掲載しておきます。
記事が冗長になるので消しました(2020/1/30)

参考リンク

https://wpdocs.osdn.jp/プラグイン_API/フィルターフック一覧/get_avatar

コメント

  1. まちゃとら より:

    はじめまして。
    まちゃとらと申します。

    wordpressのデフォルトアバターの変更方法、すごく参考になりました!

    ひとつご質問させて頂きたいのですが、wordpressのコメント欄に「男性」と「女性」のラジオボタンを設置し、その選択によって男性と女性の画像をデフォルトアバターとして表示したいと考えています。

    この場合、functions.phpにはどのような記述をすれば良いのでしょうか?

    お手数をお掛けしてしまい、誠に申し訳ございませんがご教授頂けましたら幸いです!
    よろしくお願い致します!

    • minaparu より:

      まちゃとらさま、コメントの承認が遅くなり大変申し訳ありませんでした。

      ご質問の件ですが、コメントフォームの改造とアバター表示の改造が必要になりますね。少し調べてみましたが形にするのは私の力量ではちょっと難しそうかな??
      お役に立てず申し訳ないです。
      ただ、できたら面白そうなのでチャレンジしてみますね。もし上手く行けば記事にします。

  2. ななし より:

    期待してます

    • minaparu より:

      ななし様、コメントの承認がおそくなりました。
      選択式は実装できそうかなと思ったのですが、ランダム表示とは違い受け取ったアバター情報の処理も絡んでくるので
      やらなきゃいけない処理が多そう…と開発の手がとまってます、ごめんなさい。
      https://blog.minaworld.net/archives/gender_choice_customize/

  3. とくえもん より:

    こんにちわ。

    上記のコードを使わせていただいております。

    導入してすぐは、gravatarの画像がある場合は、その画像がアバター画像になっていたのですが、今はgravatarの画像がある場合でもすべて、ランダム表示になっています。

    この問題を切り分けて行くにはどのような手順で調査したらよろしいでしょうか?

    • minaparu より:

      とくえもん様コメントありがとうございます。

      ご指摘の症状はメールアドレスやユーザーIDのチェックをスルーしてURLが書き換えられているみたいなので、前半の処理・・・冒頭の分岐で使っている$args[‘found_avatar’]の部分が怪しいかなという気がします。

      いろいろテストしてみて、その状態が再現できなかったのでテンプレートやプラグインとの競合も考えられますね。
      テンプレートによっては$args[‘found_avatar’]が定義されないことがある、というのが一番可能性が高いと思います。

      最初の分岐if($args[‘found_avatar’] == true){…}はまるっと省いて、ここに内包されている部分だけにしても動きます。がもともと公開していたコードはダメな部分があって変数未定義のエラー吐き出しまくります。すいません。

      このカスタマイズの内容はそこも含めてちょっと気になる部分もあって修正したいなと思っていたので、get_avatar_data()ではなくget_avatar()を使用したバージョンを公開しました。

      もしget_avatar_data()バージョンをご使用の場合は
      1行目の
      function new_get_avatar_data($args,$id_or_email){

      から

      真ん中あたりの
      if(is_object($id_or_email) && isset( $id_or_email->user_id ) && empty($check_avatar)){

      の間を以下のコードに書き換えて様子を見てください(変数未定義修正済み)

      $check_avatar ="";
      $user = $hash = null;
      	if ( ! empty( $id_or_email->user_id )){
      		$user = get_user_by( 'id', (int) $id_or_email->user_id );
      		$email = $user->user_email;
      		}
      	
      	if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
      		$email = $id_or_email->comment_author_email;
      		}
       	
       	if(! empty($email)){
       		$hash = md5( strtolower( trim( $email ) ) );
      		}
      	
      	$uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404';
      	$headers = @get_headers($uri);
      	
      	if (preg_match("|200|", $headers[0])) {
      		$check_avatar = TRUE;
      		}
      • とくえもん より:

        minaparuさま

        ご返信ありがとうございます!
        具体的なコードまでいただいて・・・。

        いろいろ試してみましたが、解決しませんでした。

        現状は、上記のコードをに変更しております。
        試したパターンを整理いたします。

        1.現在のテーマ(SANGO)で旧コードを利用
        →ランダム表示はされるが、gravatar画像を表示してくれない。

        2.現在のテーマ(SANGO)で新コードを利用
        →ランダム表示はされるが、gravatar画像を表示してくれない。

        3.テーマをTwenty Nineteenにして、コードを貼らない。
        →ランダム表示はされないが、gravatar画像を表示してくれた。
        (当たり前ですが・・・。)

        4.テーマをTwenty Nineteenにして、新・旧コードを貼る。
        →ランダム表示はされるが、gravatar画像を表示してくれない。

        5.テーマをTwenty Nineteenにして、新・旧コードを貼る。全プラグイン停止。
        →ランダム表示はされるが、gravatar画像を表示してくれない。

        ご参考にならないかと思いますが、該当のページをお知らせいたします。
        https://furutoku.com/about/?trashed=1&ids=95

      • minaparu より:

        とくえもん様、検証ありがとうございます!
        そして解決しませんでしたか・・・(´ω`;;)

        新コードというのは、コメント欄に書いた修正ではなく本文のget_avatar()バージョンですか?
        コード前半部分が無視されているようなのでもっとユーザーを特定するための条件をつければいいのかな。プラグインなしのデフォルトテーマで同様の現象とのことなのでこちらでも再現できればいいのですが…。
        とくにデータベースに修正を加えるようなカスタマイズでもないのでサーバーの仕様などは関係ないと思うのですよね。WP本体のアップデートで仕様が変わった部分があるのかな?ちょっと今時間とれないんですがまた確認してみますね。お役に立てずすいません!

        –追記

        もし、ゲストの方のGravatarを無視しても構わないのであれば前半を省いた次のコードもお試しください。

        function new_get_avatar($avatar, $id_or_email, $size, $default, $alt){
        $avatar_dir = get_stylesheet_directory_uri().'/avatar/'; //アバター画像のある場所
        
        if(is_object($id_or_email) && isset ($id_or_email->comment_author) && empty($id_or_email->user_id)){
        $word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
        $userid1 =substr($word,1,1);
        $userid2 =substr($word,6,1);
        $userid = $userid1 + $userid2 + 1;
        $avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
        $avatar = "<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
        }
        return $avatar;
        }
        add_filter('get_avatar','new_get_avatar',1,5);
        

        WordPressのユーザーによるコメント以外は画像を書き換えるというカスタマイズです。
        $id_or_email->user_idが0(空っぽ)の人のアバターを書き換えるのですが、これまでのカスタマイズでもこの変数を利用していたのでうまく動くかどうか(´ω`;)

  4. とくえもん より:

    minaparuさま

    何度も対応いただいてすみません。。。

    新コードは、本文のget_avatar()バージョンでした。

    そして・・・

    いただいた「ゲストのGravatar無視バージョン」を試しましたら・・・

    いけました!!
    ゲストの方は、とりあえず気にせずこちらを利用したいと思います。

    ありがとうございました!

    • minaparu より:

      とくえもん様

      ひとまず意図通りの表示ができてよかったです!
      今回コメントいただいたことで問題点を修正することができました。ありがとうございました!

  5. たろう より:

    正にこれがやりたくて掲載して頂いているとおりに設定しましたが、これをどのようにすれば実際に表示させられるのでしょうか?
    今現在の管理設定は【wavatar(自動生成)】の設定にしておりますので、当然wavatarが自動生成されております。
    設定したオリジナル画像を自動生成して表示さす方法をご教授頂けますでしょうか。
    宜しくお願いしますm(__)m

    • minaparu より:

      たろう様

      コメントありがとうございます。
      ご質問の件、以前にもカスタマイズが反映されないとご指摘を受けまして調査したのですが当方で現象が再現できず原因がわかっていません。
      Gravatarを使用しないバージョンをコメント欄に記載しましたが、記事にも追記させていただきますので一度お試しください。

      function new_get_avatar($avatar, $id_or_email, $size, $default, $alt){
      $avatar_dir = get_stylesheet_directory_uri().'/avatar/'; //アバター画像のある場所
      
      if(is_object($id_or_email) && isset ($id_or_email->comment_author) && empty($id_or_email->user_id)){
      $word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
      $userid1 =substr($word,1,1);
      $userid2 =substr($word,6,1);
      $userid = $userid1 + $userid2 + 1;
      $avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
      $avatar = "<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
      }
      return $avatar;
      }
      add_filter('get_avatar','new_get_avatar',1,5);
      

      画像を用意し、上記コードをfunctions.phpにコピーしていただきますと他に設定することなくコメント欄のゲスト画像が自動的に書き換えられます。

      • たろう より:

        わああ!ご丁寧に返信頂き有難うございます!是非試させて頂きます!本当にありがとうございますm(__)m

      • たろう より:

        早速試してみましたが、やはり状況は変わりませんでした、何か根本的に私が間違っているのでしょうか?!こちらの詳しい変更内容も記載させて頂きます。

        管理メニューから「外観」→「テーマエディータ」→「functions.php」にアクセスして、ご指摘のコードを一番下の
        (add_action( ‘pt-ocdi/after_import’, ‘appointment_after_import_setup’ );
        ?>)の一行上にコピペしました
        尚、オリジナル画像はテーマディレクトリ直下にavatarというフォルダを作って置いてます

        アバターの設定はWavatar (自動生成)が選択された状態ですが普通にwavatarがランダム表示されるだけでダメでした。
        「グラバターを無効にし、ローカルアバターのみを使用」というのにチェックを入れてみましたが、普通にひげの生えたおじさんのようなデフォルトアバタ?!が表示されるだけでした。
        アバターの設定は関係ないのでしょうか?!

        あと、ひとつ気になることは、当方「bbPress(掲示板フォーラムプラグイン)」にてゲストが投稿した場合にランダムでオリジナルアバターを表示させたいのですが、もしかしてbbpressでは駄目とかありますか?!
        Wavatarは普通に表示されていますので、いけると思っていたのですが。
        度々恐れ入りますが、ご教授頂けると助かりますm(__)m

      • minaparu より:

        たろう様、検証ありがとうございます。

        設置方法は問題ないかとおもいます(できていなければエラーがでたりするはずなので)。画像が変更されていないとのことなのでやっぱりソースが機能していないっぽいですね。

        BBPressをご使用とのことですのでプラグインのアバターに関するところを確認しましたが、アバターの表示に直接メールアドレスを指定しているのかなという気がします。

        この仮定を元に、コードを書き直してみましたのでもしお時間がありましたらお試しください。

        画像ファイルは先にコメント頂いたときの場所と同じです。
        設定→ディスカッションのアバター設定を自動生成のどれかにしておいてください。

        (メールアドレスが未記入のコメントは同じ画像が選ばれることが多くなるっぽいです。)

        function new_get_avatar($avatar, $id_or_email, $size, $default, $alt){
        $dirname = '/avatar/';//アバター画像を保存しているディレクトリ名
        //アバター画像のある場所
        $avatar_dir = get_stylesheet_directory_uri().$dirname; 
        $author_email = null;
        $hash = null;
        $avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($avatar)),1,9);
        $userid = $userid1 = $userid2 = 0;
        if(is_string($id_or_email)){
        	if(strlen($id_or_email) > 0){
        		$author_email = $id_or_email;
        	}
        }
        else{
        	if(isset($id_or_email->comment_author_email) && strlen($id_or_email->comment_author_email) > 0){
        		$author_email = $id_or_email->comment_author_email;
        	}
        }
        if(! is_null($author_email)){
        	$hash = md5( strtolower( trim( $author_email) ) );
        	if(is_ssl()){$uri = 'https://www.gravatar.com/avatar/' . $hash . '?d=404';}
        	else{
        	$uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404';}
        	$headers = @get_headers($uri);
        	if (preg_match("|200|", $headers[0])) {
        	return $avatar;
        	}
        }
        	$userid1 =substr($avatar_hash,1,1);
        	$userid2 =substr($avatar_hash,6,1);
        	$userid = $userid1 + $userid2 + 1;
        	$avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
        	$avatar ="<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
        	return $avatar;
        }
        add_filter('get_avatar','new_get_avatar',1,5);
        
      • たろう より:

        うわー!わざわざソースコードまで記載頂き大変ご丁寧にご教授頂き有難うございます!!お陰様で無事表示することができました!!!もともとゲスト様にはメールアドレスを入力する項目を消しておりましたが、ちゃんとランダムで表示されているようです!!本当に有難うございましたm(__)mこれからも参考にさせて頂きます!!

      • minaparu より:

        たろう様

        無事稼働したようで良かったです!
        Gravatarがどうやってメールアドレスのない人のアバターを設定しているのかイマイチわからなかったのですが、アドレスによる振り分けがなくてもある程度ランダムになることが知れてこちらも勉強になりました(´ω`)

  6. keyno より:

    はじめまして。デフォルトで用意されているアバターが可愛くなさすぎて、まさに希望する機能だったので早速サイトに反映したのですが、うまく動かないところがあり質問させてください。

    ログイン後自由にアバターを設定できるプラグイン「WP User Avatar」を使っているのですが、バッティングしてそうです。無効化にしたら、コメント欄にはご紹介いただいた方法で設定したランダムアバターが出るようになりました。

    Gravatarではなく、「WP User Avatar」で設定している人はWP User Avatarを優先にすることはできますでしょうか?

    お手すきの時に、もし余力があればお返事いただければ嬉しいです。

    • minaparu より:

      keyno様コメントありがとうございます。

      WP User Avatarとの併用について、プラグインの中身は難しすぎてわからなかったのですが(汗)いろいろトライしているうちにアバター書き換えのタイミングをずらすことで競合せずに動作することが確認できました。

      同時にこれまでの問題点をいくつか改修してありますので本文中のコードを一度ご利用いただけませんか?

      フィルターフックの動作タイミングはプラグインをインストールした順番などにも影響されるので、もし状況が変わらなければ最終行

      add_filter(‘get_avatar’,’new_get_avatar’,20,5);

      の20という数字を大きくしてください。(小さい数字から順に実行されるので大きい値を設定することで実行タイミングを遅らせることができます。)

      • keyno より:

        minaparuさまっっっ!!!

        無事、動きました!!コードも、アバターの保存場所が異なる場合とかわかりやすく書いてくださっているっっ。すごい。ありがとうございます。返信いただいた時間が朝方で・・。すみませんっ。

        ドネーションしたいところですが、なさそうだったので、広告クリックとおうまさんでいいことがあるように祈りました(´°????????ω°????????`)感涙。

        最終行はいじってませんが大丈夫そうです。

        あとは、私のサイト、恥ずかしがり屋さんが多いのか名前を入力されない方も多く、匿名さんは同じアバターになってしまうので、その場合はIPアドレスから生成できるようにしたいなと思ってます。

        頑張ってみますが、わからなかったらまたコメントしに来てしまうかもしれません。

        最後に、本当にありがとうございました! インフルエンザなど流行っておりますので、ご自愛ください。睡眠時間削いでしまってすいません!

      • keyno より:

        ・・・と思ったのですが、WP User Avatarで設定したアバターではなく、おそらく名前でランダムに選ばれたアバターが出ていそうです。

        ただ、サイト内にある「フォーラム(Asgaros Forumプラグイン使用)」では、WP User Avatarで設定したアバターが表示されているので、いただいたコードの問題より、テーマの問題かもしれません。

        もう少し調べてみます。

      • minaparu より:

        keyno様
        検証ありがとうございます!
        いくつか分岐を増やしてそれに当てはまらないものはすべてアバターを書き換える仕様にしてあります。
        コードの見直しをしていまして、分岐が一つ足りないことに気づいたので追加しました(汗

        記事のコードは修正してありますのでそのままコピペしてください。

        IPアドレスからランダムにアバターを設定するのであれば、コード中の真ん中にある
        //ランダムにアバターを設定する
        真下にある2行にあるcomment_authorという部分をcomment_author_IPに書き換えてください。

        if(is_object($id_or_email) && isset ($id_or_email->comment_author)){
        $word = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
        }

        お気遣いありがとうございます。
        不完全な状態で公開するのもどうかと時々思うのですがご指摘ただかないと問題点がわからないので助かりました。
        できるときにできる範囲で対応させていただいていますのでお気になさらず(´ω`)

      • keyno より:

        minaparuさま

        早速ありがとうございます!
        直していただいたソースを設定したところ直った気がします(キャッシュの影響で不安定なので様子を見ます)。

        IPアドレスの件も教えていただきありがとうございます!

        名前が入っていなければ、IPアドレスで。としてみようかと思っているのですが、
        }else{
        $avatar_hash = “1”.substr(preg_replace(“/[^0-9]+/”,””,md5($avatar)),1,9);

        この時の、$avatar には何が入っているのでしょう? 読み解けなくて・・。こっちを変えればいいのかなと思ったのですが、意図しない動きになったら嫌だなと思い質問させていただきました。

        PS:早速「アイコンが変わった!」とコメントいただきました??。サイトに来てくれる方に喜んでもらえました。ありがとうございます!!

      • minaparu より:

        keyno様

        ひとまず動作したようでなによりです!

        投稿者名がある人はそれを元に、ない方はIPアドレスを・・・・ということであれば分岐を増やして


        if(is_object($id_or_email) && isset($id_or_email->comment_author_IP)){
        if(!empty($id_or_email->comment_author)){
        $avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author)),1,9);
        }
        else{
        $avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author_IP)),1,9);
        }

        となります。(前の返信と同じ場所を書き換えてください)

        蛇足ですが
        $avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($id_or_email->comment_author.$id_or_email->comment_author_IP)),1,9);
        とふたつをつないだものをキーにするというのも考えたのですが、IPアドレスが変わった場合にお名前いただいていた方のアバターが変わってしまうのでいまいちかな。
        無記名投稿にも自動で任意の名前を保存するカスタマイズをされている場合はこっちのがいいかもです。(無記名表示を替えるカスタマイズであれば問題ありません)

        ご質問の件ですが「$avatar」の部分にはアバター画像を表示させるソース(imgタグ)が入っています。

        フォーラムのプラグインをみていたのですが、このプラグインのアバター表示にはユーザーIDの数値が使われています。
        0と設定されるゲストアバターはランダム化するためのキーワードがないので、グラバターのアドレスをキーワードにしようと$avatarを使用してみました。(どうやってグラバターがランダムなアバターを設定してるのかさっぱりわからないのですが)
        なので、ディスカッションの設定で自動生成タイプのどれかを設定しておいてほしかったんですね。テストしていますがランダムになるものの固定はされないという感じなんですけどね…。

      • keyno より:

        minaparuさま

        早速の返信ありがとうございます。なるほど・・。私では到達できなかったかもしれません。無事、IPアドレスでも変わっているような気がします。

        もっと色々なアバター表示されたら楽しいので、種類増やして遊んでみます!

        色々ありがとうございました!

      • minaparu より:

        keyno様

        うまく稼働したようで良かったです!
        こちらこそ、放置状態のソースを見直すことができてすっきりしました。
        また何かありましたらコメント下さい(´ω`)

  7. イチえもん より:

    minaparu様

    はじめまして、コメント失礼します。
    コメント欄のゲストアバターの変更ができました!
    感動です!ありがとうございます(°▽°)

    うちのサイトではbbPressで掲示板も利用しているのですが、minaparu様のコードを試したのですが全員同じオリジナルアバターになってしまいます。。(コメント欄のたろうさんのソースコードも試しましたがダメでした)

    うちのbbpress掲示板では匿名にするためにメアドは自動でno_email@example.comを入力される設定になっています。
    その為に同じアバターになっているのかもしれないです。。

    私(管理人)のアバターは現在のまま固定で、その他の掲示板/コメント利用者のアバターを「掲示板/コメントの名前のみからランダム抽出」することはできますでしょうか?
    名前が違うなら同じメアドでも違うアバターというイメージなのですが・・

    コメント欄にて「bbpressはメアドからアバターを表示させているかもしれない」と仰ってたので無理かもしれないかな、と思うのですが・・

    色々と触ってみたのですが全くうまくいかなくて、お手すきの時にでもご助言いただけたら嬉しいです。

    • minaparu より:

      ※イチえもん様
      投稿者名をベースにランダムなメールアドレスにする方法を追記(5/13)
      カスタマイズをお試しいただきましてありがとうございます。

      BBPressでのご使用で自動で統一のメールアドレスを設定されているとのこと。

      funcion.phpによるカスタマイズでメールアドレスを自動入力させているのであれば
      その自動入力されるメールアドレスにランダム性をもたせればランダムにアバターが表示されます。
      具体的には
      return 'no_email@example.com';
      の部分を
      return ip2long( $_SERVER["REMOTE_ADDR"] ).'@example.com';

      とすればアドレスの部分がIPアドレスを数値化したものになります。
      カスタマイズによってメール欄そのものを表示させない場合には気にならないですが、表示させている場合投稿後はcoockieによってよくわからない数値のメールアドレスが表示されるので利用者の方に不信感がでるかもしれませんね(´ω`;)

      IPアドレスを利用してランダム化すると一定期間同じ人が同じアバターを使うことになります。
      投稿者を特定させたくないのであれば、投稿日時を利用するとよいかとおもいます。
      return date(ymdHis).'@example.com';

      フォームから入力されたお名前を暗号化してメールアドレスに引っ付ける方法もあります。

      function bbp_no_email( $mail ) {
      $r_bbp_anonymous_name = apply_filters( 'bbp_pre_anonymous_post_author_name', $r_bbp_anonymous_name );
      $name = '匿名';
      if(!empty($r_bbp_anonymous_name)){$name = $r_bbp_anonymous_name;}
      $name = md5( strtolower( trim( $name) ) );
      return $name.'@example.com';
      }
      add_filter( 'bbp_pre_anonymous_post_author_email', 'bbp_no_email' );

    • minaparu より:

      メアドno_email@example.comのまま名前をもとにランダム化することができましたが、最終投稿者の部分などところどころうまく動かないので
      先に投稿した投稿時のメアドをランダム化してしまうほうがおすすめです。

      ランダム化するカスタマイズのコード20行目付近の//ワードプレスのユーザーかチェックし~というコメントの直後に以下のコードを追記してください。no_email@example.comというメールアドレスの場合のみ発動する分岐になっています。

      if(is_string($id_or_email) && $id_or_email == 'no_email@example.com'){
      $reply_id = bbp_get_reply_id( $reply_id );
      $author_name = get_post_meta( $reply_id, '_bbp_anonymous_name', true );
      $avatar_hash = "1".substr(preg_replace("/[^0-9]+/","",md5($author_name)),1,9);
      $userid1 =substr($avatar_hash,1,1);
      $userid2 =substr($avatar_hash,6,1);
      $userid = $userid1 + $userid2 + 1;
      $avatar_url = $avatar_dir.'avatar_'.$userid.'.png';
      $avatar ="<img alt='" . esc_attr( $alt ) . "' src='" . $avatar_url . "' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
      return $avatar;
      }

  8. イチえもん より:

    minaparu様
    ありがとうございます!!
    うまくいきました☆*:.。. o(≧▽≦)o .。.:*☆
    掲示板の利用者さんたちもビックリ喜びだと思います〜〜

    具体的やったことは
    (1) 2020/05/12 12:09 にいただいた返答を試してましたが全て同じアバターで上手くいかず。

    (2)2020/05/12 4:07 上記(1)の書き換えをそのままにこちら(2)の返答を追加するとうまくいきましたああ( ^∀^)

    あと1点お教えいただきたいのですが、19種類の画像を49種類にするにはコードのどこを編集すればいいでしょうか?

  9. イチえもん より:

    追記です。
    前コメントから色々問題が出てきまして、最終的には下記のコードをワードプレスのユーザーかチェックし~というコメントの直後に挿入することにしました。
    (ワードプレスのユーザーかチェックし~)の下に元々あったグラバターが設定の有無のコードは削除しました。)

    if(is_string($id_or_email)){
    $reply_id = bbp_get_reply_id( $reply_id );
    $author_name = get_post_meta( $reply_id, ‘_bbp_anonymous_name’, true );
    $avatar_hash = “1”.substr(preg_replace(“/[^0-9]+/”,””,md5($author_name)),1,9);
    $userid1 =substr($avatar_hash,1,1);
    $userid2 =substr($avatar_hash,6,1);
    $userid = $userid1 + $userid2 + 1;
    $avatar_url = $avatar_dir.’avatar_’.$userid.’.png’;
    $avatar =”<img alt='” . esc_attr( $alt ) . “‘ src='” . $avatar_url . “‘ class=’avatar avatar-{$size} photo’ height='{$size}’ width='{$size}’ />”;
    return $avatar;
    }
    $idnum = 0;
    if(is_numeric($id_or_email)){
    $idnum = $id_or_email;
    }
    if(is_object($id_or_email) && isset($id_or_email->user_id)){
    $idnum = $id_or_email->user_id;
    }
    if($idnum > 0){
    return $avatar;
    }

    ⑴「return ‘no_email@example.com’;」
    の部分を
    「return ip2long( $_SERVER[“REMOTE_ADDR”] ).’@example.com’;」
    を試したのですが、起こった問題としてはすでに投稿されているものはアバター変更にならない、と言う問題がありました。
    bbpの投稿時にメールアドレスのランダム化が行われる、というコードなんですね。

    ⑵ 2020/05/12 4:07でいただいたコードをそのまま試したのですが、うちの掲示板の問題として「no_email@example.comでは無い時期があった」ということでその期間の投稿のアバターが変更されない問題が起こっていました。

    なので

    考えに考えたのですが、PHPについてはほぼ知識ゼロで最終案が合ってるか全くわかりませんが、見た限りでは名前とIPのみでアバターが決定される仕様になっているのかな〜と思います。

    こちらのサイトを訪れる方の参考になるかもしれませんのでご報告しておきます。

    • minaparu より:

      イチえもん様

      検証ありがとうございました!
      グラバターを使わないのであれば、追記のコードで大丈夫ですが
      このコードはトピックの外ではうまく機能しないのを確認済みです。

      1)のほうはおっしゃるとおり、すでにメールアドレスが設定されている投稿には効かない方法です。
      新たにBBpressを実装するときには簡単かつ他の部分で問題が起きにくい方法だったんですが…

      ご質問のアバターの数の増やし方ですが、

      $userid = $userid1 + $userid2 + 1;

      の部分を

      $userid = $userid1.$userid2;
      $userid = floor($userid / 2)+1;

      に変えると49個に増やせます。

      解説
      $userid1と$userid2は0~9までの整数です。
      10の位に$userid1 1の位の$userid2を当てはめて$useridを00~99の数字にします。
      $useridを2で割って小数点以下切り捨て(0~48)に+1で1~49の数字が出来上がります。

  10. イチえもん より:

    minaparu様
    ご返答ありがとうございます!

    “”グラバターを使わないのであれば、追記のコードで大丈夫ですが
    このコードはトピックの外ではうまく機能しないのを確認済みです。””

    そうなんですね。。
    うちのサイトではブログ記事のコメント欄のアバターでも機能しているので今の所はわたしの望む全てが叶えられている状態です( ^ω^ )

    PHPについては知識ゼロなので読んでもよくわからないのですが、
    49個に変えるのチャレンジしてみます。
    その前にアバターをあと30個作成しなくては٩( ᐛ )و

    また完成したらご報告させていただきます。

    • minaparu より:

      ※イチえもん様

      すいません、計算間違えてました。
      49個じゃなくて50個になります(´ω`;;;)

  11. イチえもん より:

    minaparu様
    頑張ってアバター作ったんですが、ちょっと50個作るのはキツすぎたんで。。
    34個にしました。

    いただいた計算式の解説を解読して
    $userid = $userid1.$userid2;
    $userid = floor($userid / 3)+1;
    にしまして最大値を34になるようにしてみたらうまくいきました!!

    ありがとうございます^ – ^

  12. イチえもん より:

    すいません、もう一つお聞きしたいことがあります。
    今現在ウチの掲示板では34種類をランダムで付与になっているのですが、例外設定で「まるお」という名前が入力されていたらavatar_35.pngのアバターを充てがう、ということはできますでしょうか?

    お手すきの時でいいのでご教授いただけたら嬉しいです^ ^
    よろしくお願いしますm(_ _)m

    • minaparu より:

      イチえもん様

      特定の投稿者名にだけ固定のアバターを使用するカスタマイズは
      if($author_name == ‘まるお’){$avatar_url =’画像のアドレス’;}

      $avatar_url = $avatar_dir.’avatar_’.$userid.’.png’;

      $avatar =”<img alt='” . esc_attr( $alt ) . “‘ src='” . $avatar_url . “‘ class=’avatar avatar-{$size} photo’ height='{$size}’ width='{$size}’ />”;

      の間に追加するのが一番簡単かなと思います~

  13. イチえもん より:

    ご返答ありがとうございます。
    試してみたのですが反映されませんでした。

    やってみたことは
    すでに34種入っているavatarフォルダにavatar_35.pngという名前にした画像ファイルを保存して
    if($author_name == ‘まるお’){$avatar_url =’avatar_35.png’;}
    としたコードを指定いただいた箇所に追加してみました。

    画像のアドレスということが間違っているのかと思い保存した画像avatar_35.pngのURLを入力してみたりもしたんですが同じく無理でした。

    $userid = $userid1.$userid2;
    $userid = floor($userid / 3)+1;
    この計算では34種までなんで35番目の特殊アバターをまるおという名前を持つ人にだけに宛てがうということは無理なんでしょうか?
    それとも画像アドレスの解釈が間違っているのでしょうか?

    • minaparu より:

      ※イチえもん様

      こちらの簡単なテストで動作していたのですが、うまく動きませんでしたか…

      画像のアドレスをhttp://~(またはhttps://~)で始まる絶対URLで指定して反映されなければ機能していませんね。

      画像の指定が間違えていれば、画像が存在していないマークが表示されると思います。

      例えば、ワードプレスのメディアでアップロードした画像をアバターにできるようにと思って画像アドレスを直接指定する形にしましたが、
      他のアバターと同じ場所にアップロードしたavatar_35.pngを使用するのが決まっているのでしたら$useridを書き換えてみる方法でもいけるかな?

      $userid = $userid1.$userid2;
      $userid = floor($userid / 3)+1;

      の部分を

      if($author_name == 'まるお'){$userid = 35;}
      else{
      $userid = $userid1.$userid2;
      $userid = floor($userid / 3)+1;}

      にするとまるおさんの場合だけ$useridに35が入るのでうまく機能するかもです。試してみてください。

  14. イチえもん より:

    minaparu様
    ありがとうざいます!!
    いただいたコードで機能しました〜〜

    if($author_name == ‘まるお’){$userid = 35;}
    else{
    $userid = $userid1.$userid2;
    $userid = floor($userid / 3)+1;}

    if($author_name == ‘まるお’){$userid = 35;}
    if($author_name == ‘しかお’){$userid = 36;}
    else{
    $userid = $userid1.$userid2;
    $userid = floor($userid / 3)+1;}
    と特別アバターを用途に応じてどんどん増やせそうです〜〜

    まさかここまでやりたいことが実現するとは思っていませんでした!
    ゚・:,。★\(^ω^ )♪ありがとうございます♪( ^ω^)ノ★,。・:・゚

タイトルとURLをコピーしました