サポート » 使い方全般 » 「wp list comments」でアバターを指定する方法

  • 解決済 meijinochoco

    (@meijinochoco)


    コメントのアバターを投稿者名で変更したいのですが、次のコードを書いても同じアバターしか出力してくれず困っています。

    ▼【functions.php】
    →「gravatarToID」を作る

    function gravatarToID($id="名無しさん", $size=64, $type="identicon") {
    	$hashid = md5(md5($id));
    	if ($size > 512) { $size = 512; }
    
    	$img = "<img src=\"";
    	$img .= "http://www.gravatar.com/avatar/";
    	$img .= $hashid;
    	$img .= "?d=";
    	$img .= $type;
    	$img .= "&?s=";
    	$img .= $size;
    	$img .= "\" width=\"";
    	$img .= $size;
    	$img .= "\" height=\"";
    	$img .= $size;
    	$img .= "\" alt=\"";
    	$img .= $id;
    	$img .= "\" title=\"";
    	$img .= $id;
    	$img .= "\" class=\"comment-avatar\" />";
    	echo $img;
    }

    ▼【content-custom.php】
    →「gravatarToID」を書いて記事投稿者のアバターを出力したいけどできない。

    <div class="entry-content">
    	<div class="comment-author vcard">
    		<?php gravatarToID($comment->comment_author, 96, 'identicon');?>			
    		<b class="fn">					
    		<?php echo esc_html( $post->txt_name ); ?>
    		</b>
    	</div>
    	<div class="comment-content">
    		<?php the_content(); ?>
    	</div>
    </div><!-- .entry-content -->

    さらに、返信部分は次のコードなのですが、「wp list comments」にはアバターを指定する方法がないようで、上の【content-custom.php】のように「gravatarToID」を書くことができません。

    ▼【comments.php】
    →記事へのコメント者や返信者のアバターを出力したいけど「gravatarToID」を指定する方法がない。

    <?php if ( have_comments() ) : ?>
    	<ol class="comment-list">
    		<?php
    			wp_list_comments( array(
    				'style'      => 'ol',
    				'max_depth'  => '20',
    				'per_page'   => '100',
    				'avatar_size'=> 96,
    				'reply_text' => 'コメント',
    				'short_ping' => true,
    				'reverse_top_level' => true,
    				'reverse_children' => true 
    			) );
    		?>
    	</ol><!-- .comment-list -->
    <?php endif; // Check for have_comments(). ?>

    どうしたらうまいことできるか、ご存じの方がいらっしゃいましたらご教示いただきたく質問いたしました。何卒!よろしくお願いいたします。(>_<)

    • このトピックはmeijinochocoが3年、 6ヶ月前に変更しました。
9件の返信を表示中 - 1 - 9件目 (全9件中)
  • get_avatar() 関数に用意されているフィルター get_avatar にフックしてはいかがですか。Codexにサンプルコードが載っています。
    Plugin API/Filter Reference/get avatar

    参考: 関数リファレンス/get avatar

    • この返信は3年、 6ヶ月前にgblsmが編集しました。
    スレッド開始 meijinochoco

    (@meijinochoco)

    ありがとうございます。参考にがんばってみます。

    ご参考までにフィルターフックの日本語Codexページです。
    https://wpdocs.osdn.jp/プラグイン_API/フィルターフック一覧/get_avatar

    追記:
    content-custom.php に入れた gravatarToID() の先頭パラメータは $post->post_author が妥当ではないでしょうか。( global $post; が先に必要かもしれません。)

    • この返信は3年、 6ヶ月前にgblsmが編集しました。
    スレッド開始 meijinochoco

    (@meijinochoco)

    親身になってご回答くださっていつもありがとうございます。

    あれからコメント部分のアバターは下記のようにして、名前ごとに変わるようにできました。
    【comments.php】に「callback」を付けて、【functions.php】の「mytheme_comment」を呼び出した形です。

    しかし、記事部分の投稿者アバターが全て一緒になってしまうという症状に悩んでいます。
    <!–★–>の部分です。
    ちなみにこの部分を「$post->post_author」にすると、アバターのaltとtitileに「1」が入りました。
    「$comment->comment_author」のままだとなんの値も入らず空っぽです。
    もちろん実際には1でも空っぽでもなく、投稿者名が入ってほしいのですが。

    どうしたら記事部分の投稿者アバターも名前ごとに変わるようにできるのかについて、何かご指導いただけませんでしょうか…

    ▼【functions.php】

    /*-------------------------------------------*/
    /*	投稿者名でアバター生成
    /*-------------------------------------------*/		
    function gravatarToID($id="名無しさん", $size=50, $type="identicon") {
    	$hashid = md5(md5($id));
    	if ($size > 512) { $size = 512; }
    
    	$img = "<img src=\"";
    	$img .= "https://www.gravatar.com/avatar/";
    	$img .= $hashid;
    	$img .= "?d=";
    	$img .= $type;
    	$img .= "&?s=";
    	$img .= $size;
    	$img .= "\" width=\"";
    	$img .= $size;
    	$img .= "\" height=\"";
    	$img .= $size;
    	$img .= "\" alt=\"";
    	$img .= $id;
    	$img .= "\" title=\"";
    	$img .= $id;
    	$img .= "\" class=\"comment-avatar\" />";
    	echo $img;
    }
    /*-------------------------------------------*/
    /*	コメントフォーム変更
    /*-------------------------------------------*/	
    function mytheme_comment($comment, $args, $depth) {
        if ( 'div' === $args['style'] ) {
            $tag       = 'div';
            $add_below = 'comment';
        } else {
            $tag       = 'li';
            $add_below = 'div-comment';
        }
        ?>
        <<?php echo $tag ?> <?php comment_class( empty( $args['has_children'] ) ? '' : 'parent' ) ?> id="comment-<?php comment_ID() ?>">
        <?php if ( 'div' != $args['style'] ) : ?>
            <div id="div-comment-<?php comment_ID() ?>" class="comment-body">
        <?php endif; ?>
     
    			<div class="author_flex">
    			<!-- アバター -->		
    				<div class="author_left">
    					<?php echo gravatarToID($comment->comment_author, 50, 'identicon'); ?>
    				</div>
    				<div class="author_right">
    			<!-- 名前 -->
    					<div class="author_name">
    						<?php printf( __( '%s' ), get_comment_author_link() ); ?>
    					</div>			
    			<!-- 日付 -->
    					<div class="author_date"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ); ?>">
    						<?php
    						/* translators: 1: date, 2: time */
    						printf( __('%1$s at %2$s'), get_comment_date(),  get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)' ), '  ', '' );
    						?>
    					</div>
    				</div>
    			</div>
    			<!-- 内容 -->
    			<div class="comment-content">
    				<?php comment_text(); ?>
    			</div>
    			<!-- 返信ボタン -->
    			<div class="reply">
    				<?php comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
    			</div>	
    		
    		<?php if ( 'div' != $args['style'] ) : ?>
    		</div>
    		<?php endif; ?>
    <?php
    }

    ▼【comments.php】

    <?php if ( have_comments() ) : ?>
    	<ol class="comment-list">
    		<?php
    			wp_list_comments( array(
    				'style'      => 'ol',
    				'max_depth'  => '2',
    				'callback'   => 'mytheme_comment', 
    				'per_page'   => '100',
    				'reply_text' => 'コメント <i class="fa fa-comment"></i>',
    				'short_ping' => true,
    				'reverse_top_level' => true,
    				'reverse_children' => true 
    			) );
    		?>
    	</ol><!-- .comment-list -->
    <?php endif; // Check for have_comments(). ?>

    ▼【content-custom.php】

    <div class="author_flex">
    	<div class="author_left">
    		<!--★-->
    		<?php gravatarToID($comment->comment_author, 50, 'identicon'); ?>			
    	</div>
    	<div class="author_right">
    		<div class="author_name"><?php echo esc_html( $post->txt_name ); ?></div>
    		<div class="author_date"><?php the_time('Y/m/d g:i A') ;?></div>
    	</div>
    </div>	
    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。
    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。

    content-custom.php に入れた gravatarToID() の先頭パラメータは
    いま $comment->comment_author が指定されていますが、これは何を表していますか?
    (どこからかコピペしたコードですか?)

    もしかすると $post->post_author が妥当ではないでしょうか。
    (これより前の部分に global $post; が必要かもしれません。)

    スレッド開始 meijinochoco

    (@meijinochoco)

    はい。こちらからコピペしたものです。
    https://webbingstudio.com/weblog/cms/entry-113.html

    その部分を「$post->post_author」にすると、アバター画像のaltとtitileに「1」が入りました。ただし、アバター画像は変化なしで、どんな投稿者名でも同じアバター画像が出力されてしまうのです。「global $post;$post->post_author」としても同様です。

    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。
    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。
    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。
    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。

    ごめんなさい、見落としていました。

    ちなみにこの部分を「$post->post_author」にすると、アバターのaltとtitileに「1」が入りました。
    「$comment->comment_author」のままだとなんの値も入らず空っぽです。
    もちろん実際には1でも空っぽでもなく、投稿者名が入ってほしいのですが。

    WordPress の仕様で comment_author にコメント投稿者の名前が入ります。
    同じく仕様で post_author には投稿者のID(番号)が入ります。
    ですから post_author を利用して、投稿者名を取得する必要があります。

    $user = get_userdata( $post->post_author );
    // 下記のどれか必要なものをご自身で選んで使います
    // $user->user_login : ログイン時のユーザー名
    // $user->display_name : ブログ上の表示名
    // $user->user_nicename : URLフレンドリーなユーザー名(ニックネームではありません)
    
    スレッド開始 meijinochoco

    (@meijinochoco)

    なるほどなるほど。そのような仕様が理由でしたか。お聞きしなければ絶対にわかりませんでした。ありがとうございます。少しわかってきました。

    さて、次のようにしたところ「私の名前」がaltやtitleに入るようになりました。

    <div class="author_left">
    	<?php $user = get_userdata( $post->post_author );
    	gravatarToID($user->display_name, 50, 'identicon'); ?>			
    </div>

    ただ、ユーザーが投稿する記事なので「ユーザーが入力した名前」がaltやtitleには入ってほしいと思いっております。つまり、

    // 下記のどれか必要なものをご自身で選んで使います
    // $user->xxx_xxxx : WP user frontedでユーザーが入力した名前

    という感じのものはありませんでしょうか?
    (ないですよね、そんな都合のよいものは…)

    尚、名前の入力はカスタムフィールド名「txt_name」に入っています。
    下記の参考リンクにある「カスタムフィールド追加時の注意点」という副題で記載されているMeta Keyとして設定したのが「txt_name」です。

    ※WP user fontedというのはユーザーが記事を投稿できるようになるプラグインです。
    参考:https://website-homepage.com/wordpress/plugin/useful/user-frontend/#i

    スレッド開始 meijinochoco

    (@meijinochoco)

    できました。めっっっっちゃうれしいです。

    <div class="author_left">
    	<?php $user = get_userdata( $post->post_author );
    	gravatarToID($post->txt_name, 50, 'identicon'); ?>			
    </div>

    仕様をご説明いただいたからこそ、じゃあここに$post->txt_nameって書けばいいのかな、と意味がわかりました。m(_ _)m

    なんどもなんどもご返信頂き本当にどうもありがとうございます!
    心から感謝申し上げます。

    • この返信は3年、 6ヶ月前にmeijinochocoが編集しました。
9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「「wp list comments」でアバターを指定する方法」には新たに返信することはできません。