Memberpress: como adicionar usuários a grupos ao se cadastrar

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)

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
    26
    54
  • If by parameters you mean the following, then no:
    22

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!

Com esse método, é possível atribuir membros ao nível de confiança 2 no Discourse quando eles criam uma conta mediante pagamento, e reduzi-lo para o nível de confiança 1 quando não efetuam o pagamento mensal?

Não olhei para isso há algum tempo, mas o que você precisaria é de uma comunicação entre os códigos do seu Discourse e os códigos do seu sistema de pagamento (no meu caso: MemberPress).

Então, se a pessoa parar de pagar, o MemberPress altera o código dela, e esse código corresponde a um nível de grupo diferente.
Se não houver vínculo com o pagamento, o nível do grupo não será ajustado.

Ah. Espere.
Relendo sua pergunta: não tenho certeza de como funciona com os níveis de confiança…
mas… se tudo mais falhar, você pode facilmente criar um GRUPO configurado para o nível de confiança 2 e outro para o nível de confiança 1, e fazer com que seu plugin de associação atribua esses grupos aos seus membros.

Espero que isso ajude. Se não, terei que mergulhar de volta nisso. Está funcionando desde a conversa anterior e não olhei para isso desde então.

Essa é uma ótima ideia! Sim, podemos definir níveis de confiança para grupos no Discourse. Mas não tenho experiência suficiente com o MemberPress.

Podemos fazer com que usuários pagantes do Memberpress sejam adicionados automaticamente a um grupo especial?

Isso surgiu em outro post no Meta hoje, então eu examinei o código para confirmar se o nível de confiança de um usuário pode ser reduzido ao adicioná-lo a um grupo que define um nível de confiança menor do que o do grupo atual do usuário. Ao analisar o código, vi que isso não é possível:

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

Se o nível de confiança de um usuário for menor que o nível de confiança concedido pelo grupo, adicionar o usuário ao grupo atualizará seu nível de confiança. Caso contrário, não haverá alteração no nível de confiança do usuário.

Provavelmente existem outros plugins de assinatura que podem fazer a mesma coisa por você.

São 20h aqui e estou encerrando meu dia, mas se precisar de mais ajuda, ficarei feliz em analisar isso amanhã de manhã. É só me avisar.

Estou um pouco enferrujado (além disso, já é tarde), mas o nível de confiança realmente não seria relevante. Eu não uso níveis de confiança de forma alguma. O Grupo TL 2 tem acesso a ‘isso’ e o Grupo TL 1 não tem.
O nível de confiança real não está em uso. Qualquer membro pode ser nível de confiança 1 e ainda assim obter acesso (por meio de pagamento) ao Grupo TL 4 — desde que eu não configure permissões para níveis de confiança, mas apenas para grupos.

Sim, a maneira de abordar isso é usar permissões de segurança de grupos e categorias. Não deve ser necessário confiar nos níveis de confiança.

@Dani1, obrigado por compartilhar suas experiências e desafios aqui; isso é muito útil para outras pessoas que usam o MemberPress, como eu.

Isso faz sentido, mas tenho curiosidade sobre o que acontece se a assinatura do membro expirar e ele nunca fizer logout, continuando assim a acessar o grupo… Você já encontrou esse como um problema?

Se sim, estou me perguntando se há uma maneira de forçar uma atualização ou um logout…

Obrigado!
Ray

Você precisa capturar o evento do Memberpress e ajustar os grupos de acordo.

Veja também Bring over permission level from WordPress MemberPress - #2 by simon e Manage group membership in Discourse with WP Discourse SSO

@RGJ O código acima marcado como solução remove os membros dos grupos, mas, como Dani1 mencionou, ela disse que só entra em vigor quando eles fazem logout.

Se um usuário for atualizado por meio do processo normal de login SSO, a atualização não ocorrerá até que ele faça logout e entre novamente. O exemplo de código acima é a maneira mais fácil de abordar o problema, mas provavelmente não é a melhor forma de gerenciar a associação a grupos.

O plugin WP Discourse possui algumas funções auxiliares que são ativadas quando o WordPress funciona como o site provedor de SSO para o Discourse. Essas funções permitem atualizar as associações a grupos sem exigir que o usuário faça logout do Discourse. Essas funções estão no tópico ao qual Richard linkou: Manage group membership in Discourse with WP Discourse SSO.

O post ao qual Richard linkou fornece alguns detalhes sobre as duas abordagens diferentes. Vou adicionar esses detalhes ao tópico howto na próxima semana. Por enquanto, seria bom ler o post.

Ah, acho que entendi. Parte da minha confusão está no tópico Bring over permission level from WordPress MemberPress - #2 by simon, perto do final, que apontava para este tópico como solução, o que acabou confundindo.

Ainda está além da minha compreensão, mas aguardo seu howto sobre o assunto.

Obrigado a todos pela ajuda!
Ray

Então faça-os sair :slight_smile:
Algo assim deve funcionar:

  $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; // usuário não encontrado, aborta
  }
  
  $userData = json_decode(wp_remote_retrieve_body($request), true);
  if (!isset($userData['user']['id'])) {
	return false; // resposta incorreta, aborta
  }
  
  $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);

você pode fazer o logout deles em nome deles. Basta se fazer passar por eles.

na verdade, apenas acessar os detalhes do usuário deles já permite que você os faça sair.

(óbvio, isso tudo é muito manual. Tenho apenas um punhado de pessoas e sei exatamente o que cada uma está fazendo. Ainda não tentei a solução do Richard, mas é bom saber que ela existe!)

poderia adicionar um link aqui quando isso acontecer? Obrigado!

Claro, o tópico está aqui: Manage group membership in Discourse with WP Discourse SSO. Ele descreve como usar as funções add_user_to_discourse_group e remove_user_from_discourse_group do WP Discourse. Supondo que seu site WordPress esteja configurado como o provedor de SSO para o Discourse, essas são as funções que você deve usar para gerenciar as associações de grupo no Discourse.

O exemplo usado nesse tópico é com o plugin PaidMembershipsPro, mas uma abordagem semelhante deve funcionar com qualquer plugin de associação WordPress bem desenvolvido.

Vou adicionar alguns detalhes ao tópico sobre como gerenciar a associação de grupo com os parâmetros SSO add_groups e remove_groups. Na maioria dos casos, gerenciar a associação de grupo adicionando esses parâmetros ao payload SSO não será a melhor abordagem, pois exige que os usuários saiam e façam login novamente no Discourse para que a associação de grupo seja atualizada.

Minha esperança é que, em um futuro próximo, exista uma solução pronta para uso para vincular o Discourse a plugins específicos de associação do WordPress. Atualmente, isso só pode ser feito adicionando uma pequena quantidade de código personalizado ao seu site WordPress. Se isso não for algo que você costuma fazer, talvez precise contratar um desenvolvedor para ajudar com isso.

Obrigado pelos detalhes. Vou ver se consigo encaixá-los na minha cabeça.

Concordo — prefiro que a adição/subtração de grupos seja feita em tempo real, em vez de apenas no logout e login do usuário.

Se não conseguir resolver, vou contratar um desenvolvedor aqui para fazer isso e compartilhar o código. Acredito que há alguns que já fizeram isso na seção de marketplace.

Ray

Ei Ray, o que você acabou fazendo aqui?