¿Reemplazar Gravatar con imágenes subidas?
He agregado la funcionalidad para subir fotos de perfil siguiendo ESTA guía.
No puedo encontrar una guía en línea o documentación sobre los hooks de WordPress.. ¿Cómo reemplazar las imágenes de perfil de Gravatar (en la sección de comentarios) con imágenes personalizadas subidas?
No quiero obligar a mis usuarios a registrarse en Gravatar para cambiar su foto de perfil en mi sitio.
Suponiendo que el usuario tiene su avatar guardado, como el ID de un adjunto, almacenado en los metadatos del usuario, en el campo field_with_custom_avatar_id
, podrías hacer esto para mostrar ese adjunto si el valor está guardado:
add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {
// Si es un email, intentar encontrar el ID del usuario
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;
}
}
// Si no es un ID de usuario, retornar
if( ! is_numeric( $id_or_email ) ){
return $avatar;
}
// Buscar el ID del adjunto guardado en los metadatos del usuario
$saved = get_user_meta( $id_or_email, 'field_with_custom_avatar_id', true );
if( 0 < absint( $saved ) ) {
// Retornar la imagen guardada
return wp_get_attachment_image( $saved, [ $size, $size ], false, ['alt' => $alt] );
}
// Retornar el avatar normal
return $avatar;
}
O, si está guardado como una URL de la imagen, en el campo de metadatos del usuario field_with_custom_avatar
-
add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {
// Si es un email, intentar encontrar el ID del usuario
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;
}
}
// Si no es un ID de usuario, retornar
if( ! is_numeric( $id_or_email ) ){
return $avatar;
}
// Buscar la URL del avatar guardado en los metadatos del usuario
$saved = get_user_meta( $id_or_email, 'field_with_custom_avatar', true );
// Verificar si es una URL válida
if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
// Retornar la imagen guardada
return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
}
// Retornar el avatar normal
return $avatar;
}

... el temido $id_or_email
;-) Con suerte podemos hacerlo más fácil de manejar, con los cambios propuestos en #41544.

El hook que necesitas es el get_avatar
filter. Este devuelve el elemento HTML de la imagen que representa el avatar del usuario.
add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {
// Reemplaza $avatar con tu propio elemento de imagen, por ejemplo
// $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
return $avatar;
}
Ten en cuenta que usando este filtro, aún puedes permitir que los usuarios utilicen Gravatar. Podrías verificar si el usuario ha subido un avatar a tu sitio, y entonces usarlo; si no, devuelves el $avatar
normal, que será de Gravatar si el usuario tiene uno. (Si añades al pregunta el código que usas para almacenar los avatares de usuario, puedo proporcionar un código exacto que funcione):
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" ) {
// Reemplaza $avatar con tu propio elemento de imagen, por ejemplo
// $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
}
// si el usuario no subió un avatar local,
// se usará el avatar normal, que puede ser de Gravatar
return $avatar;
}

Este es un comentario "yo también" pero con una solución :)
Cuando habilité la sección de comentarios, recibí un error de is_email($id_or_email)
.
Aquí está el error:
strlen() espera que el parámetro 1 sea una cadena, se proporcionó un objeto en /home/my_theme/public_html/wp-includes/formatting.php en la línea 2891
El error ocurre porque $id_or_email
contiene en realidad un objeto y no una cadena.
Encontré una solución alternativa extrayendo el correo electrónico como cadena del objeto $id_or_email->comment_author_email
.
Así que cambié $id_or_email
por $id_or_email->comment_author_email
y ahora obtengo la imagen de avatar correcta en los comentarios sin errores.

Deberías editar tu respuesta para mayor claridad. Cuando comencé a leer esto, casi parecía que no era una respuesta, sino más bien un problema de "yo también". Por lo tanto, casi lo marqué como no una respuesta. Podrías editarlo para ser más directo al abordar una pregunta antigua. Las preguntas antiguas a menudo necesitan respuestas actualizadas a medida que el código sigue avanzando, así que es completamente normal agregar respuestas tardías, solo asegúrate de que quede claro que eso es lo que es ;-) (Y bienvenido a WPSE)

Si has configurado una imagen de perfil personalizada o cargada y necesitas mostrarla en el frontend, puedes usar la siguiente función:
<?php echo get_avatar( $id_or_email, $size, $default, $alt, $args ); ?>
Si necesitas cambiar tu gravatar por una imagen de perfil personalizada, puedes consultar el siguiente enlace: http://www.wpbeginner.com/wp-tutorials/how-to-change-the-default-gravatar-on-wordpress/
