Gestisci l'iscrizione ai gruppi su Discourse con 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 Mi Piace

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 Mi Piace

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

1 Mi Piace

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 Mi Piace

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 Mi Piace

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 Mi Piace

Mi rendo conto che questo è solo codice di esempio, ma sembra avere un bug piuttosto critico.

Se il pagamento non viene completato e lo stato dell’abbonamento è “token”

Il gruppo viene comunque aggiunto all’utente di discourse :open_mouth:

Ci darò un’occhiata più tardi, ma penso che valga la pena menzionarlo


1 Mi Piace

Vorrei usare questo codice per limitare la mia community Discourse ESCLUSIVAMENTE ai membri paganti che utilizzano Paid Memberships Pro. Ho un livello di iscrizione gratuito e due livelli di iscrizione a pagamento.

Come posso modificare questo codice: Manage group membership in Discourse with WP Discourse SSO

in modo che SOLO i membri paganti possano accedere alla community. Altrimenti, verranno reindirizzati alla pagina di iscrizione ai piani a pagamento.

Grazie.

Per riferimento personale, ecco il codice che si desidera modificare:

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

Ciò che devi fare è sostituire il commento /* some condition */ del codice con una condizione che restituisca true per gli utenti che non hanno iscrizioni a pagamento. Questi utenti potranno quindi essere reindirizzati alla pagina di iscrizione dei tuoi membri.

Attualmente non ho installato il plugin Paid Memberships Pro sul mio sito di test, ma dalla loro documentazione, sembra che tu possa utilizzare la loro funzione pmpro_hasMembershipLevel per verificare se un utente ha un determinato livello di iscrizione: Using the pmpro_hasMembershipLevel() Function.

Per utilizzare la funzione pmpro_hasMembershipLevel, devi conoscere gli ID (o i nomi) dei tuoi due livelli di iscrizione a pagamento. Puoi ottenere questi ID dalla pagina di amministrazione “Membership Levels” di pmp. Ad esempio, se gli ID dei tuoi due livelli a pagamento sono 1 e 2, potresti usare la seguente condizione:

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

Sostituito nel codice, sarebbe:

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’altra riga che dovrai cambiare è:

wp_safe_redirect( home_url() );

Attualmente è impostata per reindirizzare gli utenti alla homepage del sito. Dovrai cambiarla per reindirizzare al percorso o all’URL completo della pagina di iscrizione del tuo sito:

wp_safe_redirect( /* path_to_your_signup_page */ );

Nota che non ho testato questo codice. Se stai apportando modifiche direttamente al file functions.php del tuo sito live, assicurati di poter accedere al file functions.php del sito dal backend del sito, nel caso ci siano errori o refusi nel codice.

4 Mi Piace

Mi lascio una nota qui relativa a https://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4. Se l’opzione WP Discourse Crea o sincronizza utenti Discourse al login è abilitata, gli account Discourse verranno creati automaticamente per tutti gli utenti del sito WordPress, anche se viene loro impedito di accedere a Discourse tramite il metodo descritto nell’OP. I dettagli su come impedire la creazione automatica di account per gli utenti che non dispongono del livello di appartenenza appropriato si trovano nella seconda parte di questo post: How to prevent some WP users from being able to login to Discourse - #2 by simon.

In pratica:

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 ( /* Una condizione che restituisce true se l'utente non soddisfa il requisito di appartenenza */  ) {

        $bypass_sync = true;
    }

    return $bypass_sync;
}

Mi sto impostando un promemoria per aggiornare l’OP con quei dettagli.

2 Mi Piace

Grazie, Simon. Sono riuscito a impostarlo per il mio sito web seguendo le tue istruzioni.

1 Mi Piace

Un chiarimento.

Nessun livello (non un utente): 0
Livello gratuito = 1
Ho due livelli a pagamento: 2,3

Hai detto

Quello che devi fare è sostituire il commento /* some condition */ del codice con una condizione che restituisca true per gli utenti che non hanno abbonamenti a pagamento. Questi utenti possono quindi essere reindirizzati alla tua pagina di iscrizione all’abbonamento.

E

Per utilizzare la funzione pmpro_hasMembershipLevel, devi conoscere gli ID (o i nomi) dei tuoi due livelli di abbonamento a pagamento. Puoi ottenere questi ID dalla pagina di amministrazione “Livelli di abbonamento” di pmp. Ad esempio, se gli ID dei tuoi due livelli a pagamento sono 1 e 2, potresti usare la seguente condizione:

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

Queste affermazioni sono in contraddizione?

Nella mia comprensione:
Dovrei usare il seguente:

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

per reindirizzare alla pagina di iscrizione all’abbonamento gli utenti che NON hanno un abbonamento a pagamento.

Per favore, correggimi se sbaglio.

Grazie.

Se la condizione restituisce true, gli utenti verranno reindirizzati alla tua pagina di iscrizione.

Penso che la cosa più sicura da fare nel tuo caso sarebbe usare una condizione che restituisca true se l’utente non ha né il livello 2 né il livello 3:

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

1 Mi Piace

Grazie. Mi è mancato il segno “!” nella tua seconda porzione di codice.

1 Mi Piace