¿Reemplazar Gravatar con imágenes subidas?

23 nov 2015, 07:14:35
Vistas: 22K
Votos: 5

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.

6
Comentarios

¿Has considerado Buddypress?

Dan Alexander Dan Alexander
23 nov 2015 08:38:53

¿así que prefieres obligarlos potencialmente a subir una imagen en cada sitio? No soy fan de gravatar pero este es exactamente el único problema que resuelve.

Mark Kaplun Mark Kaplun
23 nov 2015 10:37:23

@MarkKaplun usando el filtro get_avatar, los usuarios aún pueden usar gravatar. Mira mi respuesta. Normalmente no recomiendo plugins de terceros, menos aún si no se ha actualizado por mucho tiempo, pero local simple avatar hace un buen trabajo y también agrega valoraciones de audiencia a los avatares locales dando una solución completa. Puede ser un muy buen punto de partida para tu propio plugin.

cybmeta cybmeta
23 nov 2015 12:05:48

@cybmeta, claro que es posible y útil, solo cuestiono la lógica de hacerlo en el contexto de la pregunta. Probablemente sea más fácil obtener una imagen en Gravatar que cualquier implementación que use @Noob. Si la razón no está relacionada con privacidad o moderación, entonces no veo cómo una solución local puede ser mejor que Gravatar. Para mí hoy tiene más sentido permitir que el usuario use su avatar de Facebook, Twitter o Google si tu principal preocupación es la conveniencia del usuario.

Mark Kaplun Mark Kaplun
23 nov 2015 12:19:12

Nadie dijo que sea mejor ;). Personalmente me gusta la idea de no obligar a tus usuarios a usar un servicio de terceros, ya sea Gravatar, Facebook o cualquier otro, si quieren tener una experiencia completa en tu sitio. Por supuesto, usar servicios de redes sociales populares puede ser una ventaja para tu sitio, pero también ofrecer una experiencia completa a tus usuarios. No es mejor ni peor, solo una elección que podemos tomar como dueños del sitio web. Y el contexto de la pregunta no era obligar a subir avatares locales, era lo contrario, no obligar a usar Gravatar (puede extenderse a no obligar el uso de un servicio de terceros).

cybmeta cybmeta
23 nov 2015 12:23:56

¡Gracias chicos por sus respuestas y discusiones! Las procesaré y probaré pronto. Tengo mis razones para no usar Gravatar.

N00b N00b
23 nov 2015 23:14:49
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 4
2

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;

}
16 nov 2017 17:14:25
Comentarios

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

birgire birgire
16 nov 2017 18:47:51

Hola. Hice tu snippet para el filtro get_avatar_url. Funciona en todos lados excepto en comment_list. Dice strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891

wpdev wpdev
25 dic 2018 15:34:04
0

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;

}
23 nov 2015 11:45:57
2

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.

8 ene 2019 20:52:49
Comentarios

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)

butlerblog butlerblog
8 ene 2019 21:50:36

Sí, primero intenté escribir esto como un comentario para bilimokur, pero necesito 50 puntos de reputación para poder hacer un comentario :( Voy a editar esto para aclarar que en realidad es un comentario de "yo también" pero con una solución :)

atonus atonus
8 ene 2019 22:38:26
1
-2

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/

23 nov 2015 07:53:10
Comentarios

votado negativamente porque básicamente la respuesta es "ve a leer algún recurso externo" que podría ser útil en el momento de escribirse, pero no estar disponible más tarde. Las respuestas deben ser lo más autónomas posible.

Mark Kaplun Mark Kaplun
16 nov 2017 17:46:47