Sostituire Gravatar con immagini caricate?
Ho aggiunto la funzionalità per caricare l'immagine del profilo seguendo QUESTA guida.
Non riesco a trovare una guida online o documentazione sugli hook di WP.. Come sostituire le immagini del profilo Gravatar (nella sezione commenti) con immagini personalizzate caricate?
Non voglio costringere i miei utenti a registrarsi su Gravatar per cambiare la loro immagine del profilo sul mio sito.
Supponendo che l'utente abbia salvato il proprio avatar, come ID di un allegato, memorizzato nei metadati utente nel campo field_with_custom_avatar_id
, puoi fare così per mostrare quell'allegato se il valore è salvato:
add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {
//Se è un'email, prova a trovare l'ID utente
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;
}
}
//se non è un ID utente, restituisci
if( ! is_numeric( $id_or_email ) ){
return $avatar;
}
//Trova l'ID dell'allegato salvato nei metadati utente
$saved = get_user_meta( $id_or_email, 'field_with_custom_avatar_id', true );
if( 0 < absint( $saved ) ) {
//restituisci l'immagine salvata
return wp_get_attachment_image( $saved, [ $size, $size ], false, ['alt' => $alt] );
}
//restituisci l'avatar normale
return $avatar;
}
Oppure, se è salvato come URL dell'immagine, nel campo dei metadati utente field_with_custom_avatar
-
add_filter( 'get_avatar', 'slug_get_avatar', 10, 5 );
function slug_get_avatar( $avatar, $id_or_email, $size, $default, $alt ) {
//Se è un'email, prova a trovare l'ID utente
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;
}
}
//se non è un ID utente, restituisci
if( ! is_numeric( $id_or_email ) ){
return $avatar;
}
//Trova l'URL dell'avatar salvato nei metadati utente
$saved = get_user_meta( $id_or_email, 'field_with_custom_avatar', true );
//verifica se è un URL
if( filter_var( $saved, FILTER_VALIDATE_URL ) ) {
//restituisci l'immagine salvata
return sprintf( '<img src="%" alt="%" />', esc_url( $saved ), esc_attr( $alt ) );
}
//restituisci l'avatar normale
return $avatar;
}

... il temuto $id_or_email
;-) Speriamo di renderlo più facile da gestire, con le modifiche proposte in #41544.

L'hook che ti serve è il get_avatar
filter. Restituisce l'elemento HTML dell'immagine che rappresenta l'avatar dell'utente.
add_filter( 'get_avatar', 'cyb_get_avatar', 10, 5 );
function cyb_get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = '' ) {
// Sostituisci $avatar con il tuo elemento immagine, ad esempio
// $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
return $avatar;
}
Nota che utilizzando questo filtro, puoi comunque permettere agli utenti di usare gravatar. Potresti verificare se l'utente ha caricato un avatar sul tuo sito, quindi usarlo, altrimenti restituisci il normale $avatar
, che sarà da gravatar se l'utente ne ha uno. (Se aggiungi alla domanda il codice che usi per memorizzare gli avatar degli utenti, posso fornirti un codice funzionante esatto):
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" ) {
// Sostituisci $avatar con il tuo elemento immagine, ad esempio
// $avatar = "<img alt='$alt' src='your_new_avatar_url' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
}
// se l'utente non ha caricato un avatar locale,
// verrà usato l'avatar normale, che può essere da gravatar
return $avatar;
}

Questo è un commento "anche io" ma con una soluzione :)
Quando ho abilitato la sezione commenti ho ricevuto un errore da is_email($id_or_email)
.
Ecco l'errore
strlen() expects parameter 1 to be string, object given in /home/my_theme/public_html/wp-includes/formatting.php on line 2891
L'errore si verifica perché $id_or_email
contiene effettivamente un oggetto e non una stringa.
Ho trovato una soluzione recuperando la stringa email dall'oggetto $id_or_email->comment_author_email
Quindi ho cambiato $id_or_email
in $id_or_email->comment_author_email
e ora ottengo l'immagine dell'avatar corretta per i commenti senza errori.

Dovresti modificare la tua risposta per maggiore chiarezza. Quando ho iniziato a leggerla, sembrava quasi che non fosse una risposta, ma piuttosto un problema "anche a me". Quindi, ho quasi segnalato che non era una risposta. Potresti modificarla per essere più diretto nel rispondere a una vecchia domanda. Le domande più vecchie spesso necessitano di risposte aggiornate man mano che il codice progredisce, quindi è normale aggiungere risposte tardive - basta renderlo chiaro ;-) (E benvenuto su WPSE)

Se hai impostato un'immagine del profilo personalizzata o caricata e hai bisogno di visualizzarla sul front end, puoi utilizzare la seguente funzione.
<?php echo get_avatar( $id_or_email, $size, $default, $alt, $args ); ?>
Se devi cambiare il tuo gravatar con un'immagine del profilo personalizzata, puoi fare riferimento al seguente link: http://www.wpbeginner.com/wp-tutorials/how-to-change-the-default-gravatar-on-wordpress/
