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 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

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 « J'aime »

That link is now a 404. Did it move?

1 « J'aime »

The OP is now a wiki.

2 « J'aime »

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 « J'aime »

Je rencontre un problème concernant l’intégration de WooCommerce avec Discourse.
Si l’utilisateur achète une adhésion spécifique, il sera automatiquement assigné au groupe respectif dans Discourse.
Cela fonctionne parfaitement dans la plupart des cas.
Mais parfois, ce n’est pas automatisé. Par exemple, 8 utilisateurs sur 10 ont été assignés à un groupe Discourse spécifique lors de l’achat d’une adhésion, mais les deux autres ne l’ont pas été. Je veux donc automatiser cela pour tous les utilisateurs.
Avez-vous des suggestions sur la façon dont je peux rendre cela entièrement automatisé ?

Salut :slight_smile:

Pouvez-vous juste me confirmer chacune de ces choses :

  1. Vous utilisez Discourse comme fournisseur de Discourse Connect (les gens se connectent avec le formulaire de connexion Discourse pour se connecter à Wordpress)
  2. Vous utilisez le plugin WP Discourse dans Wordpress
  3. Vous utilisez le code que j’ai posté dans le premier message de ce sujet dans Wordpress

Est-ce exact ?

Votre deuxième option est la bonne, j’utilise un plugin Discourse. Et comme je l’ai mentionné, mes utilisateurs sont automatiquement assignés à un groupe spécifique s’ils achètent une adhésion spécifique.

Tout fonctionne bien. C’est juste qu’après quelques mois ou plus (occasionnellement), ce problème survient : un utilisateur aléatoire n’est pas assigné au groupe spécifique après l’achat de l’adhésion.

Je veux me débarrasser également de ce problème qui survient occasionnellement.

Si seule la deuxième option est correcte, alors ces instructions ne fonctionneront malheureusement pas pour vous. Les trois doivent être vraies. Il semble que vous ayez une synchronisation en cours. Juste pour que je comprenne, vous avez :

  1. Le plugin WP Discourse installé ; et

  2. Du code pour synchroniser vos groupes WooCommerce (par exemple, comme ceci) ← L’avez-vous ajouté ? Pourriez-vous partager ce que vous avez ajouté ?

2 « J'aime »

Non, je pense que le plugin a géré toute l’automatisation, je ne me souviens pas avoir placé de code pour l’intégration.

Peut-être que mon plugin est la version 2.2.3, et qu’il est obsolète car la mise à jour disponible est la 2.4.1.

Peut-être que cela est dû à cette version. Mais je suis un peu curieux de savoir si, après une mise à jour, cela a nui à mes fonctionnalités actuelles ou non.

Pour synchroniser les groupes entre WooCommerce et Discourse, vous avez besoin de code personnalisé. Le plugin WP Discourse ne le fera pas tout seul. Vous avez très probablement une implémentation des fonctions décrites ici.

Vous devrez d’abord identifier comment la synchronisation se produit (ce n’est pas seulement le plugin WP Discourse) avant que je puisse vous aider davantage.

1 « J'aime »

J’ai ajouté du code à mon WordPress - celui que @Ed_Bobkov a publié :

<?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', 'Le plugin WP Discourse n\'a pas été correctement configuré.' );
}

$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', 'Une erreur s\'est produite lors de la récupération des données utilisateur de 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’);

J’ai également ajouté et exécuté via WP Crontrol run_full_wc_membership_sync

Malheureusement… l’utilisateur WordPress avec une adhésion active (id 112) n’est pas ajouté au groupe discourse (id 41). Qu’est-ce qui me manque ?

Comme cela continue de confondre les gens, je vais publier un guide complet sur la synchronisation des adhésions WooCommerce (que WordPress ou Discourse soit le fournisseur de DiscourseConnect) :). Veuillez vérifier ici en début de semaine prochaine si je ne vous ai pas déjà contacté à ce sujet.

3 « J'aime »

Merci ! J’ai juste essayé de comprendre… J’ai même utilisé un plugin GitHub - paviliondev/discourse-woocommerce mais sans succès non plus

1 « J'aime »