J'utilise des avatars d'utilisateur de base pour utiliser un avatar local dans wordpress. Et j’ai une fonction simple dans mon functions.php pour obtenir un lien direct avec un avatar. Mon problème est que si j'utilise la fonction get_avatar dans mes fonctions php, il retourne gravatar img mais si j'utilise la fonction get_avatar dans mes pages frontales, il retourne des avatars locaux. Voici le code des plugins
public function __construct() {
// Text domain
$this->load_textdomain();
// Actions
add_action( 'admin_init', array( $this, 'admin_init' ) );
add_action( 'show_user_profile', array( $this, 'edit_user_profile' ) );
add_action( 'edit_user_profile', array( $this, 'edit_user_profile' ) );
add_action( 'personal_options_update', array( $this, 'edit_user_profile_update' ) );
add_action( 'edit_user_profile_update', array( $this, 'edit_user_profile_update' ) );
add_action( 'bbp_user_edit_after_about', array( $this, 'bbpress_user_profile' ) );
// Shortcode
add_shortcode( 'basic-user-avatars', array( $this, 'shortcode' ) );
// Filters
add_filter( 'get_avatar', array( $this, 'get_avatar' ), 10, 5 );
add_filter( 'avatar_defaults', array( $this, 'avatar_defaults' ) );
}
public function get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = false ) {
// Determine if we recive an ID or string
if ( is_numeric( $id_or_email ) )
$user_id = (int) $id_or_email;
elseif ( is_string( $id_or_email ) && ( $user = get_user_by( 'email', $id_or_email ) ) )
$user_id = $user->ID;
elseif ( is_object( $id_or_email ) && ! empty( $id_or_email->user_id ) )
$user_id = (int) $id_or_email->user_id;
if ( empty( $user_id ) )
return $avatar;
$local_avatars = get_user_meta( $user_id, 'basic_user_avatar', true );
if ( empty( $local_avatars ) || empty( $local_avatars['full'] ) )
return $avatar;
$size = (int) $size;
if ( empty( $alt ) )
$alt = get_the_author_meta( 'display_name', $user_id );
$author_class = is_author( $user_id ) ? ' current-author' : '' ;
$avatar = "<img alt='" . esc_attr( $alt ) . "' src='" . $local_avatars['full'] . "' class='avatar avatar-{$size}{$author_class} photo' height='{$size}' width='{$size}' />";
return apply_filters( 'basic_user_avatar', $avatar );
}
J'ai essayé d'utiliser une priorité plus basse dans add_filter ('get_avatar') mais si j'utilise des plugis de priorité plus faible, cela ne fonctionne pas. Probablement parce que apply_filters dans l'instruction return. Mais je ne sais pas quel est le problème exactement. Comment puis-je résoudre ce problème? Merci
Le filtre get_avatar accepte 6 paramètres et non 5.
Le $ id_or_email peut également être une instance de WP_Post
, WP_User
ou une chaîne de hachage md5. Il est donc préférable d'extraire $user_id
comme ceci:
if ( is_numeric( $id_or_email ) ) {
$user_id = $id_or_email;
} elseif ( is_string($id_or_email) ) {
if ( is_email($id_or_email) ) {
$user = get_user_by('email', $id_or_email);
$user_id = $user->ID;
} else { // md5 hash string
// Do something.
}
} elseif ( is_object($id_or_email) ) {
if ($id_or_email instanceof \WP_User) {
$user_id = $id_or_email->ID;
} elseif ($id_or_email instanceof \WP_Post) {
$user_id = $id_or_email->post_author;
} else {
$user_id = $id_or_email->user_id;
}
} else {
return $avatar;
}
get_user_meta( $user_id, 'basic_user_avatar', true )
retourne quelque chose. Si rien n'est retourné, $avatar
sera utilisé par défaut.