WordPress用户列表中的自定义用户头像

时间:2016-06-06 作者:Koleon

默认情况下,Wordpress使用Gravatar作为用户化身。

我已经为头像上传创建了一个自定义字段,并将其用作用户在主题的各个页面上的头像。

在管理员页面的所有用户页面上,有一列通常会显示用户的化身(见下文)。有没有办法用我的自定义字段来代替默认的gravatar字段?

enter image description here

3 个回复
SO网友:Tim Malone

作为我的另一个答案的替代,您还可以使用get_avatar 滤器道具到Sumit 提醒我这件事。

使用get_avatar 过滤器是您的自定义头像,应该应用于Wordpress使用它的任何地方,而不是像我的其他答案那样仅在这个用户列表中。如果您使用显示用户头像的插件,这个解决方案也应该适用于他们,前提是他们玩得很好,并使用他们应该使用的Wordpress过滤器:)

这个official docs for the get_avatar filter are here.

在您的主题中functions.php, 您需要如下设置您的函数:

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;

}
现在缺少了很多东西,因为Wordpress没有向这个过滤器发送一个干净的用户对象或用户ID,这可能令人沮丧——根据它可以提供给我们的文档:

用户id、gravatar md5哈希、用户电子邮件、WP\\u用户对象、WP\\u Post对象或WP\\u Comment对象

其中大部分我们都可以处理——如果我们得到一个Gravatar哈希,这会有点困难——但其余的我们可以使用内置的Wordpress函数来获得正确的用户对象。

an example that gets started on this in the old Wordpress docs. 然而,为了使这个过滤器在任何使用它的地方都能正常工作,您需要额外编写一些内容,以确保您能够检测和处理通过它的帖子或评论对象(可能使用PHP is_a function) 然后获取相关帖子或评论作者。

SO网友:birgire

我们还可以使用WordPress 4.2中提供的以下过滤器之一:

关于如何从$id_or_email 我们可以看到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;
    }
}
如果将用户ID传递给过滤器回调,或者如果有一个特殊的函数可用于此,则会更容易。

wp_get_user_from_id_or_email( $id_or_email )

SO网友:Tim Malone

EDIT: 我最初的解决方案如下,但是Sumit 在评论中提醒我get_avatar filter. 我已经发布了an additional answer 这也说明了如何实现该选项。

是的,你可以这样做。

Wordpress admin中任何这些“列表表”中显示的列都是可过滤的,因此在主题的functions.php, 您可以删除列或添加自己的列。

此函数将允许您删除默认列并添加自定义列:

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;

}
有很多方法可以做到这一点,但在这方面,我基本上只是$columns 阵列并对其进行按摩,将您的自定义头像粘贴到第二个位置。可以使用任何PHP数组函数对这些列执行任何操作。

接下来,我们需要告诉Wordpress在其中显示什么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;

}
如果图像的尺寸不正确或样式不正确,您可以add styles to Wordpress admin 如果希望对列及其内容的大小进行更多控制。

您还可以阅读有关我在Wordpress文档中使用的两个过滤器的更多信息-manage_users_columns 在法典上manage_users_custom_column 位于较新的代码引用上。对于任何其他表(如POST和pages),都存在类似的过滤器。

相关推荐

GET_USERS丢失或跳过循环中的用户

我想分页通过所有用户在一个可湿性粉剂网站在100组。以下代码是简化版本:for($offset = 0; $offset < 100; $offset++) $args = ["number" => 100, \'orderby\' => \'ID\']; $args[\'offset\'] = ($offset - 1) * (int) $args[\'number\']; $users