Gérer l'adhésion au groupe dans Discourse avec WP Discourse SSO

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 « J'aime »

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 « J'aime »

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

1 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

Je réalise que ce ne sont que des exemples de code, mais il semble y avoir un bug assez critique.

Si le paiement n’est pas terminé et que le statut de l’adhésion est “token”

Le groupe est toujours ajouté à l’utilisateur discourse :open_mouth:

Je vais examiner cela plus tard, mais je pense que cela vaut la peine d’être mentionné.


1 « J'aime »

Je souhaite utiliser ce code pour restreindre ma communauté Discourse UNIQUEMENT aux membres payants utilisant Paid Memberships Pro. J’ai un niveau d’adhésion gratuit et deux niveaux d’adhésion payants.

Comment puis-je modifier ce code : Manage group membership in Discourse with WP Discourse SSO

afin que SEULS les membres payants puissent accéder à la communauté. Sinon, ils seront redirigés vers la page d’inscription aux adhésions payantes.

Merci.

Pour ma propre référence, voici le code que vous souhaitez modifier :

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 ( /* une condition */ ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

Ce que vous devez faire est de remplacer le commentaire /* une condition */ du code par une condition qui renverra true pour les utilisateurs qui n’ont pas d’adhésions payantes. Ces utilisateurs pourront alors être redirigés vers votre page d’inscription aux adhésions.

Je n’ai pas actuellement le plugin Paid Memberships Pro installé sur mon site de test, mais d’après leur documentation, il semble que vous puissiez utiliser leur fonction pmpro_hasMembershipLevel pour vérifier si un utilisateur a un niveau d’adhésion donné : Using the pmpro_hasMembershipLevel() Function.

Pour utiliser la fonction pmpro_hasMembershipLevel, vous devez connaître les identifiants (ou les noms) de vos deux niveaux d’adhésion payants. Vous pouvez obtenir ces identifiants à partir de la page d’administration « Niveaux d’adhésion » de pmp. Par exemple, si les identifiants de vos deux niveaux payants sont 1 et 2, vous pourriez utiliser la condition suivante :

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

Substitué dans le code, cela donnerait :

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;
    }
}

L’autre ligne que vous devrez modifier est :

wp_safe_redirect( home_url() );

Elle est actuellement configurée pour rediriger les utilisateurs vers la page d’accueil du site. Vous devrez la modifier pour rediriger vers le chemin ou l’URL complète de la page d’inscription de votre site :

wp_safe_redirect( /* chemin_vers_votre_page_inscription */ );

Notez que je n’ai pas testé ce code. Si vous apportez des modifications directement au fichier functions.php de votre site en direct, assurez-vous d’avoir accès au fichier functions.php du site depuis le backend du site, juste au cas où il y aurait des erreurs ou des fautes de frappe dans le code.

4 « J'aime »

Je me laisse une note ici concernant \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. Si l’option WP Discourse Créer ou synchroniser les utilisateurs Discourse lors de la connexion est activée, des comptes Discourse seront automatiquement créés pour tous les utilisateurs du site WordPress, même s’ils sont empêchés de se connecter à Discourse via la méthode décrite dans le message initial. Les détails sur la manière d’empêcher la création automatique de comptes pour les utilisateurs qui n’ont pas le niveau d’adhésion approprié se trouvent dans la deuxième partie de ce message : How to prevent some WP users from being able to login to Discourse - #2 by simon.

En gros :

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 ( /* Une condition qui retourne true si l'utilisateur ne remplit pas la condition d'adhésion */  ) {

        $bypass_sync = true;
    }

    return $bypass_sync;
}

Je me donne un rappel pour mettre à jour le message initial avec ces détails.

2 « J'aime »

Merci, Simon. J’ai pu configurer cela pour mon site Web en suivant vos instructions.

1 « J'aime »

Une clarification.

Aucun niveau (pas un utilisateur) : 0
Niveau gratuit = 1
J’ai deux niveaux payants : 2,3

Vous avez dit

Ce que vous devez faire est de remplacer le commentaire /* some condition */ du code par une condition qui renverra true pour les utilisateurs qui n’ont pas d’adhésions payantes. Ces utilisateurs pourront alors être redirigés vers votre page d’inscription aux adhésions.

Et

Pour utiliser la fonction pmpro_hasMembershipLevel, vous devez connaître les identifiants (ou les noms) de vos deux niveaux d’adhésion payants. Vous pouvez obtenir ces identifiants à partir de la page d’administration “Niveaux d’adhésion” de pmp. Par exemple, si les identifiants de vos deux niveaux payants sont 1 et 2, vous pourriez utiliser la condition suivante :

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

Ces affirmations se contredisent-elles ?

Selon ma compréhension :
Je devrais utiliser ce qui suit :

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

pour rediriger les utilisateurs qui N’ONT PAS d’adhésion payante vers la page d’inscription aux membres.

Veuillez me corriger si je me trompe.

Merci.

Si la condition renvoie true, les utilisateurs seront redirigés vers votre page d’inscription.

Je pense que la chose la plus sûre à faire dans votre cas serait d’utiliser une condition qui renvoie true si l’utilisateur n’a ni le niveau 2 ni le niveau 3 :

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

1 « J'aime »

Merci. J’ai oublié le « ! » dans votre deuxième extrait.

1 « J'aime »