Sincronizza WooCommerce Memberships con i gruppi Discourse

Se non è necessario rimuovere le persone dal gruppo dopo un certo periodo di tempo, ovvero se acquistano l’accesso a vita al gruppo anziché un accesso temporaneo o periodico, puoi agganciarti all’hook woocommerce_payment_complete e aggiungerle al gruppo al momento dell’acquisto. Puoi anche agganciarti al SSO e aggiornare i loro gruppi al momento dell’accesso.

1 Mi Piace

Grazie, Jay!

Fin dall’inizio non offriremo un’opzione di accesso a vita per nessuno dei nostri gruppi di membership. La natura del nostro “mercato dei mentor” prevede che gli utenti abbiano un coach/mentor il cui gruppo desiderano unirsi. Potrebbero provarlo per un paio di mesi e poi annullare, scegliendo di iscriversi a un mentor diverso che potrebbe soddisfare meglio le loro esigenze o aspettative.

Quindi avremmo bisogno di un SYNC attivo in modo che, quando un membro si iscrive a un gruppo personalizzato in WP, venga automaticamente aggiunto al rispettivo gruppo in Discourse; e se qualcuno annulla la propria iscrizione su WP, verrà automaticamente rimosso dal gruppo in Discourse.

Se vuoi l’ultima versione di questo codice, puoi trovarla in questo repository: GitHub - paviliondev/discourse-woocommerce · GitHub.

Questo è utilizzato in produzione e continua a funzionare come descritto.

Passaggi

  1. Installa il codice come plugin di WordPress.
  2. Aggiorna gli ID del gruppo e del piano.
  3. La sincronizzazione avverrà ad ogni modifica dello stato dell’iscrizione.

Se qualcuno potesse wikificare l’OP, lo aggiornerò con istruzioni migliori.

6 Mi Piace

Ciao! Ho acquistato il plugin Woocommerce Memberships. Fa tutto ciò che serve. Poi per me si è chiarito tutto. Ho pubblicato qui una guida per un’integrazione perfettamente funzionante che ho configurato.

1 Mi Piace

Quindi installi prima il plugin nell’OP?

Sono come te: uso Wordpress come fornitore per il nostro SSO… non Discourse (come indicato nel titolo di questo argomento e nell’OP)

So che l’OP riguarda la sincronizzazione dei gruppi quando Discourse è il provider SSO, ma avrebbe senso aggiornare il titolo dell’argomento e includere istruzioni per eseguire questa sincronizzazione quando WordPress è il provider SSO?

@Ed_Bobkov ha fornito alcuni dettagli su come eseguire la sincronizzazione con un’inversione del provider SSO…

Quindi, per chiarire…

Sarebbe davvero ottimo e probabilmente utile ad altri nel lungo termine se nell’OP fossero presenti due diversi set di istruzioni…

Sincronizzare i membri WooCommerce con i gruppi Discourse quando:

  1. Discourse è il provider SSO
  2. WordPress è il provider SSO
2 Mi Piace

Hai torto. Io uso Discourse come provider SSO. Ma questo non cambia il senso.
Puoi trovare qui argomenti con istruzioni quando WP è il provider SSO.
La cosa principale è che:

  1. Puoi gestire le tue iscrizioni ai gruppi, gli abbonamenti e i termini in Wordpress, in tutti i casi - sia quando WP è un provider SSO che quando Discourse è un provider SSO - tramite il plugin “WooCommerce Memberships”.
  2. Per sincronizzare membri e gruppi di Discourse con Wordpress, in tutti i casi devi usare questo plugin: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. Nelle sue impostazioni puoi scegliere il tipo di integrazione: se WP o Discourse è il provider SSO.
    Anche questo plugin potrebbe essere utile: GitHub - paviliondev/discourse-woocommerce · GitHub
  3. Per eseguire una sincronizzazione batch tramite cron, devi usare questo plugin: WP Crontrol – WordPress plugin | WordPress.org
    Le istruzioni dettagliate le trovi in questo argomento (sopra).
4 Mi Piace

Quel link ora restituisce un 404. Si è spostato?

1 Mi Piace

L’OP è ora un wiki.

2 Mi Piace

Ho aggiornato l’OP con un link all’ultima versione del codice e alle istruzioni.

Ah, avevo dimenticato di renderlo pubblico. Grazie.

@jord8on Come menziona Ed, dovresti utilizzare il plugin ufficiale Discourse per Wordpress se Wordpress è il provider SSO.

2 Mi Piace

Sto riscontrando un problema riguardo all’integrazione di WooCommerce con Discourse.
Se l’utente acquistasse una specifica membership, verrebbe automaticamente assegnato al rispettivo gruppo in Discourse.
Funziona perfettamente nella maggior parte dei casi.
Ma a volte non è automatizzato. Ad esempio, 8 utenti su 10 sono stati assegnati a un specifico gruppo Discourse all’acquisto della membership, ma gli altri due no. Quindi voglio renderlo automatizzato per tutti gli utenti.
Qualsiasi suggerimento su come posso renderlo completamente automatizzato?

Ehi :slight_smile:

Puoi confermarmi ognuna di queste cose:

  1. Stai usando Discourse come tuo provider Discourse Connect (le persone accedono con il modulo di accesso di Discourse per accedere a Wordpress)
  2. Stai usando il plugin WP Discourse in Wordpress
  3. Stai usando il codice che ho pubblicato nel primo post di questo argomento in Wordpress

È corretto?

La tua seconda opzione è giusta, sto usando il plugin discourse, E come ho menzionato che i miei utenti vengono assegnati automaticamente a un gruppo specifico se acquistano una specifica membership.

Tutte le cose funzionano bene. Solo che dopo un paio di mesi o più (occasionalmente) si verifica questo problema che un utente casuale non viene assegnato a un gruppo specifico dopo aver acquistato la membership.

Voglio eliminare anche quel problema che si verifica occasionalmente.

Se solo la seconda opzione è corretta, allora queste istruzioni purtroppo non funzioneranno per te. Tutte e tre devono essere vere. Sembra che tu abbia una sincronizzazione funzionante. Giusto per capire, hai:

  1. Il plugin WP Discourse installato; e

  2. Codice per sincronizzare i tuoi gruppi WooCommerce (ad esempio, come questo) ← L’hai aggiunto? Potresti condividere cosa hai aggiunto?

2 Mi Piace

No, penso che il plugin abbia gestito tutta l’automazione, non ricordo di aver inserito alcun tipo di codice per l’integrazione.

Forse il mio plugin è alla versione 2.2.3 e non è aggiornato perché l’aggiornamento disponibile è il 2.4.1.

Forse sta succedendo a causa di questa versione. Ma sono un po’ curioso di sapere se dopo aver effettuato un aggiornamento ha danneggiato le mie attuali funzionalità o meno.

Per sincronizzare i gruppi tra WooCommerce e Discourse è necessario del codice personalizzato. Il plugin WP Discourse non lo farà da solo. Molto probabilmente hai un’implementazione delle funzioni descritte qui.

Dovrai prima identificare come avviene la sincronizzazione (non è solo il plugin WP Discourse) prima che io possa aiutarti ulteriormente.

1 Mi Piace

Ho aggiunto del codice al mio WordPress, quello pubblicato da @Ed_Bobkov:

<?php 

//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“112” => “41”
];

//const ACTIVE_STATUSES = array( ‘wcm-active’ );
const ACTIVE_STATUSES = array( ‘wcm-active’, ‘wcm-free_trial’ );

function update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status ) {
$options = DiscourseUtilities::get_options();
$base_url = $options[‘url’];
$api_key = $options[‘api-key’];
$api_username = $options[‘publish-username’];

if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
	return new \WP_Error( 'discourse_configuration_error', 'Il plugin WP Discourse non è stato configurato correttamente.' );
}

$user_info         = get_userdata( $user_id );
$user_email        = $user_info->user_email;
$logger            = wc_get_logger();

$logger->info( sprintf( '%s membership of %s changed to %s', $user_email, $membership_plan_name, $status ) );

if ( in_array( $status, ACTIVE_STATUSES ) ) {
	$action = 'PUT';
} else {
	$action = 'DELETE';
}

$external_url = esc_url_raw( $base_url . "/groups/" . MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id] . "/members" );

$logger->info( sprintf( 'Sending %s request to %s with %s', $action, $external_url, $user_email ) );

$response = wp_remote_request( $external_url,
	array(
		'method'  => $action,
		'headers' => array(
			'Api-Key'      => sanitize_key( $api_key ),
			'Api-Username' => sanitize_text_field( $api_username ),
		),
		'body'    => array( 'user_emails' => $user_email ),
	)
);

$logger->info( sprintf( 'Response from Discourse: %s %s',
	wp_remote_retrieve_response_code( $response ),
	wp_remote_retrieve_response_message( $response ) ) );

if ( ! DiscourseUtilities::validate( $response ) ) {

	return new \WP_Error( 'discourse_response_error', 'Si è verificato un errore nel recupero dei dati utente da Discourse.' );
}
}

function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();

$logger->info( sprintf( 'Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );

$user_id            = $args['user_id'];

$membership         = wc_memberships_get_user_membership( $args['user_membership_id'] );

$membership_plan_id = $membership->plan->id;

if ( $membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
	$membership_plan_name = $membership_plan->name;
	$status               = $membership->status;
	update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );
}
}
add_action( ‘wc_memberships_user_membership_saved’, ‘handle_wc_membership_saved’, 10, 2 );

/* run_full_wc_membership_sync */
function full_wc_membership_sync() {
$allusers = get_users();
$logger = wc_get_logger();

$logger->info( sprintf('Running full_wc_membership_sync') );

foreach ( $allusers as $user ) {

   $user_id = $user->id;

   $membership = wc_memberships_get_user_membership($user_id);

   $membership_plan_id = $membership->plan->id;

   $logger->info( sprintf('Checking membership of %s', $user->user_login) );

   if ($membership  && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
       
	  $membership_plan_name = $membership->plan->name;
      
	  $status = $membership->status;
      
	  $logger->info( sprintf('Updating group access of %s', $user->user_login) );

	  update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);

	  $logger->info( sprintf('Sleeping for 5 seconds') );
      
	  sleep(5);
   }
}
}

add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);

Ho anche aggiunto ed eseguito tramite WP Crontrol run_full_wc_membership_sync.

Purtroppo… l’utente di WordPress con Membership attiva (id 112) non viene aggiunto al gruppo discourse (id 41). Cosa mi manca?

Poiché ciò continua a confondere le persone, pubblicherò un "Come fare" completo con la sincronizzazione degli abbonamenti WooCommerce (sia che WordPress o Discourse sia il provider di DiscourseConnect) :slight_smile: . Controlla qui all’inizio della prossima settimana se non ti ho già contattato al riguardo.

3 Mi Piace

Grazie! Ho appena provato a capirlo… Ho persino usato un plugin GitHub - paviliondev/discourse-woocommerce ma senza fortuna neanche con quello

1 Mi Piace