Memberpress: how to add users to groups upon Sign up

Hi Eva, I went over your code and there’s no errors that I can spot - and I totally get your frustration. If it hadn’t been for Simon Cossar I don’t know how I’d have resolved it myself.

So, taking it backwards: if the PHP is correct, then something else must be disconnected. (browniepoints for me, yay.)

But…
I don’t know enough about any of that to be able to give suggestions or help.
If you’ve got your forum parked with the boys from Discourse Hosting, you could ask Richard (his name tag won’t pop, but this is his profile: Profile - RGJ - Discourse Meta )

Or perhaps @simon might be able to provide you with the missing steps.

Keeping my fingers crossed for you.

edit:
p.s. these are all the related plug-ins i use (+ that PHP one)
(Memberpress Drip is email marketing, so not related to this)

36

At least the code is okay…

Just going to ask some easy questions just to be sure it’s not a stupid mistake :

On discourse :

  • Are your groups hidden/closed/opened ?
  • Is your group full name different from the name and default title ? Which one is considered by the PHP code ?
  • Have you done anything special in the parameters section concerning this ?

On wordpress :

  • Does your WP-Discourse plugin have specific settings/webhooks for this ?
  • Do you validate the user’s email when they register on wordpress or you use Discourse’s email validation ?

I’m not sure the issue is there but I always take a shot, thank you again !

On Discourse:

  • groups are any and all: closed and opened (i don’t give access to hidden groups, come to think of it)
  • these are some of the group names as displayed in ‘Groups’ - and as you can see, the “NoSpacesNames” are the ones that coincide with the PHP settings

  • If by parameters you mean the following, then no:

nor in the actual group settings (where you create it, with name, owner, etc.), it’s all straight forward and not connected to accessing through SSO - so setting or not setting this as a person’s primary group is not relavant.

There is one webhook here on Discourse that I put in as instructed by the WP-Discourse plugin:


but I don’t actually have that box checked…

  • email verification technically goes via memberpress: they (my wp-instance) send the log-in details to the user. by clicking the log-in link the users verify their address.
    i know for a fact that it’s not through Discourse, because for a while it ALSO went through discourse (glitch somewhere) and Richard sorted that for me.

you’re welcome!

이 방법을 사용하면, 사용자가 계정을 개설할 때 비용을 지불하면 신뢰 수준 2로 설정하고, 월 결제를 하지 않으면 신뢰 수준 1로 낮추는 것이 가능한가요?

한동안 살펴본 적은 없지만, 필요한 것은 Discourse 코드와 결제 코드(제 경우: memberpress) 간의 통신입니다.

즉, 사용자가 결제를 중단하면 memberpress가 해당 사용자의 코드를 변경하고, 이 코드는 다른 그룹 레벨에 대응합니다.
결제와 연결이 없다면 그룹 레벨이 조정되지 않습니다.

아, 잠깐.
질문을 다시 읽어보니… 신뢰 수준(trust levels)은 어떻게 작동하는지 잘 모르겠네요.
하지만… 다른 방법이 없다면, 신뢰 수준 2로 설정된 그룹과 신뢰 수준 1로 설정된 그룹을 각각 만들고, 멤버십 플러그인을 통해 해당 그룹을 멤버들에게 할당하면 됩니다.

도움이 되길 바랍니다. 도움이 되지 않는다면 다시 깊이 파고들어야 할 것 같습니다. 이전 대화 이후로 시스템이 정상 작동하고 있어서 그 이후로는 한 번도 살펴본 적이 없거든요.

정말 좋은 아이디어네요! 네, Discourse 그룹에 신뢰 수준을 설정할 수 있습니다. 하지만 저는 Memberpress에 대해 충분히 숙련되어 있지 않습니다.

Memberpress의 유료 사용자를 자동으로 특별한 그룹에 추가할 수 있을까요?

오늘 Meta의 다른 게시물에서 이 문제가 언급되어, 사용자가 현재 그룹보다 낮은 신뢰 수준을 설정하는 그룹에 추가되었을 때 신뢰 수준이 감소하는지 확인하기 위해 코드를 살펴봤습니다. 코드를 확인한 결과, 이는 불가능한 것으로 보입니다:

  def grant
    if @user.trust_level < @trust_level
      @user.change_trust_level!(@trust_level)
      @user.save!
    end
  end

사용자의 신뢰 수준이 그룹이 부여하는 신뢰 수준보다 낮은 경우, 사용자를 해당 그룹에 추가하면 신뢰 수준이 업데이트됩니다. 그렇지 않으면 사용자의 신뢰 수준에는 변경 사항이 없습니다.

같은 기능을 제공하는 다른 멤버십 플러그인이 있을 수도 있습니다.

여기서는 밤 8시라 오늘 업무를 마무리하고 있습니다. 하지만 더 도움이 필요하시면 아침에 자세히 살펴보겠습니다. 편하게 말씀해 주세요.

조금 손이 녹슬었고(또한 늦은 시간이라) 사실 신뢰 수준은 크게 관련이 없을 것 같습니다. 저는 신뢰 수준을 전혀 사용하지 않습니다. 그룹 신뢰 수준 2에는 '이것’에 대한 접근 권한이 있고, 그룹 신뢰 수준 1에는 없습니다.
실제 신뢰 수준은 사용되지 않습니다. 권한을 신뢰 수준이 아닌 그룹에만 설정한 경우, 신뢰 수준 1인 멤버라도 (지불을 통해) 그룹 신뢰 수준 4에 접근할 수 있습니다.

네, 이 문제를 해결하려면 그룹과 카테고리 보안 권한을 사용하는 것이 좋습니다. 신뢰 수준에 의존할 필요는 없어야 합니다.

@Dani1, 여기서 당신의 시행착오를 공유해 주셔서 감사합니다. 저처럼 MemberPress를 사용하는 다른 분들에게 매우 유용합니다.

그것은 타당하지만, 멤버의 구독이 만료되었는데 로그아웃하지 않아 계속 그룹에 접근할 수 있게 되면 어떻게 되는지 궁금합니다. 이것이 실제로 문제가 되는지 확인해 보셨나요?

만약 그렇다면, 새로고침이나 로그아웃을 강제하는 방법이 있는지 궁금합니다.

감사합니다!
Ray

Memberpress 이벤트를 처리하고(grouping) 그룹을 그에 맞게 조정해야 합니다.

다음 링크도 참고하세요: Bring over permission level from WordPress MemberPress - #2 by simon 및 Manage group membership in Discourse with WP Discourse SSO

@RGJ 해결책으로 표시된 위 코드는 그룹에서 멤버를 제거하는 기능이 있지만, Dani1이 언급했듯이 로그아웃을 해야 비로소 적용된다고 합니다.

사용자가 일반적인 SSO 로그인 과정을 통해 업데이트되는 경우, 로그아웃을 한 뒤 다시 로그인할 때까지 업데이트가 이루어지지 않습니다. 위의 코드 예제는 이 문제를 해결하는 가장 쉬운 방법이지만, 그룹 멤버십을 관리하는 최선의 방법은 아닐 수 있습니다.

WP Discourse 플러그인에는 WordPress가 Discourse의 SSO 제공 사이트로 기능할 때 활성화되는 몇 가지 헬퍼 함수가 있습니다. 이 함수를 사용하면 사용자가 Discourse에서 로그아웃하지 않아도 그룹 멤버십을 업데이트할 수 있습니다. 해당 함수는 Richard가 링크한 주제에 있습니다: Manage group membership in Discourse with WP Discourse SSO.

Richard가 링크한 게시물에는 두 가지 다른 접근 방식에 대한 세부 사항이 나와 있습니다. 다음 주에 해당 세부 사항을 howto 주제에 추가할 예정입니다. 당분간은 게시물을 읽어보시는 것이 좋습니다.

아, 이제 이해하는 것 같습니다. 제가 혼란을 느낀 부분 중 하나는 Bring over permission level from WordPress MemberPress - #2 by simon 스레드 때문인데요, 해당 스레드 하단에서 이 스레드를 해결책으로 안내해서 더 혼란스러웠습니다.

아직 제 머리로는 잘 이해가 되지 않지만, 이 주제에 대한 howto(사용법)를 기대하고 있습니다.

도와주셔서 모두 감사합니다!
레이

그럼 로그아웃을 시켜버립시다 :slight_smile:
이런 식으로 하면 될 것 같습니다:

  $url = sprintf('https://%s/users/by-external/%d.json', $discourseHostname, $wpUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_get($url, $options);
  if (wp_remote_retrieve_response_code($request) != 200) {
	return; // 사용자를 찾을 수 없음, 종료
  }
  
  $userData = json_decode(wp_remote_retrieve_body($request), true);
  if (!isset($userData['user']['id'])) {
	return false; // 잘못된 응답, 종료
  }
  
  $discourseUserID = $userData['user']['id'];
  
  $url = sprintf('https://%s/admin/users/%d/log_out', $discourseHostname, $discourseUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_post($url, options);

대신 로그아웃 처리할 수 있습니다. 그냥 해당 사용자를 impersonate(가상 로그인)하면 됩니다.

사실, 해당 사용자의 상세 정보 페이지만 들어가면 로그아웃을 시킬 수 있습니다.

(물론 이건 전부 수동적인 방법입니다. 사용자가 몇 명 안 되고, 각자가 무엇을 하고 있는지 정확히 알고 있어서 가능한 거예요. 리처드의 솔루션은 아직 시도해 보지 않았지만, 그런 방법이 있다는 건 알아서 다행이네요!)

그 가이드가 올라오면 여기에 링크를 추가해 주시겠어요? 감사합니다!

네, 해당 토픽은 여기 있습니다: Manage group membership in Discourse with WP Discourse SSO. 이 토픽에서는 add_user_to_discourse_group와 remove_user_from_discourse_group 함수를 사용하는 방법에 대해 설명하고 있습니다. WordPress 사이트가 Discourse의 SSO 제공자로 설정되어 있다고 가정하면, Discourse에서 그룹 멤버십을 관리하려면 이 함수들을 사용해야 합니다.

해당 토픽에서 사용된 예시는 PaidMembershipsPro 플러그인을 기반으로 하지만, 잘 만들어진 WordPress 멤버십 플러그인이라면 유사한 접근 방식이 작동할 것입니다.

add_groups와 remove_groups SSO 파라미터를 사용하여 그룹 멤버십을 관리하는 방법에 대해 토픽에 세부 내용을 추가할 예정입니다. 대부분의 경우, SSO 페이로드에 이러한 파라미터를 추가하여 그룹 멤버십을 관리하는 것은 최선의 접근 방식이 아닙니다. 왜냐하면 그룹 멤버십이 업데이트되기 전에 사용자가 Discourse에서 로그아웃했다가 다시 로그인해야 하기 때문입니다.

가까운 미래에는 특정 WordPress 멤버십 플러그인과 Discourse를 연결하는 표준 솔루션이 나올 것으로 기대합니다. 현재로서는 WordPress 사이트에 소량의 커스텀 코드를 추가하는 것 외에는 다른 방법이 없습니다. 평소 이러한 작업을 하지 않으신다면, 개발자를 고용하여 도움을 받으시는 것이 좋습니다.

자세한 설명 감사합니다. 머릿속에 잘 들어갈지 한번 살펴볼게요.

동의합니다. 사용자가 로그아웃하고 다시 로그인할 때 그룹 추가/제거를 처리하는 것보다, 실시간으로 처리하는 편이 훨씬 낫다고 생각합니다.

제가 해결하지 못하면, 여기서 개발자를 고용해서 처리하고 코드를 공유하겠습니다. 마켓플레이스 섹션에서 이 작업을 수행해 본 사람이 몇 명 있는 것 같습니다.

Ray

레이, 여기서는 결국 뭘 했어?