Memberpress + WP Discourse (Gestione Gruppi)

Sono anni che bazzico sui forum di meta.discourse, raccogliendo frammenti e imparando come migliorare un sito cliente che utilizza Wordpress + Memberpress + Discourse (self-hosted).

Avevo bisogno (e ho ancora bisogno) di assegnare Gruppi di Discourse in base agli Abbonamenti di Memberpress.

Per riferimento:

In precedenza (per alcuni anni) ho utilizzato il metodo del filtro add_filter( 'wpdc_sso_params':

Lo svantaggio sembrava essere che i Gruppi di Discourse si aggiornavano solo al login dell’utente, io volevo qualcosa che avesse un effetto più immediato (ad esempio quando avviene una transazione di Memberpress).

Ammetto che le mie capacità di programmazione PHP sono piuttosto basilari. Sono più uno sviluppatore front-end HTML/CSS.

Ora ho riscritto le mie funzioni per il sito del cliente utilizzando una funzione migliore di WP Discourse descritta qui

Che utilizza le funzioni: \\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group e: \\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group.

Ora posso ascoltare gli eventi di Memberpress e aggiungere i Gruppi di Discourse con questo blocco di codice (functions.php):

add_action('mepr-event-create', 'listen_to_mepr_events');
function listen_to_mepr_events($event) {
  $obj = $event->get_data();
  //$obj potrebbe essere un oggetto MeprTransaction o un oggetto MeprSubscription

  if(!($obj instanceof MeprTransaction) && !($obj instanceof MeprSubscription)) {
    return; // niente da fare qui se non stiamo trattando con una transazione o un abbonamento
  }

  $member = $obj->user(); // ottieni i dati dell'oggetto membro dall'oggetto evento

  $user_id = $member->ID; // ottieni l'ID utente dall'oggetto

  if($member->is_active_on_membership($obj)) { // abbonamento attivo
    
    if(3780 == $obj->product_id) { // Abbonamento MENSILE
        $add_group = 'Ksenia_Basic'; // Nome del Gruppo Discourse
        $remove_groups = ['Ksenia_Essential','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // aggiungi al Gruppo Discourse
        \\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // rimuovi dai Gruppi Discourse
        \\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
    else if(3847 == $obj->product_id) { // Abbonamento di 6 mesi (Essential)
        $add_group = 'Ksenia_Essential'; // Nome del Gruppo Discourse
        $remove_groups = ['Ksenia_Basic','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // aggiungi al Gruppo Discourse
        \\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // rimuovi dai Gruppi Discourse
        \\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
  }
  else { //nessuna corrispondenza
  }
}

Riferimento aggiuntivo: L’hook di azione di Memberpress add_action('mepr-event-create', 'listen_to_mepr_events'); può essere trovato qui:

Per tua informazione, questa è una versione semplificata di ciò che sto usando sul sito del mio cliente. La versione completa (che include la gestione di Learndash + Mailster) può essere trovata qui: Memberpress + Learndash + Mailster + WP Discourse · GitHub

Grazie a tutti in questo forum che hanno fornito frammenti e supporto nel corso degli anni. So che ci sono molti lurker come me che trovano questa una risorsa estremamente preziosa e utile.

Se avete suggerimenti o vedete problemi nel mio esempio, fatemi sapere come posso migliorare.

6 Mi Piace

Grazie Andrew, ci darò un’occhiata domani e ti darò una risposta più dettagliata lunedì. Come nota iniziale, hai dato un’occhiata al plugin di sincronizzazione di gruppo Memberpress sviluppato da @fzngagan?

4 Mi Piace

Basato sui ruoli - bello :sunglasses: No, non avevo visto quel plugin. Contributo eccellente.

1 Mi Piace

Come potrei procedere per implementare questo? Sto usando Wordpress con Memberpress e ho appena installato Discourse su un sottodominio ospitato su un droplet DigitalOcean. Devo letteralmente caricare il codice come farei per un plugin?

Sì, wp-discourse-mepr-sync è solo un plugin Wordpress di un file.

1 Mi Piace

Ho appena dato un’occhiata al codice. Nel caso non fosse chiaro, il plugin Memberpress Sync dipende dal codice del plugin WP Discourse: WP Discourse – WordPress plugin | WordPress.org. Ciò significa che dovrai anche installare, attivare e configurare il plugin WP Discourse: Connect WP Discourse to Discourse. Dovrai anche configurare il tuo sito WordPress come provider DiscourseConnect per il tuo sito Discourse. I dettagli su come impostarlo sono qui: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

C’è qualcosa nel plugin Memberpress Sync che non mi è chiaro. Mi sembra che ci siano due ID prodotto Memberpress e due gruppi Discourse codificati nel codice del plugin:

Penso che dovrai apportare alcune modifiche a quel file. I valori nell’array definito da PV_MEMBERPRESS_PRODUCT_IDS dovranno essere impostati sugli ID di abbonamento del tuo sito. Dovrai anche impostare le definizioni PV_DISCOURSE_ENROLLED_GROUP e PV_DISCOURSE_UNENROLLED_GROUP sui gruppi che esistono sul tuo sito Discourse.

Sembra che il plugin aggiunga tutti gli utenti che hanno un abbonamento attivo per uno qualsiasi dei tuoi prodotti al PV_DISCOURSE_ENROLLED_GROUP. Se un utente che aveva uno o più abbonamenti attivi vede scadere tutti i suoi abbonamenti, verrà rimosso dal PV_DISCOURSE_ENROLLED_GROUP e aggiunto al PV_DISCOURSE_UNENROLLED_GROUP.

Forse @fzngagan può confermare se questo è corretto? Se lo è, sarà abbastanza semplice impostare il codice per il sito di @earlysound. È possibile che stia fraintendendo il funzionamento del plugin, però. Non ho una copia del plugin Memberpress. Se potessi avere accesso a una versione di sviluppo di Memberpress, potrei testarlo io stesso.

1 Mi Piace

Sto leggendo la stessa logica dal codice come hai spiegato. Sarebbe davvero bello se @fzngagan potesse confermare.

Ciao ragazzi, so che sono passati alcuni mesi dall’ultimo post, ma spero che quanto segue sia ancora utile.

Ovviamente non sono @fzngagan, ma sono il cliente per cui questo plugin è stato originariamente sviluppato!

L’idea è che volevamo aggiungere automaticamente gli utenti con un abbonamento Memberpress ricorrente attivo a un gruppo Discourse specifico.

Quando gli utenti si disiscrivevano e se ne andavano, venivano rimossi dal gruppo Discourse e aggiunti invece a un gruppo “Alumni”, che aveva accesso solo a determinate aree del forum.

@simon ha ragione sul fatto che gli ID di appartenenza e i gruppi Discourse sono codificati in modo fisso. Credo che dovrebbe bastare sostituirli con i propri per poterlo utilizzare.

Sì, è corretto. Dovresti solo cambiare questi valori

define('PV_MEMBERPRESS_PRODUCT_IDS', array(153, 161));
define('PV_DISCOURSE_ENROLLED_GROUP', 'locker');
define('PV_DISCOURSE_UNENROLLED_GROUP', 'KaizenAlumni');
define('PV_MEPR_ACTIVE_STATUSES', array('complete'));
1 Mi Piace