Gruppenzugehörigkeit in Discourse mit WP Discourse SSO verwalten

Holy :cow:! How’d you manage to find it!? Nice work.

By adding log statments to my development site. This should be an easy fix, but I’d rather not push the change to WordPress before I test it out some more.

3 „Gefällt mir“

Sure you have a reasonable development environment. Like a real developer. That I understand (in spite of my not having such!) But even thinking to try usernames that had changed… I guess the 2 was the clue.

Here’s a slightly different method to handle Paid Memberships Pro group sync. Pop this into your functions.php file. Expected behavior is add upon subscribe and remove upon cancellation. Thanks to @dfriestedt for sponsoring.

https://github.com/justindirose/dc-pmp-group-sync

8 „Gefällt mir“

Awesome, anything stopping this being wrapped into a plugin for customers who aren’t confident editing PHP?

1 „Gefällt mir“

No, probably not, but PHP/WP development isn’t my forte, and I don’t plan on personally actively maintaining this code long-term.

3 „Gefällt mir“

I am implementing the PMPro code above and am hung up on something. My understanding is that this code only fires when users buy subscription or cancel a subscription.

Is there a way that I can auto-sync users as they are created on Discourse? In my case, I have some users who are subscribers but don’t have a Discourse accounts (will be created via SSO).

If wordpress is the SSO master then you can have it update groups at every login.

1 „Gefällt mir“

Is there a code snippet that shows an example of updating groups on WP login?

The add_user_to_discourse_groups function will create a Discourse user if it doesn’t already exist. If that function is being called for your users, then you should be fine. Where you might run into problems will be for existing WordPress users who got their membership before the code was added to your site. If that is the case, you will probably need to add the users to Discourse groups through the SSO parameters that are passed to Discourse on login.

To pass additional SSO parameters with the WP Discourse plugin, you can hook into the 'wpdc_sso_params' filter. The parameter you need to use to add users to a Discourse group is called add_groups. You can use it with something like this:

add_filter( 'wpdc_sso_params', 'wpdc_custom_sso_params', 10, 2 );
function wpdc_custom_sso_params( $params, $user ) {
    if ( /* some condition that returns true if groups should be added for the user */ ) {
        $params['add_groups'] = 'comma,separated,group,names'; // Don't use spaces between names.
    }

    return $params;
}
7 „Gefällt mir“

Ich weiß, dass dies nur Beispielcode ist, aber er scheint einen ziemlich kritischen Fehler zu enthalten.

Wenn die Zahlung nicht abgeschlossen ist und der Status der Mitgliedschaft „token“ ist

Wird die Gruppe immer noch zum Discourse-Benutzer hinzugefügt :open_mouth:

Ich werde mich später darum kümmern, aber ich denke, es ist erwähnenswert.


1 „Gefällt mir“

Ich möchte diesen Code verwenden, um meine Discourse-Community NUR für zahlende Mitglieder über Paid Memberships Pro zu beschränken. Ich habe eine kostenlose Mitgliedschaftsstufe und zwei kostenpflichtige Mitgliedschaftsstufen.

Wie kann ich diesen Code ändern: Manage group membership in Discourse with WP Discourse SSO, sodass NUR die zahlenden Mitglieder auf die Community zugreifen können. Andernfalls werden sie zur Anmeldeseite für zahlende Mitgliedschaften weitergeleitet.

Vielen Dank.

Zu meiner eigenen Referenz, hier ist der Code, den Sie modifizieren möchten:

add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
    if ( /* some condition */ ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

Was Sie tun müssen, ist, den Kommentar /* some condition */ im Code durch eine Bedingung zu ersetzen, die für Benutzer, die keine zahlenden Mitgliedschaften haben, true zurückgibt. Diese Benutzer können dann zu Ihrer Anmeldeseite für Mitgliedschaften weitergeleitet werden.

Ich habe das Paid Memberships Pro Plugin derzeit nicht auf meiner Testseite installiert, aber laut deren Dokumentation können Sie deren Funktion pmpro_hasMembershipLevel verwenden, um zu überprüfen, ob ein Benutzer eine bestimmte Mitgliedschaftsstufe hat: Using the pmpro_hasMembershipLevel() Function.

Um die Funktion pmpro_hasMembershipLevel zu verwenden, müssen Sie die IDs (oder die Namen) Ihrer beiden kostenpflichtigen Mitgliedschaftsstufen kennen. Sie können diese IDs auf der pmp-Adminseite “Mitgliedschaftsstufen” abrufen. Wenn die IDs Ihrer beiden kostenpflichtigen Stufen beispielsweise 1 und 2 sind, könnten Sie die folgende Bedingung verwenden:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Eingefügt in den Code wäre das:

add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
    if (! pmpro_hasMembershipLevel( array( 1, 2 ), $user_id ) ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

Die andere Zeile, die Sie ändern müssen, ist:

wp_safe_redirect( home_url() );

Sie ist derzeit so eingestellt, dass Benutzer zur Homepage der Website weitergeleitet werden. Sie müssen sie ändern, um entweder zum Pfad oder zur vollständigen URL der Anmeldeseite Ihrer Website weiterzuleiten:

wp_safe_redirect( /* path_to_your_signup_page */ );

Beachten Sie, dass ich diesen Code nicht getestet habe. Wenn Sie Änderungen direkt an der functions.php-Datei Ihrer Live-Site vornehmen, stellen Sie sicher, dass Sie von Ihrem Backend aus auf die functions.php-Datei der Website zugreifen können, falls es Fehler oder Tippfehler im Code gibt.

4 „Gefällt mir“

Ich hinterlasse mir hier eine Notiz bezüglich \u003chttps://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4\u003e. Wenn die Option Discourse-Benutzer bei der Anmeldung erstellen oder synchronisieren von WP Discourse aktiviert ist, werden für alle Benutzer auf der WordPress-Site automatisch Discourse-Konten erstellt, auch wenn sie über die im OP beschriebene Methode von der Anmeldung bei Discourse ausgeschlossen sind. Details darüber, wie die automatische Erstellung von Konten für Benutzer, die nicht über die entsprechende Mitgliedschaftsstufe verfügen, verhindert werden kann, finden Sie im zweiten Teil dieses Beitrags: How to prevent some WP users from being able to login to Discourse - #2 by simon.

Im Grunde:

add_filter( 'wpdc_bypass_sync_sso', 'wpdc_custom_bypass_sync_sso', 10, 3 );
function wpdc_custom_bypass_sync_sso( $bypass_sync, $user_id, $user ) {
    if ( /* Some condition that returns true if the user doesn't meet the membership requirement */  ) {

        $bypass_sync = true;
    }

    return $bypass_sync;
}

Ich setze mich daran, den OP mit diesen Details zu aktualisieren.

2 „Gefällt mir“

Danke, Simon. Ich konnte dies mit Ihren Anweisungen für meine Website einrichten.

1 „Gefällt mir“

Eine Klarstellung.

Kein Level (kein Benutzer): 0
Kostenloses Level = 1
Ich habe zwei bezahlte Level: 2,3

Sie sagten:

Was Sie tun müssen, ist, den Kommentar /* some condition */ im Code durch eine Bedingung zu ersetzen, die für Benutzer, die keine bezahlten Mitgliedschaften haben, true zurückgibt. Diese Benutzer können dann auf Ihre Mitgliedschaftsanmeldeseite weitergeleitet werden.

Und

Um die Funktion pmpro_hasMembershipLevel zu verwenden, müssen Sie die IDs (oder die Namen) Ihrer beiden bezahlten Mitgliedschaftslevel kennen. Sie können diese IDs auf der Admin-Seite „Membership Levels“ von pmp abrufen. Wenn die IDs Ihrer beiden bezahlten Level beispielsweise 1 und 2 sind, könnten Sie die folgende Bedingung verwenden:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Widersprechen sich diese Aussagen?

Meiner Meinung nach:
Ich sollte Folgendes verwenden:

if (! pmpro_hasMembershipLevel(array(0,1), $user_id))

um Benutzer, die KEINE bezahlte Mitgliedschaft haben, zur Mitgliedschaftsanmeldeseite weiterzuleiten.

Bitte korrigieren Sie mich, wenn ich falsch liege.

Danke.

Wenn die Bedingung true zurückgibt, werden die Benutzer zu Ihrer Anmeldeseite weitergeleitet.

Ich denke, das Sicherste für Ihren Fall wäre, eine Bedingung zu verwenden, die true zurückgibt, wenn der Benutzer weder Stufe 2 noch 3 hat:

if (! pmpro_hasMembershipLevel(array(2, 3), $user_id))

1 „Gefällt mir“

Danke. Ich habe das „!“ in Ihrem zweiten Codeausschnitt übersehen.

1 „Gefällt mir“