WP Discourse SSO가 Advanced Site Enhancements로 제공되는 로컬 아바타를 동기화하지 않습니다

안녕하세요,

현재 사용 중인 환경은 다음과 같습니다:

  • WordPress
  • WP Discourse (최신 버전)
  • Advanced Site Enhancements (ASE)의 Local User Avatar 기능 사용 (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을 결정하는 데 책임이 있는 함수나 필터는 무엇입니까?

도움 주시면 감사하겠습니다.

Hey @miednr, 네, wpdc_sso_avatar_url은 여전히 아바타 동기화에 사용되고 있습니다. 귀하에게 정상 작동하도록 해볼 수 있는지 확인해 보겠습니다.

  1. DiscourseConnect 제공자 설정에서 Force Avatar Update가 활성화되어 있나요?
  2. wpdc_sso_avatar_url과 함께 사용하고 있는 함수를 공유해 주세요.

안녕하세요, @angus 님!

이 문제에 관심을 가져 주셔서 감사합니다. 네, "Force Avatar Update"가 활성화되어 있습니다.

현재 제 함수는 다음과 같습니다:



<?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는 여전히 기본 아바타를 가져옵니다.

full 대신 thumbnail 이미지 크기로 동일한 접근 방식을 시도해 보았지만 결과는 동일했습니다.

확인해 주셔서 감사합니다!

안녕하세요 @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 사이트 설정이 활성화되어 있나요?

네, 활성화되었습니다.

좋아요, 최종 SSO 파라미터에 어떤 값이 있는지 확인해 보겠습니다. 아래 필터를 추가하고 로그에 어떤 내용이 기록되는지 확인해 주세요.

add_filter( 'wpdc_sso_params', function ( $params ) {
   error_log( "avatar_url: {$params['avatar_url']} force: {$params['avatar_force_update']}" );
   return $params;
});

해당 스니펫은 모든 페이지 로드 시 로딩되지만, wpdc_sso_params는 로그아웃/로그인 또는 Discourse 로그인 플로우 중에 절대 실행되지 않습니다.

해당 필터가 한 번도 실행되지 않는다면, DiscourseConnect가 올바르게 설정되지 않았거나 WordPress를 Discourse 로그인 제공자로 사용하지 않고 있는 것입니다. WP Discourse > Logs의 meta 파일을 공유해 주세요.

안녕하세요 @angus

네, 확인해 주세요:

### 서버 ###

WordPress - 7.0

PHP - 8.3.6

MySQL - 8.4.9

### WP Discourse 설정 (비밀 정보 제외) ###

connection-logs - 0

display-subcategories - 1

allow-tags - 1

max-tags - 15

publish-as-unlisted - 0

full-post-content - 0

custom-excerpt-length - 100

add-featured-link - 1

auto-publish - 1

force-publish - 1

force-publish-max-age - 0

publish-failure-notice - 1

auto-track - 1

allowed_post_types - post

exclude_tags -

hide-discourse-name-field - 0

discourse-username-editable - 0

direct-db-publication-flags - 0

verbose-publication-logs - 0

enable-discourse-comments - 1

comment-type - display-public-comments-only

ajax-load - 1

load-comment-css - 1

discourse-new-tab - 1

hide-wordpress-comments - 1

show-existing-comments - 0

max-comments - 10

min-replies - 0

min-score - 0

min-trust-level - 0

bypass-trust-level-score - 0

only-show-moderator-liked - 0

custom-datetime-format -

cache-html - 0

clear-cached-comment-html - 0

verbose-comment-logs - 0

use-discourse-webhook - 1

use-discourse-user-webhook - 1

webhook-match-user-email - 0

verbose-webhook-logs - 0

verbose-sso-logs - 1

enable-sso - 1

auto-create-sso-user - 1

real-name-as-discourse-name - 0

force-avatar-update - 1

redirect-without-login - 0

sso-client-enabled - 0

sso-client-login-form-change - 0

sso-client-sync-by-email - 0

sso-client-disable-create-user - 0

sso-client-sync-logout - 0

logs-enabled - 1

실제로 WordPress가 프로바이더로 설정되어 있지만, DiscourseConnect 코드가 실행되지 않는 것으로 보입니다. 이는 DiscourseConnect를 통해 실제로 로그인하지 않고 있거나, 스니펫이나 로그를 올바르게 로드하지 못하고 있음을 시사합니다. 혹시 OAuth와 같은 다른 로그인 방법이 설정되어 있지 않나요? 이 문제를 테스트하기 위해 정확히 어떤 작업을 수행하는지 기록해 보시기 바랍니다. 기록 시 URL을 포착하고, 개발자 도구의 네트워크 탭에서 "로그 유지(Preserve Log)"를 활성화하여 확인해 보세요.

하지만 wpdc_sso_params는 로그아웃/로그인 또는 Discourse 로그인 흐름 중에 절대 실행되지 않습니다

또한, 이 결론에 도달하게 된 과정도 공유해 주시기 바랍니다.

저는 "error_log( ‘[WPDC avatar debug] snippet loaded’ );"를 추가했습니다.

  1. 표준 WordPress 로그인을 통해 DiscourseConnect를 사용하여 로그인하고 있습니다.
  2. Advanced Site Enhancements (ASE) Snippets Manager를 사용하여 스니펫을 추가하고 있습니다. 그리고 설명대로 수정한 디버그 스니펫 덕분에 debug.log에 일부 항목이 기록되었습니다.

무언가 제대로 되어 있지 않습니다. wpdc_sso_params가 트리거되지 않으면 DiscourseConnect를 사용하여 로그인할 수 없기 때문입니다. 해당 부분이 무엇인지 파악해야 합니다. 설정에 직접 접근할 수 없기 때문에, 그 부분은 제가 알아낼 수 없습니다.

@angus 님, 노고에 감사드립니다. 이제 이 문제에 대해 더 자세히 알아보고, 결과를 알려드리겠습니다.