web-dev-qa-db-ja.com

Gravatarをアップロードした画像と置き換えますか?

このガイド をフォローすることでプロフィール写真をアップロードする機能を追加しました。

オンラインガイドやWP hooksに関するドキュメントが見つかりません。 コメント欄のGravatarのプロフィール写真をカスタムのアップロードされた画像に置き換える方法を教えてください

私のサイトで自分のプロフィール写真を変更するために、ユーザーにGravatarの登録を強制することはしたくありません。

2
N00b

ユーザーが自分のアバターを添付ファイルのIDとして保存し、ユーザーのmetaにフィールドfield_with_custom_avatar_idとして保存すると仮定すると、値が保存されている場合はその添付ファイルを表示するためにこれを実行できます。

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    //If is email, try and find user ID
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    //if not user ID, return
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    //Find ID of attachment saved user meta
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar_id', true );
    if( 0 < absint( $saved ) ) {
        //return saved image
        return wp_get_attachment_image( $saved, [ $size, $size ], false, ['alt' => $alt] );
    }

    //return normal
    return $avatar;

}

または、画像のURLとして保存されている場合は、ユーザーメタフィールドfield_with_custom_avatarに -

add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {

    //If is email, try and find user ID
    if( ! is_numeric( $id_or_email ) && is_email( $id_or_email ) ){
        $user  =  get_user_by( 'email', $id_or_email );
        if( $user ){
            $id_or_email = $user->ID;
        }
    }

    //if not user ID, return
    if( ! is_numeric( $id_or_email ) ){
        return $avatar;
    }

    //Find URL of saved avatar in user meta
    $saved = get_user_meta( $id_or_email, 'field_with_custom_avatar', true );
    //check if it is a URL
    if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
        //return saved image
        return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
    }

    //return normal
    return $avatar;

}
5
JPollock

必要なフックは get_avatar filter です。ユーザーのアバターを表す画像HTML要素を返します。

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    // Replace $avatar with your own image element, for example
    // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"

    return $avatar;

}

このフィルタを使用しても、ユーザーにgravatarを使用させることができます。ユーザーが自分のサイトにアバターをアップロードしたかどうかを確認してから使用できます。通常の$avatarは返されません。ユーザーが持っている場合はgravatarからのものになります。 (ユーザーのアバターを保存するために使用しているコードを質問に追加する場合は、正確に機能するコードを入力してください)。

add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {

    if( "user_has_uploaded_a_local_avatar" ) {
       // Replace $avatar with your own image element, for example
       // $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
    }

    // if user didn't upload a local avatar,
    // normal avatar will be used, which can be from gravatar
    return $avatar;

}
4
cybmeta

これは「私も」コメントですが解決策があります:)

だから私はcommentsセクションを有効にしたときにis_email($id_or_email)からエラーが出ました。

これがエラーです

strlen()は、パラメータ1が文字列であることを期待します。オブジェクトは、2891行目の/home/my_theme/public_html/wp-includes/formatting.phpで指定されたオブジェクトです

エラーが発生したため、$id_or_emailには実際には文字列ではなくオブジェクトが含まれています。

オブジェクト$id_or_email->comment_author_emailから電子メールの文字列を取得することで回避策を見つけました

それで私は$id_or_email$id_or_email->comment_author_emailに変えました、そして今私は正しいアバター写真をコメントとエラーなしに得ます。

0
atonus