WP Discourse SSO 不会同步由 Advanced Site Enhancements 提供的本地头像

你好,

我正在使用:

  • WordPress
  • WP Discourse(最新版本)
  • Advanced Site Enhancements (ASE),使用其本地用户头像功能(不使用 Gravatar)

头像在 WordPress 的所有地方都正确显示。

ASE 将附件 ID 存储在用户元字段中:

local_user_avatar_attachment_id

然而,在进行 WordPress SSO 登录时,Discourse 始终导入默认头像,而不是本地头像。

我已经尝试使用 wpdc_sso_avatar_url 过滤器返回媒体库 URL,但没有效果。

因此我有两个问题:

  1. WP Discourse 是否仍然使用 wpdc_sso_avatar_url 进行头像同步?
  2. 目前哪个函数或过滤器负责确定发送到 Discourse 的头像 URL?

任何指导都将不胜感激。

@miednr,是的,wpdc_sso_avatar_url 仍然用于头像同步。让我们看看能否帮你让它正常工作。

  1. 你是否在 DiscourseConnect Provider 设置中启用了 Force Avatar Update(强制更新头像)?
  2. 请分享你使用 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 );

我修改过几次,试图让它正常工作。不过,我想我之前有一个更好的版本。:wink:

如果能找到一个能正常工作的版本,那就太好了。

您是不是分享错了代码片段?那段代码使用的是 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,高级站点增强)开发人员的回复,这可能有助于缩小问题范围。

根据他们的说法:

  • ASE 挂钩了标准的 WordPress 头像 API:

  • get_avatar(优先级 5)

  • get_avatar_url(优先级 10)

  • get_avatar_data(优先级 10)

  • 目前尚无已知的与其他插件的兼容性问题。

  • 本地头像存储在媒体库中,附件 ID 保存在用户元数据字段中:

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(),我想知道:

  • WP Discourse 是在应用 wpdc_sso_avatar_url 过滤器之前还是之后调用 get_avatar_url()?

  • 在头像同步过程中,Discourse 对头像 URL(大小、可访问性、时机等)是否有任何特定要求?

如果有帮助,我很乐意运行其他测试或添加临时调试。

再次感谢您的帮助!

您是否在 Discourse 中启用了 discourse_connect_overrides_avatar 站点设置?

是的,它已被激活。