Holy
! 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.
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.
Awesome, anything stopping this being wrapped into a plugin for customers who arenât confident editing PHP?
No, probably not, but PHP/WP development isnât my forte, and I donât plan on personally actively maintaining this code long-term.
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.
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;
}
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 ![]()
Ci darò unâocchiata piĂš tardi, ma penso che valga la pena menzionarlo
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.
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.
Grazie, Simon. Sono riuscito a impostarlo per il mio sito web seguendo le tue istruzioni.
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 restituiscatrueper 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))
Grazie. Mi è mancato il segno â!â nella tua seconda porzione di codice.


