Eu mantenho o Discourse e o MemberMouse rodando em 2 sites. Espero que este guia seja útil para as pessoas. Suas especificações exatas podem diferir dos meus resultados desejados. Este guia assume que você está familiarizado com os hooks, filtros do MemberMouse e a interface PHP do MemberMouse. Também assume que você pode adicionar código personalizado ao WordPress com conforto via functions.php ou seu próprio plugin personalizado.
O guia abaixo é o que adicionamos para:
- Ativar/desativar o usuário no Discourse dependendo do status da sua assinatura no MemberMouse
- Definir grupos no Discourse que representam níveis de assinatura do MemberMouse
- Sincronizar alterações de nome de usuário/e-mail instantaneamente
- E vários outros ajustes úteis
Passo 1: Instale o Discourse, o WordPress e o plugin WordPress wp-discourse
Configure o WordPress, o Discourse e o plugin WordPress wp-discourse e certifique-se de que estejam funcionando corretamente com o WordPress como provedor de SSO. Há muitos tópicos sobre isso aqui.
Passo 2: Marque a caixa para permitir que o plugin wp-discourse crie um novo usuário no Discourse quando um usuário for criado no WordPress
Descobri que, para que o wp-discourse realmente criasse um usuário no Discourse quando um usuário fosse criado no WordPress, eu precisava fazer uma alteração de código no plugin. Isso ocorre porque o plugin depende da ação “wp_login”, mas ele se comporta de maneira diferente no MemberMouse em comparação com o comportamento padrão do WordPress. Portanto, você precisa adicionar esta linha ao arquivo /lib/discourse-sso.php dentro da função pública __construct( $wordpress_email_verifier ):
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
E em functions.php ou no seu próprio plugin, adicione:
function add_user_to_discourse($data) {
do_action( 'my_mm_account_added', $data["username"], get_user_by('ID',$data["member_id"]) );
}
add_action('mm_member_add', 'add_user_to_discourse');
Passo 3: Se desejar, configure para que novos usuários não precisem clicar em um link de ativação de e-mail do Discourse
Por padrão, o Discourse envia um e-mail de ativação para o novo usuário, mas optei por desativar isso, já que o usuário já passou por um número satisfatório de etapas no WordPress para entrar. Se o seu site WordPress tiver uma barreira baixa para entrada, você pode não querer pular o e-mail de ativação. No nosso caso, é necessário pagar para entrar. Adicione isso ao functions.php ou a um plugin especial que você criar.
add_filter( 'wpdc_auto_create_user_require_activation', 'my_wpdc_auto_create_user_require_activation' );
function my_wpdc_auto_create_user_require_activation( $require_activation ) {
return false;
}
Passo 4: Sempre que houver uma alteração na conta de um usuário do MemberMouse:
Mapeie os níveis de assinatura do MemberMouse para grupos do Discourse
Sincronize o endereço de e-mail/nome de usuário
Ative/desative o usuário no Discourse conforme apropriado
Você pode adicionar isso ao functions.php ou ao seu próprio plugin.
add_action('mm_member_membership_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_status_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_account_update', 'run_discourse_sync_based_on_mm_acct_change');
Na função run_discourse_sync_based_on_mm_acct_change, você deseja:
(1) Usar a API do Discourse para obter o nome de usuário do Discourse deste usuário (que pode ser ligeiramente diferente do do WordPress devido às regras próprias de nome de usuário do Discourse) e o número de ID do Discourse. (documentação)
(2) Mapeie o ID do nível de assinatura do MemberMouse para o ID do grupo equivalente no Discourse e, em seguida, defina o grupo do usuário no Discourse. Primeiro, você precisa excluir o ID do grupo antigo. (documentação). Depois, você pode definir o novo grupo. (documentação)
(3) Sincronize o nome de usuário e o e-mail se eles tiverem sido alterados no WordPress. Permitimos apenas que essas alterações sejam feitas no WordPress. Recebi ajuda com esta parte aqui.
(4) Ative/desative o usuário no Discourse dependendo do status dele no MemberMouse. Ativar (documentação). Desativar parece estar ausente na documentação da API. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
Passo 5: Redirecionamento automático de volta para o Discourse quando apropriado
(Recomendo fortemente esperar com esta parte até que você tenha uma boa noção de como o WordPress e o Discourse funcionam juntos.)
Se um usuário NÃO estiver logado no Discourse e NÃO estiver logado no WordPress. E ele acessar uma URL no Discourse e clicar no botão azul de Login, ele será levado ao WordPress para fazer login, mas o MemberMouse redirecionará o usuário para qualquer página configurada nas configurações de redirecionamento do MemberMouse. Infelizmente, o usuário não é redirecionado de volta para o Discourse. Então, aqui está como resolvi isso. Você pode adicionar isso ao functions.php ou ao seu próprio plugin. (Tópico para mais informações.)
// Se a pessoa veio do fórum Discourse, leve-a exatamente para onde estava após o login
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // Você precisa cuidar de definir este cookie temporário se o usuário acabou de chegar via Discourse
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// Payload e assinatura.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// Converta %0B de volta para %0A.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// Valide a assinatura.
$sso_secret = 'YOUR-SSO-SECRET';
$sso = new \WPDiscourse\SSO\SSO( $sso_secret );
if ( ! ( $sso->validate( $payload, $sig ) ) ) {
return '';
}
$nonce = $sso->get_nonce( $payload );
$params = array(
'nonce' => $nonce,
'username' => $current_user->user_login,
'email' => $current_user->user_email,
'external_id' => $user_id,
);
$params = apply_filters( 'wpdc_sso_params', $params, $current_user );
$q = $sso->build_login_string( $params );
do_action( 'wpdc_sso_provider_before_sso_redirect', $user_id, $current_user );
// Redirecione de volta para o Discourse.
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
