完整代码:加到 functions.php 末尾
/* ========================================
自包含用户头像体系(不依赖 WP User Profile Avatar 插件)
版本:v2 — 修复 size 参数不生效
======================================== */
// ========== 可配置:最终兜底默认头像 URL ==========
if ( ! defined( 'SHAN_DEFAULT_AVATAR_URL' ) ) {
define( 'SHAN_DEFAULT_AVATAR_URL', 'https://www.mylishi.cn/wp-content/plugins/wp-user-profile-avatar/assets/images/wp-user-original.png' );
}
/**
* 统一解析尺寸参数:命名尺寸 / 像素数字 / 数组 → 统一格式
*/
function shan_parse_avatar_size( $size ) {
if ( is_numeric( $size ) ) {
return array( (int) $size, (int) $size );
}
if ( is_string( $size ) ) {
$size = strtolower( trim( $size ) );
if ( $size === 'original' ) {
$size = 'full';
}
return $size;
}
if ( is_array( $size ) ) {
return $size;
}
return 'thumbnail';
}
/**
* 从任意尺寸参数中提取 [宽, 高] 数值,用于给
加 width/height
* 命名尺寸查 WordPress 全局 $_wp_additional_image_sizes + 默认尺寸
*/
function shan_get_avatar_dimensions( $size ) {
$size = shan_parse_avatar_size( $size );
// 已经是数组 [w, h]
if ( is_array( $size ) ) {
return array( (int) $size[0], (int) $size[1] );
}
// 命名尺寸:查 WordPress 注册的尺寸
global $_wp_additional_image_sizes;
$default_sizes = array(
'thumbnail' => array(
(int) get_option( 'thumbnail_size_w', 150 ),
(int) get_option( 'thumbnail_size_h', 150 ),
),
'medium' => array(
(int) get_option( 'medium_size_w', 300 ),
(int) get_option( 'medium_size_h', 300 ),
),
'large' => array(
(int) get_option( 'large_size_w', 1024 ),
(int) get_option( 'large_size_h', 1024 ),
),
'full' => array( 0, 0 ), // 原图不设宽高
);
if ( isset( $default_sizes[ $size ] ) ) {
return $default_sizes[ $size ];
}
if ( isset( $_wp_additional_image_sizes[ $size ] ) ) {
return array(
(int) $_wp_additional_image_sizes[ $size ]['width'],
(int) $_wp_additional_image_sizes[ $size ]['height'],
);
}
return array( 0, 0 );
}
/**
* 取站点默认头像 URL
*/
function shan_get_default_avatar_url( $size = 'thumbnail' ) {
$size = shan_parse_avatar_size( $size );
$att_id = get_option( 'wpupa_attachment_id' );
if ( ! empty( $att_id ) ) {
$img = wp_get_attachment_image_src( (int) $att_id, $size );
if ( ! empty( $img[0] ) ) {
return $img[0];
}
}
return SHAN_DEFAULT_AVATAR_URL;
}
/**
* 取指定用户的头像 URL(自包含核心函数)
* 优先级:_wpupa_url > _wpupa_attachment_id > 站点默认
*/
function shan_get_user_avatar_url( $user_id, $size = 'thumbnail' ) {
$user_id = (int) $user_id;
if ( $user_id <= 0 ) {
return shan_get_default_avatar_url( $size );
}
$size = shan_parse_avatar_size( $size );
// 1. 自定义 URL 头像
$custom_url = get_user_meta( $user_id, '_wpupa_url', true );
if ( ! empty( $custom_url ) ) {
return $custom_url;
}
// 2. 媒体库附件头像
$att_id = get_user_meta( $user_id, '_wpupa_attachment_id', true );
if ( ! empty( $att_id ) ) {
$img = wp_get_attachment_image_src( (int) $att_id, $size );
if ( ! empty( $img[0] ) ) {
return $img[0];
}
}
// 3. 站点默认
return shan_get_default_avatar_url( $size );
}
/**
* 判断用户是否有本地上传的头像(附件或自定义URL)
*/
function shan_has_local_avatar( $user_id ) {
$user_id = (int) $user_id;
if ( $user_id <= 0 ) {
return false;
}
return ! empty( get_user_meta( $user_id, '_wpupa_attachment_id', true ) )
|| ! empty( get_user_meta( $user_id, '_wpupa_url', true ) );
}
/* ========================================
全站 get_avatar_url 过滤(可选但推荐)
======================================== */
add_filter( 'get_avatar_url', 'shan_override_avatar_url', 20, 3 );
function shan_override_avatar_url( $url, $id_or_email, $args ) {
if ( is_admin() && function_exists( 'get_current_screen' ) ) {
$screen = get_current_screen();
if ( $screen && $screen->base === 'options-discussion' ) {
return $url;
}
}
$user_id = 0;
if ( is_object( $id_or_email ) ) {
if ( ! empty( $id_or_email->user_id ) ) {
$user_id = (int) $id_or_email->user_id;
} elseif ( ! empty( $id_or_email->comment_author_email ) ) {
$u = get_user_by( 'email', $id_or_email->comment_author_email );
if ( $u ) {
$user_id = $u->ID;
}
}
} elseif ( is_numeric( $id_or_email ) ) {
$user_id = (int) $id_or_email;
} elseif ( is_string( $id_or_email ) && is_email( $id_or_email ) ) {
$u = get_user_by( 'email', $id_or_email );
if ( $u ) {
$user_id = $u->ID;
}
}
$size = isset( $args['size'] ) ? $args['size'] : 'thumbnail';
if ( $user_id > 0 && shan_has_local_avatar( $user_id ) ) {
return shan_get_user_avatar_url( $user_id, $size );
}
if ( ! empty( $args['default'] ) && filter_var( $args['default'], FILTER_VALIDATE_URL ) ) {
return $args['default'];
}
return shan_get_default_avatar_url( $size );
}
/* ========================================
短代码:
— v2 修复 size 不生效
======================================== */
add_shortcode( 'current_user_avatar', 'shan_current_user_avatar_shortcode' );
function shan_current_user_avatar_shortcode( $atts ) {
$atts = shortcode_atts( array(
'size' => 'thumbnail',
'guest' => '',
'class' => 'current-user-avatar',
), $atts, 'current_user_avatar' );
$size = shan_parse_avatar_size( $atts['size'] );
$dimensions = shan_get_avatar_dimensions( $atts['size'] );
$wh_attr = ( $dimensions[0] > 0 )
? sprintf( ' width="%d" height="%d"', $dimensions[0], $dimensions[1] )
: '';
// 未登录
if ( ! is_user_logged_in() ) {
if ( ! empty( $atts['guest'] ) ) {
return esc_html( $atts['guest'] );
}
return sprintf(
'
',
esc_url( shan_get_default_avatar_url( $size ) ),
esc_attr( $atts['class'] ),
$wh_attr
);
}
$user = wp_get_current_user();
$user_id = (int) $user->ID;
// 优先用自定义 URL(外部图,无法用 WP 图像函数,手动加宽高)
$custom_url = get_user_meta( $user_id, '_wpupa_url', true );
if ( ! empty( $custom_url ) ) {
return sprintf(
'
',
esc_url( $custom_url ),
esc_attr( $user->display_name ),
esc_attr( $atts['class'] ),
$wh_attr
);
}
// 媒体库附件头像:用 wp_get_attachment_image() 输出,自动带 width/height/srcset
$att_id = get_user_meta( $user_id, '_wpupa_attachment_id', true );
if ( ! empty( $att_id ) ) {
$img = wp_get_attachment_image(
(int) $att_id,
$size,
false,
array(
'class' => esc_attr( $atts['class'] ),
'alt' => esc_attr( $user->display_name ),
)
);
if ( ! empty( $img ) ) {
return $img;
}
}
// 兜底:站点默认头像
return sprintf(
'
',
esc_url( shan_get_default_avatar_url( $size ) ),
esc_attr( $user->display_name ),
esc_attr( $atts['class'] ),
$wh_attr
);
}
/* ========================================
PHP 直接调用(主题模板里用)
======================================== */
// 取当前登录用户头像 URL(注意:URL 本身不含尺寸,输出时请加 width/height)
function shan_get_current_user_avatar( $size = 'thumbnail', $guest_text = '' ) {
if ( ! is_user_logged_in() ) {
return ! empty( $guest_text ) ? esc_html( $guest_text ) : '';
}
return shan_get_user_avatar_url( get_current_user_id(), $size );
}
// 取任意用户头像 URL
function shan_get_user_avatar( $user_id, $size = 'thumbnail' ) {
return shan_get_user_avatar_url( $user_id, $size );
}
// 直接输出当前用户
标签(带正确宽高,模板里推荐用这个)
function shan_current_user_avatar_img( $size = 'thumbnail', $class = 'current-user-avatar', $guest_text = '' ) {
if ( ! is_user_logged_in() ) {
return ! empty( $guest_text ) ? esc_html( $guest_text ) : '';
}
$user = wp_get_current_user();
$parsed = shan_parse_avatar_size( $size );
$dimensions = shan_get_avatar_dimensions( $size );
$wh_attr = ( $dimensions[0] > 0 )
? sprintf( ' width="%d" height="%d"', $dimensions[0], $dimensions[1] )
: '';
$custom_url = get_user_meta( $user->ID, '_wpupa_url', true );
if ( ! empty( $custom_url ) ) {
return sprintf( '
',
esc_url( $custom_url ), esc_attr( $user->display_name ), esc_attr( $class ), $wh_attr );
}
$att_id = get_user_meta( $user->ID, '_wpupa_attachment_id', true );
if ( ! empty( $att_id ) ) {
$img = wp_get_attachment_image( (int) $att_id, $parsed, false, array(
'class' => esc_attr( $class ),
'alt' => esc_attr( $user->display_name ),
) );
if ( ! empty( $img ) ) {
return $img;
}
}
return sprintf( '
',
esc_url( shan_get_default_avatar_url( $parsed ) ), esc_attr( $user->display_name ), esc_attr( $class ), $wh_attr );
}
使用方法
短代码(文章 / 页面 / Elementor 里用)
表格Elementor 里用:拖一个 Shortcode(短代码) 小部件,填
| 短代码 | 效果 |
|---|---|
| 【current_user_avatar】 | 默认 64px 圆形头像 |
| 【current_user_avatar size=”96″】 | 96px 头像 |
| 【current_user_avatar size=”128″】 | 128px 头像 |
| 【current_user_avatar guest=”请先登录”】 | 未登录时显示「请先登录」文字 |
| 【current_user_avatar class=”header-avatar”】 | 自定义 CSS class,方便写样式 |
组合使用(头像 + 名称,做欢迎栏)
欢迎,访客
登录后显示:圆形小头像 + 「欢迎,张三」 未登录显示:默认头像 + 「欢迎,访客」(或用 guest 参数自定义)
PHP 直接调用(主题模板里用)
指定尺寸和未登录文字:
配套 CSS(加到 style.css,可选)
.current-user-avatar {
border-radius: 50%; /* 圆形 */
display: inline-block;
vertical-align: middle;
margin-right: 8px;
border: 2px solid #eee;
}
关于图片文件本身的尺寸
size=”96″ 现在能控制显示尺寸了。但如果你希望加载的图片文件本身就是 96×96(省流量),需要 WordPress 在上传时生成这个尺寸。两种方式:
用命名尺寸:size=”thumbnail”(默认 150)、size=”medium”(默认 300),这些 WordPress 默认会生成中间文件。
注册自定义尺寸:在主题 functions.php 里加 add_image_size( ‘avatar-96’, 96, 96, true );,然后用 size=”avatar-96″,已有图片需要用「Regenerate Thumbnails」插件重新生成。










