你好,
我正在使用:
- WordPress
- WP Discourse(最新版本)
- Advanced Site Enhancements (ASE),使用其本地用户头像功能(不使用 Gravatar)
头像在 WordPress 的所有地方都正确显示。
ASE 将附件 ID 存储在用户元字段中:
local_user_avatar_attachment_id
然而,在进行 WordPress SSO 登录时,Discourse 始终导入默认头像,而不是本地头像。
我已经尝试使用 wpdc_sso_avatar_url 过滤器返回媒体库 URL,但没有效果。
因此我有两个问题:
- WP Discourse 是否仍然使用
wpdc_sso_avatar_url 进行头像同步?
- 目前哪个函数或过滤器负责确定发送到 Discourse 的头像 URL?
任何指导都将不胜感激。
angus
(Angus McLeod)
2
嘿 @miednr,是的,wpdc_sso_avatar_url 仍然用于头像同步。让我们看看能否帮你让它正常工作。
- 你是否在 DiscourseConnect Provider 设置中启用了
Force Avatar Update(强制更新头像)?
- 请分享你使用
wpdc_sso_avatar_url 的函数。
你好 @angus !
感谢你的关注。是的,我已经启用了“强制更新头像”。
我目前的函数如下:
<?php
add_filter( 'get_avatar_url', function( $url, $id_or_email, $args ) {
$user = false;
if ( is_numeric( $id_or_email ) ) {
$user = get_user_by( 'id', (int) $id_or_email );
} elseif ( $id_or_email instanceof WP_User ) {
$user = $id_or_email;
}
if ( ! $user ) {
return $url;
}
$avatar_id = get_user_meta( $user->ID, 'local_user_avatar_attachment_id', true );
if ( ! $avatar_id ) {
return $url;
}
$local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );
return $local_avatar_url ?: $url;
}, 10, 3 );
我修改过几次,试图让它正常工作。不过,我想我之前有一个更好的版本。
如果能找到一个能正常工作的版本,那就太好了。
angus
(Angus McLeod)
4
您是不是分享错了代码片段?那段代码使用的是 get_avatar_url 过滤器。正如您所注意到的,正确的过滤器是 wpdc_sso_avatar_url。
你好 @angus
我分享了一种不同的方法,这是我尝试过的。抱歉。这是我能分享的最佳代码片段:
add_filter( 'wpdc_sso_avatar_url', function( $avatar_url, $user_id ) {
$avatar_id = get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );
if ( ! $avatar_id ) {
return $avatar_url;
}
$local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );
if ( ! $local_avatar_url ) {
return $avatar_url;
}
return esc_url_raw( $local_avatar_url );
}, 10, 2 );
我尝试了这个代码片段。ASE 将本地头像附件 ID 存储在用户元字段 local_user_avatar_attachment_id 中。该附件 ID 存在并指向媒体库中的图片。然而,在 WordPress 登录/SSO 同步后,Discourse 仍然导入默认头像。
我还尝试了使用 thumbnail 图片尺寸代替 full 的相同方法,但结果相同。
感谢查看!
嗨 @angus,
我收到了 ASE(Advanced Site Enhancements,高级站点增强)开发人员的回复,这可能有助于缩小问题范围。
根据他们的说法:
local_user_avatar_attachment_id
他们还建议手动获取头像 URL,如下所示:
$attachment_id = (int) get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );
if ( $attachment_id ) {
$avatar_url = wp_get_attachment_image_url( $attachment_id, array( 128, 128 ) );
}
我也尝试在 wpdc_sso_avatar_url 过滤器中使用此方法,但结果没有变化——登录后仍然使用默认的 Discourse 头像。
由于 ASE 声称挂钩了 get_avatar_url(),我想知道:
如果有帮助,我很乐意运行其他测试或添加临时调试。
再次感谢您的帮助!
angus
(Angus McLeod)
7
您是否在 Discourse 中启用了 discourse_connect_overrides_avatar 站点设置?