Mantengo Discourse e MemberMouse attivi su 2 siti. Spero che questa guida sia utile ad altri. Le tue specifiche esatte potrebbero differire dai risultati che desideravo ottenere. Questa guida presuppone che tu abbia familiarità con gli hook e i filtri di MemberMouse, nonché con l’interfaccia PHP di MemberMouse. Si dà anche per scontato che tu possa aggiungere comodamente codice personalizzato a WordPress tramite functions.php o il tuo plugin personalizzato.
La seguente guida descrive ciò che abbiamo implementato per:
- Attivare/disattivare l’utente su Discourse in base allo stato della sua iscrizione su MemberMouse
- Impostare i gruppi Discourse che rappresentano i livelli di iscrizione di MemberMouse
- Sincronizzare immediatamente le modifiche di nome utente/e-mail
- E varie altre piccole ottimizzazioni utili
Passaggio 1: Installa Discourse, WordPress e il plugin WordPress wp-discourse
Assicurati che WordPress, Discourse e il plugin WordPress wp-discourse siano installati, funzionanti e configurati correttamente, con WordPress come provider SSO. Ci sono molti thread su questo argomento qui.
Passaggio 2: Spunta la casella per consentire al plugin wp-discourse di creare un nuovo utente su Discourse quando viene creato un utente su WordPress
Ho scoperto che, affinché wp-discourse creasse effettivamente un utente su Discourse quando un utente viene creato su WordPress, era necessario apportare una modifica al codice nel plugin. Questo perché il plugin si basa sull’azione “wp_login”, ma si comporta in modo diverso rispetto al comportamento standard di WordPress quando si utilizza MemberMouse. Quindi, devi aggiungere questa riga al file /lib/discourse-sso.php nella funzione pubblica __construct( $wordpress_email_verifier ):
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
E in functions.php o nel tuo plugin aggiungi:
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');
Passaggio 3: Se lo desideri, configura il sistema in modo che i nuovi utenti non debbano cliccare sul link di attivazione via e-mail di Discourse
Per impostazione predefinita, Discourse invia un’e-mail di attivazione al nuovo utente, ma ho scelto di disattivarla poiché l’utente ha già superato un numero soddisfacente di ostacoli su WordPress per registrarsi. Se il tuo sito WordPress ha una barriera di ingresso molto bassa, potresti non voler saltare l’e-mail di attivazione. Nel nostro caso, è necessario pagare per iscriversi. Aggiungi questo a functions.php o a un plugin speciale che crei.
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;
}
Passaggio 4: Ogni volta che si verifica una modifica all’account di un utente MemberMouse:
Mappa i livelli di iscrizione di MemberMouse ai gruppi Discourse
Sincronizza l’indirizzo e-mail/nome utente
Attiva/disattiva l’utente su Discourse come appropriato
Puoi aggiungere questo a functions.php o al tuo 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');
Nella funzione run_discourse_sync_based_on_mm_acct_change devi:
(1) Utilizzare l’API di Discourse per ottenere il nome utente Discourse di questo utente (potrebbe essere leggermente diverso da quello di WordPress a causa delle regole interne di Discourse per i nomi utente) e l’ID numerico di Discourse. (documentazione)
(2) Mappare l’ID del livello di iscrizione di MemberMouse all’ID del gruppo Discourse equivalente e quindi impostare il gruppo su Discourse. Prima devi eliminare il vecchio ID del gruppo. (documentazione). Successivamente puoi impostare il nuovo gruppo. (documentazione)
(3) Sincronizzare il nome utente e l’e-mail se sono stati modificati su WordPress. Consentiamo solo modifiche a questi dati tramite WordPress. Ho ricevuto aiuto per questa parte qui.
(4) Attivare/disattivare l’utente su Discourse in base al suo stato su MemberMouse. Attivazione (documentazione). La disattivazione sembra mancare nella documentazione dell’API. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
Passaggio 5: Reindirizzamento automatico a Discourse quando appropriato
(Raccomando vivamente di attendere con questa parte finché non avrai una buona comprensione di come WordPress e Discourse funzionano insieme.)
Se un utente NON è connesso a Discourse e NON è connesso a WordPress. E arriva a un URL su Discourse e clicca sul pulsante blu di Accesso, viene reindirizzato a WordPress per accedere, ma poi MemberMouse reindirizza l’utente alla pagina impostata nelle impostazioni di MemberMouse. Purtroppo, l’utente non viene reindirizzato indietro a Discourse. Ecco come ho risolto il problema. Puoi aggiungere questo a functions.php o al tuo plugin. (Thread per ulteriori informazioni.)
// Se la persona proviene dal forum Discourse, reindirizzala esattamente dove si trovava dopo aver effettuato l'accesso
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // Devi gestire l'impostazione di questo cookie temporaneo se l'utente è appena arrivato tramite Discourse
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// Payload e firma.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// Ripristina %0B a %0A.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// Convalida la firma.
$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 );
// Reindirizza indietro a Discourse.
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
