web-dev-qa-db-fra.com

problème de priorité add_filter

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

2
kenarsuleyman
  1. Le filtre get_avatar accepte 6 paramètres et non 5.

  2. 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;
 } 
  1. Assurez-vous que la get_user_meta( $user_id, 'basic_user_avatar', true ) retourne quelque chose. Si rien n'est retourné, $avatar sera utilisé par défaut.
1
MinhTri