このガイド をフォローすることでプロフィール写真をアップロードする機能を追加しました。
オンラインガイドやWP hooksに関するドキュメントが見つかりません。 コメント欄のGravatarのプロフィール写真をカスタムのアップロードされた画像に置き換える方法を教えてください
私のサイトで自分のプロフィール写真を変更するために、ユーザーにGravatarの登録を強制することはしたくありません。
ユーザーが自分のアバターを添付ファイルの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;
}
必要なフックは 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;
}
これは「私も」コメントですが解決策があります:)
だから私は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
に変えました、そして今私は正しいアバター写真をコメントとエラーなしに得ます。