Gerencie a participação em grupos no Discourse com WP Discourse SSO

Holy :cow:! How’d you manage to find it!? Nice work.

By adding log statments to my development site. This should be an easy fix, but I’d rather not push the change to WordPress before I test it out some more.

3 curtidas

Sure you have a reasonable development environment. Like a real developer. That I understand (in spite of my not having such!) But even thinking to try usernames that had changed… I guess the 2 was the clue.

Here’s a slightly different method to handle Paid Memberships Pro group sync. Pop this into your functions.php file. Expected behavior is add upon subscribe and remove upon cancellation. Thanks to @dfriestedt for sponsoring.

https://github.com/justindirose/dc-pmp-group-sync

8 curtidas

Awesome, anything stopping this being wrapped into a plugin for customers who aren’t confident editing PHP?

1 curtida

No, probably not, but PHP/WP development isn’t my forte, and I don’t plan on personally actively maintaining this code long-term.

3 curtidas

I am implementing the PMPro code above and am hung up on something. My understanding is that this code only fires when users buy subscription or cancel a subscription.

Is there a way that I can auto-sync users as they are created on Discourse? In my case, I have some users who are subscribers but don’t have a Discourse accounts (will be created via SSO).

If wordpress is the SSO master then you can have it update groups at every login.

1 curtida

Is there a code snippet that shows an example of updating groups on WP login?

The add_user_to_discourse_groups function will create a Discourse user if it doesn’t already exist. If that function is being called for your users, then you should be fine. Where you might run into problems will be for existing WordPress users who got their membership before the code was added to your site. If that is the case, you will probably need to add the users to Discourse groups through the SSO parameters that are passed to Discourse on login.

To pass additional SSO parameters with the WP Discourse plugin, you can hook into the 'wpdc_sso_params' filter. The parameter you need to use to add users to a Discourse group is called add_groups. You can use it with something like this:

add_filter( 'wpdc_sso_params', 'wpdc_custom_sso_params', 10, 2 );
function wpdc_custom_sso_params( $params, $user ) {
    if ( /* some condition that returns true if groups should be added for the user */ ) {
        $params['add_groups'] = 'comma,separated,group,names'; // Don't use spaces between names.
    }

    return $params;
}
7 curtidas

Percebo que este é apenas um código de exemplo, mas parece ter um bug bastante crítico.

Se o pagamento não for concluído e o status da associação for “token”

O grupo ainda é adicionado ao usuário do discourse :open_mouth:

Vou investigar isso mais tarde, mas acho que vale a pena mencionar


1 curtida

Desejo usar este código para restringir minha comunidade Discourse APENAS a membros pagantes usando Paid Memberships Pro. Tenho um nível de associação gratuito e dois níveis de associação pagos.

Como posso modificar este código: Manage group membership in Discourse with WP Discourse SSO

para que APENAS os membros pagantes possam acessar a comunidade. Caso contrário, eles serão redirecionados para a página de inscrição de membros pagos.

Obrigado.

Para minha própria referência, aqui está o código que você deseja modificar:

add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
    if ( /* alguma condição */ ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

O que você precisa fazer é substituir o comentário /* alguma condição */ do código por uma condição que retorne true para usuários que não possuem associações pagas. Esses usuários podem então ser redirecionados para a página de inscrição de membros.

Eu ainda não tenho o plugin Paid Memberships Pro instalado no meu site de teste, mas, de acordo com a documentação deles, parece que você pode usar a função pmpro_hasMembershipLevel para verificar se um usuário tem um determinado nível de associação: Using the pmpro_hasMembershipLevel() Function.

Para usar a função pmpro_hasMembershipLevel, você precisa saber os IDs (ou os nomes) dos seus dois níveis de associação pagos. Você pode obter esses IDs na página de administração “Membership Levels” do pmp. Por exemplo, se os IDs dos seus dois níveis pagos forem 1 e 2, você poderia usar a seguinte condição:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Substituído no código, isso seria:

add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
    if (! pmpro_hasMembershipLevel( array( 1, 2 ), $user_id ) ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

A outra linha que você precisará alterar é:

wp_safe_redirect( home_url() );

Atualmente, está configurado para redirecionar os usuários para a página inicial do site. Você precisará alterá-lo para redirecionar para o caminho ou URL completo da página de inscrição do seu site:

wp_safe_redirect( /* caminho_para_sua_pagina_de_inscricao */ );

Note que não testei este código. Se você estiver fazendo alterações diretamente no arquivo functions.php do seu site principal, certifique-se de que você consegue acessar o arquivo functions.php do site a partir do painel do site, apenas no caso de haver algum erro ou digitação no código.

4 curtidas

Deixando uma nota para mim aqui relacionada a https://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4. Se a opção Criar ou Sincronizar Usuários do Discourse no Login do WP Discourse estiver habilitada, contas do Discourse serão criadas automaticamente para todos os usuários no site WordPress, mesmo que eles sejam impedidos de fazer login no Discourse pelo método descrito no OP. Detalhes sobre como impedir que contas sejam criadas automaticamente para usuários que não possuem o nível de associação apropriado estão na segunda parte desta postagem: How to prevent some WP users from being able to login to Discourse - #2 by simon.

Basicamente:

add_filter( 'wpdc_bypass_sync_sso', 'wpdc_custom_bypass_sync_sso', 10, 3 );
function wpdc_custom_bypass_sync_sso( $bypass_sync, $user_id, $user ) {
    if ( /* Alguma condição que retorna true se o usuário não atender ao requisito de associação */  ) {

        $bypass_sync = true;
    }

    return $bypass_sync;
}

Estou me lembrando de atualizar o OP com esses detalhes.

2 curtidas

Obrigado, Simon. Consegui configurar isso para o meu site usando suas instruções.

1 curtida

Um esclarecimento.

Sem nível (não é um usuário): 0
Nível gratuito = 1
Tenho dois níveis pagos: 2,3

Você disse

O que você precisa fazer é substituir o comentário /* alguma condição */ do código por uma condição que retorne true para usuários que não possuem associações pagas. Esses usuários podem então ser redirecionados para sua página de inscrição de associação.

E

Para usar a função pmpro_hasMembershipLevel, você precisa saber os IDs (ou os nomes) dos seus dois níveis de associação paga. Você pode obter esses IDs na página de administração “Níveis de Associação” do pmp. Por exemplo, se os IDs dos seus dois níveis pagos forem 1 e 2, você poderia usar a seguinte condição:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Essas declarações estão se contradizendo?

No meu entendimento:
Eu deveria usar o seguinte:

if (! pmpro_hasMembershipLevel(array(0,1), $user_id))

para redirecionar usuários que NÃO possuem uma associação paga para a página de inscrição de membros.

Por favor, corrija-me se eu estiver errado.

Obrigado.

Se a condição retornar true, os usuários serão redirecionados para a sua página de inscrição.

Acho que o mais seguro para o seu caso seria usar uma condição que retorne true se o usuário não tiver o nível 2 ou 3:

if (! pmpro_hasMembershipLevel(array(2, 3), $user_id))

1 curtida

Obrigado. Perdi o ponto de exclamação no seu segundo trecho.

1 curtida