Synchroniser WooCommerce Memberships avec les groupes Discourse

Si vous n’avez pas besoin que les personnes soient retirées du groupe après un certain délai, c’est-à-dire qu’elles achètent un accès à vie au groupe plutôt qu’un accès temporaire ou périodique, vous pouvez vous connecter à l’action woocommerce_payment_complete et les ajouter au groupe lors de l’achat. Vous pouvez également vous connecter à l’SSO et mettre à jour leurs groupes lors de la connexion.

1 « J'aime »

Merci Jay !

Dès le départ, nous n’offrirons pas d’option d’accès à vie pour l’un de nos groupes d’adhésion. La nature de notre « marché des mentors » fait que les utilisateurs souhaitent rejoindre le groupe d’un coach ou d’un mentor spécifique. Ils peuvent l’essayer pendant quelques mois, puis annuler, et choisir de s’inscrire auprès d’un autre mentor qui pourrait mieux correspondre à leurs besoins ou à leurs attentes.

Nous aurons donc besoin d’une connexion SYNC active afin que, lorsqu’un membre s’abonne à un groupe personnalisé dans WP, il soit automatiquement ajouté au groupe correspondant dans Discourse, et que, si quelqu’un annule son adhésion sur WP, il soit automatiquement retiré du groupe dans Discourse.

Si vous souhaitez la dernière version de ce code, vous pouvez la trouver dans ce dépôt : GitHub - paviliondev/discourse-woocommerce · GitHub.

Il est utilisé en production et continue de fonctionner comme décrit.

Étapes

  1. Installez le code en tant que plugin WordPress.
  2. Mettez à jour les identifiants de groupe et de plan.
  3. La synchronisation aura lieu à chaque changement de statut d’adhésion.

Si quelqu’un pouvait wikifier le sujet original, je le mettrai à jour avec de meilleures instructions.

6 « J'aime »

Bonjour ! J’ai acheté le plugin Woocommerce Memberships. Il fait tout ce dont vous avez besoin. Ensuite, tout s’est éclairci pour moi. J’ai publié ici une instruction sur une intégration entièrement fonctionnelle que j’ai configurée.

1 « J'aime »

Donc, installez-vous d’abord le plugin dans le sujet d’origine (OP) ?

Je suis comme vous : j’utilise Wordpress comme fournisseur de SSO pour notre système, et non Discourse (comme indiqué dans le titre de ce sujet et dans le message d’origine).

Je sais que le sujet principal concerne la synchronisation des groupes lorsque Discourse est le fournisseur SSO, mais serait-il pertinent de mettre à jour le titre du sujet et d’inclure des instructions pour effectuer cette synchronisation lorsque WordPress est le fournisseur SSO ?

@Ed_Bobkov a fourni des détails sur la manière de réaliser cette synchronisation avec un fournisseur SSO inversé…

Pour clarifier…

Ce serait vraiment excellent et probablement utile pour les autres à long terme s’il existait deux ensembles d’instructions distincts dans le sujet principal…

Synchroniser les adhésions WooCommerce avec les groupes Discourse lorsque :

  1. Discourse est le fournisseur SSO
  2. WordPress est le fournisseur SSO
2 « J'aime »

Vous avez tort. J’utilise Discourse comme fournisseur SSO. Mais cela ne change pas l’essentiel.
Vous trouverez ici des sujets avec des instructions lorsque WP est le fournisseur SSO.
L’essentiel est le suivant :

  1. Vous pouvez gérer vos adhésions de groupe, abonnements et conditions dans Wordpress, dans tous les cas (que WP ou Discourse soit le fournisseur SSO), grâce au plugin « WooCommerce Memberships ».
  2. Pour synchroniser les membres et les groupes de Discourse avec Wordpress, vous devez dans tous les cas utiliser ce plugin : GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. Dans ses paramètres, vous pouvez choisir le type d’intégration : que ce soit WP ou Discourse qui est le fournisseur SSO.
    Ce plugin peut également être utile : GitHub - paviliondev/discourse-woocommerce · GitHub
  3. Pour effectuer une synchronisation par lots via cron, vous devez utiliser ce plugin : WP Crontrol – WordPress plugin | WordPress.org
    Vous trouverez des instructions détaillées dans ce sujet (ci-dessus).
4 « J'aime »

Ce lien renvoie maintenant à une erreur 404. A-t-il été déplacé ?

1 « J'aime »

Le sujet original est désormais un wiki.

2 « J'aime »

J’ai mis à jour le premier message avec un lien vers la dernière version du code et les instructions.

Ah, j’avais oublié de le rendre public. Merci.

@jord8on Comme Ed le mentionne, vous devez utiliser le plugin officiel Discourse pour WordPress si WordPress est le fournisseur SSO.

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 »