Memberpress + WP Discourse (Gestão de Grupos)

Tenho frequentado os fóruns meta.discourse há anos, coletando trechos e aprendendo como melhorar um site de cliente que usa Wordpress + Memberpress + Discourse (auto-hospedado).

Eu precisava (e ainda preciso) atribuir Grupos do Discourse com base nas Associações do Memberpress.

Para referência:

Anteriormente (por alguns anos) eu usei o método de filtro add_filter( 'wpdc_sso_params':

A desvantagem parecia ser que os Grupos do Discourse só eram atualizados no login do usuário, eu queria algo que tivesse um efeito mais imediato (por exemplo, quando uma transação do Memberpress acontece).

Admito que minhas próprias habilidades de codificação em PHP são bastante básicas. Sou mais um desenvolvedor front-end HTML/CSS.

Agora eu reescrevi minhas funções para o site do cliente usando uma função melhor do WP Discourse descrita aqui

Que usa as funções: \\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group e: \\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group.

Agora posso ouvir os Eventos do Memberpress e adicionar os Grupos do Discourse com este bloco de código (functions.php):

add_action('mepr-event-create', 'listen_to_mepr_events');
function listen_to_mepr_events($event) {
  $obj = $event->get_data();
  //$obj pode ser um objeto MeprTransaction ou um objeto MeprSubscription

  if(!($obj instanceof MeprTransaction) && !($obj instanceof MeprSubscription)) {
    return; // nada aqui para fazer se não estivermos lidando com uma transação ou assinatura
  }

  $member = $obj->user(); // obter dados do objeto membro do objeto de evento

  $user_id = $member->ID; // obter ID do usuário do objeto

  if($member->is_active_on_membership($obj)) { // associação ativa
    
    if(3780 == $obj->product_id) { // Associação MENSAL
        $add_group = 'Ksenia_Basic'; // Nome do Grupo do Discourse
        $remove_groups = ['Ksenia_Essential','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // adicionar ao Grupo do Discourse
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // remover dos Grupos do Discourse
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
    else if(3847 == $obj->product_id) { // Associação de 6 meses (Essencial)
        $add_group = 'Ksenia_Essential'; // Nome do Grupo do Discourse
        $remove_groups = ['Ksenia_Basic','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // adicionar ao Grupo do Discourse
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // remover dos Grupos do Discourse
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
  }
  else { // sem correspondências
  }
}

Referência adicional: O hook de ação do Memberpress add_action('mepr-event-create', 'listen_to_mepr_events'); pode ser encontrado aqui:

Para sua informação - Esta é uma versão simplificada do que estou usando no site do meu cliente. A versão completa (que inclui gerenciamento do Learndash + Mailster) pode ser encontrada aqui: Memberpress + Learndash + Mailster + WP Discourse · GitHub

Obrigado a todos neste fórum que forneceram trechos e suporte ao longo dos anos. Sei que há muitos espreitadores como eu que acham este um recurso extremamente valioso e útil.

Se você tiver alguma sugestão ou vir problemas com meu exemplo, me diga como posso melhorar.

6 curtidas

Obrigado Andrew, darei uma olhada nisso amanhã e lhe darei uma resposta mais detalhada na segunda-feira. Apenas como uma nota inicial, você já deu uma olhada no plugin de sincronização de grupo Memberpress desenvolvido por @fzngagan?

4 curtidas

Baseado em função - legal :sunglasses: Não, eu não tinha visto esse plugin. Excelente contribuição.

1 curtida

Como eu faria para implementar isso? Estou usando o Wordpress com Memberpress e acabei de instalar o Discourse em um subdomínio hospedado em um droplet da DigitalOcean. Eu literalmente faria o upload do código como faria com um plugin?

Sim, wp-discourse-mepr-sync é apenas um plugin do Wordpress de um arquivo.

1 curtida

Eu dei uma olhada no código. Caso não esteja claro, o plugin Memberpress Sync depende do código do plugin WP Discourse: WP Discourse – WordPress plugin | WordPress.org. Isso significa que você também precisará instalar, ativar e configurar o plugin WP Discourse: Connect WP Discourse to Discourse. Você também precisará configurar seu site WordPress como o provedor DiscourseConnect para seu site Discourse. Detalhes sobre como configurar isso estão aqui: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

Há algo no plugin Memberpress Sync sobre o qual não tenho certeza. Parece que há dois IDs de Produto Memberpress e dois grupos Discourse codificados diretamente no código do plugin:

Eu acho que você precisará fazer algumas alterações nesse arquivo. Os valores na matriz definida por PV_MEMBERPRESS_PRODUCT_IDS precisarão ser definidos para os IDs de assinatura do seu site. Você também precisará definir as definições PV_DISCOURSE_ENROLLED_GROUP e PV_DISCOURSE_UNENROLLED_GROUP para grupos que existem no seu site Discourse.

Parece que o plugin adiciona quaisquer usuários que tenham uma assinatura ativa para qualquer um dos seus produtos ao PV_DISCOURSE_ENROLLED_GROUP. Se um usuário que tinha uma ou mais assinaturas ativas, então tiver todas as suas assinaturas expiradas, ele será removido do PV_DISCOURSE_ENROLLED_GROUP e adicionado ao PV_DISCOURSE_UNENROLLED_GROUP.

Talvez @fzngagan possa confirmar se isso está correto? Se estiver, será bastante simples configurar o código para o site de @earlysound. É possível que eu esteja entendendo mal como o plugin funciona, no entanto. Eu não tenho uma cópia do plugin Memberpress. Se eu pudesse ter acesso a uma versão de desenvolvimento do Memberpress, eu mesmo poderia testá-lo.

1 curtida

Estou lendo a mesma lógica do código que você explicou. Seria muito bom se @fzngagan pudesse confirmar.

Olá pessoal, sei que já se passaram alguns meses desde a última postagem, mas espero que o que está abaixo ainda seja útil.

Eu não sou o @fzngagan, é claro, mas sou o cliente para o qual este plugin foi originalmente desenvolvido!

A ideia é que queríamos adicionar automaticamente usuários com uma assinatura recorrente ativa do Memberpress a um grupo específico do Discourse.

Quando os usuários cancelavam a assinatura e saíam, eles eram removidos do grupo do Discourse e adicionados a um grupo “Alumni” em vez disso, que tinha acesso apenas a certas áreas do fórum.

O @simon está correto ao dizer que os IDs de Assinatura e os grupos do Discourse estão codificados. Acredito que seja apenas uma questão de substituí-los pelos seus para usá-lo.

Sim, isso está correto. Você só precisaria alterar esses valores

define('PV_MEMBERPRESS_PRODUCT_IDS', array(153, 161));
define('PV_DISCOURSE_ENROLLED_GROUP', 'locker');
define('PV_DISCOURSE_UNENROLLED_GROUP', 'KaizenAlumni');
define('PV_MEPR_ACTIVE_STATUSES', array('complete'));
1 curtida