Sync WooCommerce Memberships with Discourse groups

If you don’t need people to get removed from the group after some period of time, that is, they buy lifetime access to the group rather than temporary/periodic access to the group, then you can hook to woocommerce_payment_complete and add them to the group when the purchase is made. You can also hook to the SSO and update their groups at login.

1 Mi Piace

Thanks Jay!

Out of the gate we will not offer a lifetime access option for any of our membership groups. The nature of our “mentor marketplace” is that users will have a coach/mentor whose group they want to join. They may try it for a couple months and then cancel, and choose to sign up with a different mentor that might better suit their needs or expectations.

So we would need an active SYNC in order that when a member subscribes to a custom group in WP, then are automatically added to the respective group, in Discourse, and if anyone cancels their membership on WP, they would be automatically removed from the group, in Discourse.

If you want the latest version of this code you can find it in this repository: https://github.com/paviliondev/discourse-woocommerce.

This is used in production and continues to work as described.

Steps

  1. Install the code as a wordpress plugin.
  2. Update the group and plan ids.
  3. The sync will occur on each membership status change.

If someone could wikify the OP, I’ll update it with better instructions.

6 Mi Piace

Hi! I bought the plugin Woocommerce memberships. It does everything you need. Then everything cleared for me. I posted here an instruction on a fully working integration that I set.

1 Mi Piace

So do you install the plugin in the OP first?

I’m like you in that I’m using Wordpress as the provider for our SSO… not Discourse (as noted in this topic title and OP)

I know the OP is about Syncing groups when Discourse is the SSO provider, but would it make sense to update the topic title and include instructions for doing this sync when Wordpress is the SSO provider?

@Ed_Bobkov provided some details on how to do the sync with an inverse of the SSO provider…

So just to clarify…

It would be really great and probably helpful to others In the long run if there were two different sets of instructions in the OP…

Sync WooCommerce Memberships with Discourse groups when:

  1. Discourse is the SSO Provider
  2. Wordpress is the SSO Provider
2 Mi Piace

You are wrong. I use Discourse as a SSO provider. But that doesn’t change the sense.
You can find here topics with instructions when WP is SSO provider.
The main thing is that:

  1. You can manage your group memberships in Wordpress, subscriptions and terms by the plugin “WooCommerce Memberships” in all cases - when WP is a SSO provider OR Discourse is a SSO provider.
  2. To sync Discours members and groups with Wordpress you need in all cases use this plugin: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog. In its’ settings you can choose the type of integration - WP or Discourse is a SSO provider.
    Also this plugin may be useful: GitHub - paviliondev/discourse-woocommerce
  3. To do a batch syncing by cron you need to use this plugin: WP Crontrol – WordPress plugin | WordPress.org
    Detailed instructions you can find in this topic (above).
4 Mi Piace

That link is now a 404. Did it move?

1 Mi Piace

The OP is now a wiki.

2 Mi Piace

I’ve updated the OP with a link to the latest version of the code and instructions.

Ah I had forgot to make it public. Thanks.

@jord8on As Ed mentions, you should use the official Discourse Wordpress plugin if Wordpress is the SSO provider.

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