Avatar de usuário personalizado na listagem de usuários do Wordpress

3

Por padrão, o Wordpress usa o Gravatar para avatares de usuários.

Eu criei um campo personalizado para uploads de avatar e estou usando isso como avatares de usuários em várias páginas do tema.

No admin - na página de todos os usuários - há uma coluna que normalmente exibe o avatar do usuário (veja abaixo). Existe uma maneira de usar meu campo personalizado em vez do campo gravatar padrão?

    
por Koleon 06.06.2016 / 04:34

3 respostas

5

Como alternativa à minha outra resposta, você também pode usar o filtro get_avatar . Adere ao Sumit para me alertar para este.

O benefício de usar o filtro get_avatar é que o seu avatar personalizado deve ser aplicado em qualquer lugar Wordpress, em vez de apenas nesta lista de usuários como a minha outra resposta. Se você usar plugins que exibem avatares de usuários, esta solução também deve funcionar para eles, desde que eles funcionem bem e usem os filtros do Wordpress que eles deveriam estar usando:)

Os documentos oficiais do filtro get_avatar estão aqui .

No functions.php do seu tema, você desejará configurar sua função assim:

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;

}

Agora, falta muito disso porque, talvez de maneira frustrante, o Wordpress não envia um objeto de usuário ou ID de usuário limpo e agradável para esse filtro, de acordo com os documentos que ele pode nos fornecer:

  

um user_id, hash gravatar md5, email do usuário, objeto WP_User, objeto WP_Post ou objeto WP_Comment

A maioria deles podemos lidar - se tivermos um hash do Gravatar que seria um pouco difícil - mas o resto nós podemos usar as funções incorporadas do Wordpress para obter o objeto de usuário correto.

um exemplo que começa com isso nos documentos antigos do Wordpress . No entanto, para que esse filtro funcione corretamente em todos os lugares em uso, você precisará escrever um pouco mais para ter certeza de que pode detectar e lidar com um objeto de postagem ou comentário também (talvez usando o PHP is_a function ) e, em seguida, obter o post associado ou comentário autor.

    
por Tim Malone 06.06.2016 / 13:10
2

Poderíamos também usar um dos seguintes filtros, disponíveis desde o WordPress 4.2:

Em relação a como obter o ID do usuário do $id_or_email , podemos ver como isso é feito no 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;
    }
}

Seria mais fácil se o ID do usuário fosse passado para os retornos de chamada do filtro ou se houvesse uma função especial disponível para isso, por exemplo,

wp_get_user_from_id_or_email( $id_or_email )
    
por birgire 06.06.2016 / 14:06
1

EDIT: Minha solução original está abaixo, mas Sumit me alertou no comenta a existência do filtro get_avatar . Eu publiquei uma resposta adicional que mostra como implementar essa opção também.

Sim, você pode fazer isso.

As colunas exibidas em qualquer uma dessas "tabelas de lista" no Wordpress admin são filtráveis - portanto, ao usar uma função personalizada no functions.php do seu tema, você pode remover colunas ou adicionar as suas próprias.

Esta função permitirá que você remova a coluna padrão e adicione uma personalizada:

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;

}

Há muitas maneiras de fazer isso, mas basicamente eu peguei o array $columns e o massagei para colocar seu avatar personalizado na segunda posição. Você pode usar qualquer função de matriz PHP para fazer o que quiser com essas colunas.

Em seguida, precisamos informar ao Wordpress o que exibir nessa coluna 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;

}

Se a imagem não aparecer nas dimensões certas ou não for estilizada adequadamente, você poderá adicionar estilos ao Wordpress admin se você quiser ter mais controle sobre como as colunas e seu conteúdo são dimensionados.

Você também pode ler mais sobre os dois filtros que eu usei na documentação do Wordpress - manage_users_columns está no Codex e manage_users_custom_column está na referência de código mais recente. Existem filtros semelhantes para qualquer uma das outras tabelas, como publicações e páginas.

    
por Tim Malone 06.06.2016 / 04:52