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:
- O site do cliente (provedor de SSO): https://secretsofsolo.com/
- O site do Discourse: https://jamcircle.secretsofsolo.com/
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.