web-dev-qa-db-fra.com

Avatar d'utilisateur personnalisé dans la liste d'utilisateurs Wordpress

Par défaut, Wordpress utilise Gravatar pour les avatars des utilisateurs.

J'ai créé un champ personnalisé pour les téléchargements d'avatar, que j'utilise comme avatars des utilisateurs sur différentes pages du thème.

Dans la page d'administration de tous les utilisateurs, il y a une colonne qui devrait normalement afficher l'avatar de l'utilisateur (voir ci-dessous). Est-il possible d’utiliser mon champ personnalisé à la place du champ gravatar par défaut?

 enter image description here 

3
Koleon

Comme alternative à mon autre réponse, vous pouvez également utiliser le filtre get_avatar. Des accessoires pour (Sumit } _ m'avertir de celui-ci.

L'avantage d'utiliser le filtre get_avatar est que votre avatar personnalisé devrait être appliqué n'importe où / Wordpress l'utilise, plutôt que simplement dans cette liste d'utilisateurs, comme mon autre réponse le traite. Si vous utilisez des plug-ins affichant des avatars, cette solution devrait également fonctionner pour eux, à condition qu'ils jouent correctement et utilisent les filtres Wordpress qu'ils devraient utiliser :)

Les les documents officiels du filtre get_avatar sont ici .

Dans le functions.php de votre thème, vous voudrez configurer votre fonction de la manière suivante:

add_filter("get_avatar", "wpse_228870_custom_user_avatar", 1, 5);

function wpse_228870_custom_user_avatar($avatar, $id_or_email, $size, $alt, $args){

  // determine which user we're asking about - this is the hard part!
  // ........

  // get your custom field here, using the user's object to get the correct one
  // ........

  // enter your custom image output here
  $avatar = '<img alt="' . $alt . '" src="image.png" width="' . $size . '" height="' . $size . '" />';

  return $avatar;

}

Il manque maintenant beaucoup à cela car, peut-être frustrant, Wordpress n'envoie pas d'objet utilisateur propre ou d'ID utilisateur propre à Nice à ce filtre - selon la documentation qu'il peut nous donner:

un ID utilisateur, un hachage gravatar md5, une adresse électronique d'utilisateur, un objet WP_User, un objet WP_Post ou un objet WP_Comment

La plupart de ces problèmes peuvent être résolus - si nous obtenons un hachage Gravatar, ce serait un peu difficile - mais pour le reste, nous pouvons utiliser les fonctions intégrées de Wordpress pour obtenir le bon objet utilisateur.

Il y a un exemple qui commence dans ceci dans les anciens documents Wordpress . Cependant, pour que ce filtre fonctionne correctement où qu'il soit utilisé, vous devrez écrire un petit extra pour vous assurer de pouvoir détecter et traiter un objet de publication ou de commentaire également (en utilisant peut-être le PHP is_a function ), puis obtenir l'auteur de la publication ou du commentaire associé.

5
Tim Malone

Nous pourrions également utiliser l'un des filtres suivants, disponibles depuis WordPress 4.2:

En ce qui concerne la façon d’obtenir l’ID utilisateur à partir du $id_or_email, nous pouvons voir comment cela se passe dans le core :

$email_hash = '';
$user = $email = false;
if ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {
    $id_or_email = get_comment( $id_or_email );
}
// Process the user identifier.
if ( is_numeric( $id_or_email ) ) {
    $user = get_user_by( 'id', absint( $id_or_email ) );
} elseif ( is_string( $id_or_email ) ) {
    if ( strpos( $id_or_email, '@md5.gravatar.com' ) ) {
        // md5 hash
        list( $email_hash ) = explode( '@', $id_or_email );
    } else {
        // email address
        $email = $id_or_email;
    }
} elseif ( $id_or_email instanceof WP_User ) {
    // User Object
    $user = $id_or_email;
} elseif ( $id_or_email instanceof WP_Post ) {
    // Post Object
    $user = get_user_by( 'id', (int) $id_or_email->post_author );
} elseif ( $id_or_email instanceof WP_Comment ) {
    /**
     * Filter the list of allowed comment types for retrieving avatars.
     *
     * @since 3.0.0
     *
     * @param array $types An array of content types. Default only contains 'comment'.
     */
    $allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
    if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) {
        $args['url'] = false;
        /** This filter is documented in wp-includes/link-template.php */
        return apply_filters( 'get_avatar_data', $args, $id_or_email );
    }
    if ( ! empty( $id_or_email->user_id ) ) {
        $user = get_user_by( 'id', (int) $id_or_email->user_id );
    }
    if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
        $email = $id_or_email->comment_author_email;
    }
}

Il serait plus facile si l’ID utilisateur était transmis aux rappels de filtre ou si une fonction spéciale était disponible à cet effet, par exemple.

wp_get_user_from_id_or_email( $id_or_email )
2
birgire

EDIT: Ma solution initiale est ci-dessous, mais Sumit m'a alerté dans les commentaires sur l'existence du filtre get_avatar . J'ai posté une réponse supplémentaire qui montre également comment implémenter cette option.


Oui, tu peux faire ça.

Les colonnes affichées dans n'importe lequel de ces "tableaux de liste" dans Wordpress admin sont filtrables - vous pouvez donc utiliser une fonction personnalisée dans le functions.php de votre thème pour supprimer des colonnes ou ajouter les vôtres.

Cette fonction vous permettra à la fois de supprimer la colonne par défaut et d’en ajouter une personnalisée:

add_filter("manage_users_columns", "wpse_228870_custom_user_avatar");

function wpse_228870_custom_user_avatar($columns){

    $columns = 
        array_slice($columns, 0, 1) // leave the checkbox in place (the 0th column)
        + array("custom_avatar" => "") // splice in a custom avatar column in the next space
        + array_slice($columns, 1) // include any other remaining columns (the 1st column onwards)
    ;

    return $columns;

}

Vous pouvez le faire de nombreuses façons, mais dans ce cas, je viens de prendre le tableau $columns et de le masser pour coller votre avatar personnalisé à la deuxième position. Vous pouvez utiliser n’importe quelle fonction de tableau PHP pour faire tout ce que vous voulez sur ces colonnes.

Ensuite, nous devons dire à Wordpress quoi afficher dans cette colonne custom_avatar:

add_filter("manage_users_custom_column", "wpse_228870_custom_user_avatar_column", 10, 3);

function wpse_228870_custom_user_avatar_column($output, $column_name, $user_id){

    // bow out early if this isn't our custom column!
    if($column_name != "custom_avatar"){ return $output; }

    // get your custom field here, using $user_id to get the correct one
    // ........

    // enter your custom image output here
    $output = '<img src="image.png" width="50" height="50" />';

    return $output;

}

Si l'image ne présente pas les bonnes dimensions ou si son style n'est pas adapté, vous pouvez ajouter des styles à Wordpress admin si vous souhaitez mieux contrôler la façon dont les colonnes et leur contenu sont dimensionnés.

Vous pouvez également en savoir plus sur les deux filtres que j'ai utilisés dans la documentation Wordpress - manage_users_columns est sur le Codex et manage_users_custom_column est sur la référence de code plus récente. Des filtres similaires existent pour toutes les autres tables, telles que les publications et les pages.

1
Tim Malone