최근 우리 팀은 WP Discourse 플러그인을 설치하고 WordPress 사이트를 Discourse의 SSO 제공자로 설정한 상태에서, 사용자의 Discourse 사용자 이름을 WordPress에서 수정할 수 있는 기능을 개발하고 있습니다. 현재는 Discourse API를 사용하여 어느 정도 성공을 거두고 있습니다. WordPress에 사용자 정의 메타 필드를 두어, 이 필드가 업데이트되면 해당 사이트의 Discourse 인스턴스에 PUT 요청을 보내 사용자의 사용자 이름을 업데이트하도록 하고 있습니다(여기에서 제안된 솔루션과 유사합니다: How does one change a username via the API?).
하지만 이 필드는 게시물을 게시할 때(WP에서 Discourse로)만 사용되며, Discourse에서 사용자의 실제 사용자 이름을 업데이트하지는 않습니다. 사용자가 Discourse에서 사용자 이름을 변경하면 동기화되지만, WordPress에서 변경할 때는 WordPress에서 Discourse로 동기화되지 않습니다.
제 질문은, 이러한 양방향 동기화가 언젠가 구현될 예정인지입니다. WordPress에서 Discourse로 동기화되지 않는데 왜 사용자가 이 사용자 이름 필드를 변경할 수 있는 옵션이 있는 것일까요? 만약 이 기능이 이미 개발 중인 것이 아니라면, 우리 팀도 이 기능에 기여하는 데 관심이 있습니다. 우리 사이트에는 이 기능이 필요하고, 모든 WP Discourse 사이트에도 유용할 것이라고 생각합니다. 이 부분에 대해 알려주시면 감사하겠습니다!
@angus@simon 두 분 모두 WP Discourse에 깊이 관여하고 계시고, 저희의 SSO 문제 해결에도 도움을 주셨으므로 이 질문을 두 분께 직접 드리는 것이 좋을 것 같습니다!
WordPress 플러그인에서 ‘Discourse Username Editable’ 필드는 이름이 적절하지 않을 수 있습니다. 해당 설정의 설명 문구를 업데이트하여 이 설정의 용도를 명확히 해야 합니다. ‘Discourse Username Editable’ 설정이 활성화되면 WordPress 사이트 사용자는 자신의 WordPress 프로필 페이지에서 Discourse 사용자 이름을 설정할 수 있습니다. 이 설정이 비활성화되어 있으면, WordPress 사이트의 관리자만 사용자의 Discourse 사용자 이름을 설정할 수 있습니다. Discourse 사용자 이름은 플러그인이 WordPress에서 Discourse로 게시물을 게시할 때만 사용됩니다.
WordPress와 Discourse 사이에 DiscourseConnect가 사용되는 경우, 사용자의 Discourse 사용자 이름은 처음에는 WordPress 사용자 이름에서 가져와서 설정됩니다. Discourse 사이트에서 auth_overrides_username 설정이 활성화되어 있으면, Discourse의 사용자 이름은 WordPress에서만 설정할 수 있습니다. Discourse에서 auth overrides username 설정이 _비활성화_되어 있으면, 사용자가 Discourse에서 사용자 이름을 편집할 수 있으므로 두 시스템 간의 사용자 이름이 동기화되지 않을 수 있습니다.
‘Discourse Username’ 필드에 관해, 이상적으로는 이 필드가 Discourse 사용자 이름에 기반하여 백그라운드에서 항상 설정되어야 합니다. 관련 코드를 마지막으로 확인한 지 오래되었지만, WordPress 사이트가 Discourse의 SSO 제공자로 사용되고 WordPress의 DiscourseConnect Provider 옵션 탭에서 “로그인 시 Discourse 사용자 생성 또는 동기화” 옵션이 활성화되어 있으면 Discourse Username 필드가 자동으로 채워진다고 생각합니다. Discourse가 WordPress의 SSO 제공자로 사용되는 경우( DiscourseConnect Client 설정과 함께)에도 Discourse Username 필드는 자동으로 설정됩니다.
이상적으로는, Discourse의 “로그인 시 Discourse 사용자 생성 또는 동기화” 옵션이 활성화되어 있든 아니든, WordPress가 Discourse의 SSO 제공자인 경우 Discourse Username 필드가 항상 자동으로 설정되어야 합니다. 두 사이트 사이에 DiscourseConnect가 사용되지 않는 경우를 위해 무엇을 할 수 있을지 모르겠지만, @angus가 그 문제에 대해 아이디어를 가지고 있을 수도 있습니다.
기본적으로 WordPress는 사용자가 사용자 이름을 변경하는 것을 허용하지 않으므로, 이 문제에 대해 많은 질문을 받은 적은 없습니다. WordPress와 Discourse 간에 사용자 이름이 동기화되도록 하려면 Discourse에서 auth_overrides_username 설정을 활성화해야 합니다. WordPress에서 “로그인 시 Discourse 사용자 생성 또는 동기화” 옵션도 활성화하는 것이 좋습니다. 이 옵션이 활성화되면, 사용자가 WordPress 사이트에 로그인할 때마다 Discourse에서 사용자의 정보가 업데이트됩니다. 이 옵션이 비활성화되어 있으면, 사용자가 Discourse에서 로그아웃한 후 DiscourseConnect로 다시 로그인할 때만 Discourse에서 사용자의 정보가 업데이트됩니다.
저희 사이트는 다소 특별한 경우일 수 있습니다. 기본적으로 WordPress가 사용자의 사용자명을 변경할 수 없도록 하고 있기 때문에, 사용자의 WordPress 사용자명을 Discourse와 동기화하는 것을 원하지 않습니다. 또한 이 기능이 불안정성을 초래할 수 있으므로, 해당 WP 사용자명 수정 기능을 추가하는 플러그인을 설치하는 것도 원하지 않습니다.
하지만 Discourse에서는 사용자명을 수정할 수 있으므로, WP Discourse 플러그인을 통해 이 기능을 WordPress로 확장하는 것이 합리적이라고 생각합니다. 이 필드가 이를 위한 최적의 장소인 것 같지만, 기본적으로 변경되지 않는 WP 사용자명과 충돌할 수 있다는 점은 이해합니다. 그렇다면 이 부분은 플러그인에 기여하는 것을 원치 않으시는 건가요?
또한, 사용자가 포럼에서 사용자 이름을 수정할 수 있는 기능은 우리에게 매우 중요한 요구사항입니다. 이미 Discourse 설정에서 이 기능을 허용하도록 구성해 두었지만, 대부분의 사용자는 Discourse 설정 메뉴 안에 숨겨져 있어 사용자 이름을 변경하지 않습니다. 우리는 이 기능을 WordPress 사이트의 프로필 페이지에 이름, 아바타 등 다른 정보와 함께 명확하게 표시하고 싶습니다.
다만, DiscourseConnect를 사용 중이므로 신규 가입 시에는 두 플랫폼의 사용자 이름이 동일하게 설정됩니다. 계정 생성 이후의 동기화 자체에 대해 우려하시는 것으로 이해하며, 이 점은 문제없으시다고 가정하겠습니다.
사용자가 Wordpress 계정을 만들었지만 아직 Discourse에 로그인하지 않은 경우를 어떻게 구상하고 계신가요? 이 경우 Discourse 계정은 존재하지 않습니다. 그렇다면 Discourse 사용자 이름 필드는 편집할 수 없게 되는 건가요?
참고로 “Update Userdata” 웹훅(WP Discourse 설정의 “Webhooks” 항목 참조)은 Discourse에서 사용자 이름이 변경될 때 Wordpress의 Discourse 사용자 이름 필드를 업데이트합니다. 이는 구상하신 양방향 동기화의 한 부분입니다.
따라서 구체적으로 원하시는 것은 WP Discourse 플러그인이 사용자 이름이 변경될 때 사용자의 Discourse 사용자 이름을 업데이트하는 것뿐이라는 말씀이신가요?
이 필드는 다양한 목적으로 사용되고 있습니다. 일부 사용자는 DiscourseConnect로 사용하는 계정과 연결된 Discourse 사용자의 사용자 이름은 변경하지 않으면서 이 필드만 편집하기를 원합니다.
그러나 비교적 간단한 해결책이 있습니다. 여기 근처 어딘가에 action을 추가하여, 현재처럼 PUT 요청을 통해 Discourse의 사용자 이름을 업데이트할 수 있도록 할 수 있습니다. 이를 위한 가장 쉬운 방법은 WP 플러그인 유틸리티의 추상화된 discourse_request 메서드를 사용하는 것입니다. 예를 들어 다음과 같습니다.
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
$path = ''
$args = array(
);
$response = DiscourseUtilities::discourse_request( $path, $args );
웹훅과 action 콜백을 모두 사용하면, 위에서 제기한 두 가지 질문에 대한 처리가 되었다고 가정할 때, 구상하신 방식의 양방향 동기화를 구현할 수 있습니다.
실제로 우리는 SSO 시스템이 Firebase와 통합되어 있고 모든 사용자의 WP 사용자 이름이 기본적으로 Firebase UID가 되므로, wpdc_sso_params 필터 훅을 사용하여 이 동작을 오버라이드하고 있습니다. 따라서 Discourse 기본값을 memberXXX(XXX는 숫자)로 변경하고 있습니다. 또한 언젠가 이 기본값을 사용자의 Firstname_Lastname으로 변경하는 것도 원합니다. 하지만 네, 우리의 주된 관심사는 사용자가 WordPress 사이트 내 프로필 페이지에서 사용자 이름을 쉽게 변경할 수 있도록 하는 것입니다.
이 경우 사용자 이름 필드를 저장해 두었다가 계정이 생성될 때(첫 번째 SSO에서 wpdc_sso_params 필터 훅을 통해) 동기화하거나, 또는 Discourse API를 통해 WordPress 사이트에서 가입할 때 모든 멤버에 대해 Discourse 계정을 생성하도록 강제할 수 있다고 생각합니다. 두 번째 옵션이 더 유리할 것 같습니다. 그러면 모든 사람이 Discourse 계정을 가지고 있음을 알 수 있고, 일부 사용자만 계정을 가지고 다른 사용자는 없는 경우와 같은 특수한 상황이 줄어들기 때문입니다. 하지만 우리는 정말로 원활한 경험을 추구하므로, 이 사용자 이름이 사용자가 플랫폼 전체에서 자신의 사용자 이름이라고 인식하는 것이어야 합니다. 항상 편집할 수 있기를 원하며, 미래에는 Discourse 외에도(즉, 리더보드 등) 더 많은 용도로 사용할 가능성이 높습니다.
네, 우리가 필요한 것은 정확히 그것입니다!
이해했습니다! 이 방향성에 감사드리며, 제 팀과 저는 먼저 우리의 구현으로 이를 테스트해 보고 곧 PR을 올리겠습니다!