Je maintiens Discourse et MemberMouse sur 2 sites. J’espère que ce guide sera utile aux autres. Vos spécifications exactes peuvent différer de mes objectifs. Ce guide suppose que vous êtes familier avec les hooks, les filtres de MemberMouse et l’interface PHP de MemberMouse. Il suppose également que vous pouvez ajouter facilement du code personnalisé à WordPress via functions.php ou votre propre plugin personnalisé.
Ce guide ci-dessous décrit ce que nous avons ajouté afin de :
- Activer/désactiver l’utilisateur dans Discourse en fonction de son statut d’adhésion dans MemberMouse
- Définir des groupes Discourse représentant les niveaux d’adhésion MemberMouse
- Synchroniser instantanément les modifications de nom d’utilisateur/email
- Et diverses autres petites améliorations utiles
Étape 1 : Installer Discourse, WordPress et le plugin WordPress wp-discourse
Installez et configurez correctement WordPress, Discourse et le plugin WordPress wp-discourse, en utilisant WordPress comme fournisseur SSO. Il existe de nombreux fils de discussion à ce sujet ici.
Étape 2 : Cocher la case pour permettre au plugin wp-discourse de créer un nouvel utilisateur dans Discourse lorsqu’un utilisateur est créé dans WordPress
J’ai constaté que pour que wp-discourse crée réellement un utilisateur dans Discourse lorsqu’un utilisateur est créé dans WordPress, je devais apporter une modification de code dans le plugin. En effet, le plugin repose sur l’action “wp_login”, mais son comportement diffère dans MemberMouse par rapport au comportement standard de WordPress. Vous devez donc ajouter cette ligne au fichier /lib/discourse-sso.php dans la fonction publique __construct( $wordpress_email_verifier ) :
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
Et dans functions.php ou votre propre plugin, ajoutez :
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');
Étape 3 : Si vous le souhaitez, empêcher les nouveaux utilisateurs de devoir cliquer sur un lien d’activation par email Discourse
Par défaut, Discourse envoie un email d’activation au nouvel utilisateur, mais j’ai choisi de désactiver cette option car l’utilisateur a déjà franchi un nombre suffisant d’étapes dans WordPress pour s’inscrire. Si votre site WordPress a un seuil d’inscription faible, vous ne voudrez peut-être pas sauter l’email d’activation. Dans notre cas, il faut payer pour s’inscrire. Ajoutez ceci à functions.php ou à un plugin spécial que vous créez.
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;
}
Étape 4 : Chaque fois qu’une modification de compte survient pour un utilisateur MemberMouse :
- Mapper les niveaux d’adhésion MemberMouse aux groupes Discourse
- Synchroniser l’adresse email/nom d’utilisateur
- Activer/désactiver l’utilisateur dans Discourse selon le cas
Vous pouvez ajouter ceci à functions.php ou à votre propre 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');
Dans la fonction run_discourse_sync_based_on_mm_acct_change, vous devez :
(1) Utiliser l’API Discourse pour obtenir le nom d’utilisateur Discourse de cet utilisateur (qui peut différer légèrement de celui de WordPress en raison des règles de nommage propres à Discourse) et son identifiant Discourse. (documentation)
(2) Mapper l’ID de niveau d’adhésion MemberMouse à l’ID de groupe Discourse équivalent, puis définir son groupe dans Discourse. Vous devez d’abord supprimer son ancien ID de groupe. (documentation). Ensuite, vous pouvez définir le nouveau groupe. (documentation)
(3) Synchroniser son nom d’utilisateur et son email s’ils ont été modifiés dans WordPress. Nous autorisons uniquement ces modifications dans WordPress. J’ai obtenu de l’aide pour cette partie ici.
(4) Activer/désactiver l’utilisateur dans Discourse en fonction de son statut dans MemberMouse. Activer (documentation). La désactivation semble absente de la documentation de l’API. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
Étape 5 : Redirection automatique vers Discourse lorsque cela est approprié
(Je recommande vivement d’attendre cette partie jusqu’à ce que vous ayez une très bonne compréhension du fonctionnement conjoint de WordPress et Discourse.)
Si un utilisateur n’est PAS connecté à Discourse et n’est PAS connecté à WordPress. Et qu’il accède à une URL dans Discourse et clique sur le bouton bleu de connexion, il est redirigé vers WordPress pour se connecter, mais MemberMouse redirige ensuite l’utilisateur vers la page configurée dans les paramètres de MemberMouse. Malheureusement, l’utilisateur n’est pas redirigé vers Discourse. Voici comment j’ai résolu ce problème. Vous pouvez ajouter ceci à functions.php ou à votre propre plugin. (Fil de discussion pour plus d’informations.)
// Si la personne venait du forum Discourse, la rediriger exactement là où elle se trouvait après la connexion
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // Vous devez gérer la définition de ce cookie temporaire si l'utilisateur vient tout juste d'arriver via Discourse
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// Charge utile et signature.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// Remplacer %0B par %0A.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// Valider la signature.
$sso_secret = 'VOTRE-SECRET-SSO';
$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 );
// Rediriger vers Discourse.
return('VOTRE-URL-DEBASE-DU-FORUM' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
