Ich betreibe Discourse und MemberMouse auf 2 Websites. Hoffentlich ist dieser Leitfaden für andere hilfreich. Ihre genauen Spezifikationen können von meinen gewünschten Ergebnissen abweichen. Dieser Leitfaden geht davon aus, dass Sie mit den MemberMouse Hooks, Filtern und der MemberMouse PHP-Schnittstelle vertraut sind. Außerdem wird vorausgesetzt, dass Sie selbstbewusst benutzerdefinierten Code über functions.php oder Ihr eigenes benutzerdefiniertes Plugin zu WordPress hinzufügen können.
Dieser untenstehende Leitfaden beschreibt, was wir hinzugefügt haben, um Folgendes zu erreichen:
- Aktivieren/Deaktivieren des Benutzers in Discourse in Abhängigkeit von seinem Mitgliedschaftsstatus in MemberMouse
- Festlegen von Discourse-Gruppen, die MemberMouse-Mitgliedschaftsstufen repräsentieren
- Synchronisierung von Änderungen an Benutzernamen/E-Mail in Echtzeit
- Und diverse andere hilfreiche kleine Anpassungen
Schritt 1: Installieren Sie Discourse, WordPress und das WordPress-Plugin wp-discourse
Richten Sie WordPress, Discourse und das WordPress-Plugin wp-discourse ein und konfigurieren Sie sie ordnungsgemäß, wobei WordPress als SSO-Anbieter dient. Es gibt dazu viele Threads hier.
Schritt 2: Aktivieren Sie die Option, damit das wp-discourse-Plugin einen neuen Benutzer in Discourse erstellt, wenn ein Benutzer in WordPress erstellt wird
Ich stellte fest, dass das wp-discourse-Plugin einen Benutzer in Discourse erst dann erstellt, wenn ein Benutzer in WordPress erstellt wird, wenn ich eine Code-Änderung im Plugin vornehme. Dies liegt daran, dass das Plugin auf der Aktion „wp_login" basiert, sich jedoch in MemberMouse anders verhält als das normale WordPress-Verhalten. Sie müssen daher diese Zeile in die Datei /lib/discourse-sso.php in der öffentlichen Funktion __construct( $wordpress_email_verifier ) hinzufügen:
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
Und in functions.php oder Ihrem eigenen Plugin fügen Sie hinzu:
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');
Schritt 3: Wenn gewünscht, stellen Sie sicher, dass neue Benutzer keinen Discourse-E-Mail-Aktivierungslink anklicken müssen
Standardmäßig sendet Discourse eine Aktivierungs-E-Mail an den neuen Benutzer, aber ich habe dies deaktiviert, da der Benutzer in WordPress bereits eine ausreichende Anzahl von Hürden überwunden hat, um beizutreten. Wenn Ihre WordPress-Website eine niedrige Einstiegsschwelle hat, möchten Sie die Aktivierungs-E-Mail möglicherweise nicht überspringen. In unserem Fall müssen Sie jedoch bezahlen, um beizutreten. Fügen Sie dies zu functions.php oder zu einem speziellen Plugin hinzu, das Sie erstellen.
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;
}
Schritt 4: Immer wenn eine Kontoveränderung bei einem MemberMouse-Benutzer auftritt:
Ordnen Sie MemberMouse-Mitgliedschaftsstufen Discourse-Gruppen zu
Synchronisieren Sie die E-Mail-Adresse/den Benutzernamen
Aktivieren/Deaktivieren Sie den Benutzer in Discourse entsprechend
Sie können dies zu functions.php oder Ihrem eigenen Plugin hinzufügen.
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');
In der Funktion run_discourse_sync_based_on_mm_acct_change möchten Sie:
(1) Die Discourse-API verwenden, um den Discourse-Benutzernamen (kann aufgrund der eigenen Benutzernamenregeln von Discourse leicht von dem in WordPress abweichen) und die Discourse-ID dieses Benutzers zu erhalten. (Dokumentation)
(2) Ordnen Sie Ihre MemberMouse-Mitgliedschaftsstufen-ID der entsprechenden Discourse-Gruppen-ID zu und setzen Sie dann Ihre Gruppe in Discourse. Zuerst müssen Sie Ihre alte Gruppen-ID löschen. (Dokumentation). Anschließend können Sie die neue Gruppe festlegen. (Dokumentation)
(3) Synchronisieren Sie Ihren Benutzernamen und Ihre E-Mail-Adresse, falls diese in WordPress geändert wurden. Wir erlauben nur Änderungen dieser Daten in WordPress. Ich habe hier Hilfe für diesen Teil erhalten.
(4) Aktivieren/Deaktivieren Sie den Benutzer in Discourse in Abhängigkeit von seinem Status in MemberMouse. Aktivieren (Dokumentation). Deaktivieren scheint in der API-Dokumentation zu fehlen. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
Schritt 5: Automatisches Umleiten zurück zu Discourse, wenn angemessen
(Ich empfehle dringend, diesen Teil erst zu behandeln, wenn Sie ein sehr gutes Gefühl dafür haben, wie WordPress und Discourse zusammenarbeiten.)
Wenn ein Benutzer NICHT in Discourse und NICHT in WordPress angemeldet ist. Und er kommt zu einer URL in Discourse und klickt auf den blauen Login-Button, wird er zu WordPress weitergeleitet, um sich anzumelden, aber dann leitet MemberMouse den Benutzer zu der Seite weiter, die in den MemberMouse-Einstellungen für die Weiterleitung festgelegt ist. Der Benutzer wird leider nicht zurück zu Discourse weitergeleitet. So habe ich dies gelöst. Sie können dies zu functions.php oder Ihrem eigenen Plugin hinzufügen. (Thread für weitere Informationen.)
// Wenn die Person vom Discourse-Forum kam, leiten Sie sie genau dorthin weiter, wo sie war, nachdem sie sich angemeldet hat
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // Sie müssen dafür sorgen, dass dieses temporäre Cookie gesetzt wird, wenn die Person gerade über Discourse eingetroffen ist
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// Payload und Signatur.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// %0B zurück zu %0A ändern.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// Signatur validieren.
$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 );
// Zurück zu Discourse weiterleiten.
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
