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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

That link is now a 404. Did it move?

1 „Gefällt mir“

The OP is now a wiki.

2 „Gefällt mir“

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 „Gefällt mir“

Ich habe ein Problem mit der WooCommerce-Integration mit Discourse.
Wenn ein Benutzer eine bestimmte Mitgliedschaft kauft, wird er automatisch der entsprechenden Gruppe in Discourse zugeordnet.
Dies funktioniert in den meisten Fällen einwandfrei.
Manchmal ist es jedoch nicht automatisiert. Zum Beispiel wurden 8 von 10 Benutzern beim Kauf einer Mitgliedschaft einer bestimmten Discourse-Gruppe zugeordnet, die anderen beiden jedoch nicht. Ich möchte es also für alle Benutzer automatisieren.
Haben Sie Vorschläge, wie ich es vollständig automatisieren kann?

Hallo :slight_smile:

Können Sie mir diese Dinge bitte bestätigen:

  1. Sie verwenden Discourse als Ihren Discourse Connect Provider (Leute melden sich mit dem Discourse-Login-Formular an, um sich bei WordPress anzumelden)
  2. Sie verwenden das WP Discourse-Plugin in WordPress
  3. Sie verwenden den Code, den ich im ersten Beitrag dieses Themas gepostet habe, in WordPress

Stimmt das?

Ihre zweite Option ist richtig, ich verwende ein Discourse-Plugin, und wie ich bereits erwähnt habe, werden meinen Benutzern automatisch bestimmte Gruppen zugewiesen, wenn sie eine bestimmte Mitgliedschaft erwerben.

Alles funktioniert einwandfrei. Nur dass nach ein paar Monaten oder mehr (gelegentlich) dieses Problem auftritt, dass ein zufälliger Benutzer nach dem Kauf einer Mitgliedschaft nicht der entsprechenden Gruppe zugewiesen wird.

Ich möchte dieses gelegentlich auftretende Problem ebenfalls loswerden.

Wenn nur die zweite Option richtig ist, dann funktionieren diese Anweisungen für Sie leider nicht. Alle drei müssen wahr sein. Es scheint, dass Sie eine Synchronisierung haben. Nur damit ich Sie verstehe, haben Sie:

  1. Das WP Discourse-Plugin installiert; und

  2. Code zum Synchronisieren Ihrer WooCommerce-Gruppen (z. B. wie dieser) ← Haben Sie das hinzugefügt? Könnten Sie mitteilen, was Sie hinzugefügt haben?

2 „Gefällt mir“

Nein, ich glaube, das Plugin hat die gesamte Automatisierung übernommen. Ich erinnere mich nicht, Code zur Integration platziert zu haben.

Möglicherweise ist mein Plugin Version 2.2.3 und veraltet, da das verfügbare Update 2.4.1 ist.

Vielleicht liegt es an dieser Version. Aber ich bin etwas neugierig, ob ein Update meine aktuellen Funktionalitäten beeinträchtigt hat oder nicht.

Um Gruppen zwischen WooCommerce und Discourse zu synchronisieren, benötigen Sie benutzerdefinierten Code. Das WP Discourse-Plugin erledigt dies nicht von selbst. Sie haben höchstwahrscheinlich eine Implementierung der hier beschriebenen Funktionen.

Sie müssen zuerst identifizieren, wie die Synchronisierung erfolgt (es ist nicht nur das WP Discourse-Plugin), bevor ich Ihnen weiterhelfen kann.

1 „Gefällt mir“

Ich habe Code zu meinem WordPress hinzugefügt – den, den @Ed_Bobkov veröffentlicht hat:

<?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', 'Das WP Discourse Plugin wurde nicht richtig konfiguriert.' );
}

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

$logger->info( sprintf( '%s Mitgliedschaft von %s geändert zu %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( 'Sende %s Anfrage an %s mit %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( 'Antwort von 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', 'Beim Abrufen der Benutzerdaten von Discourse ist ein Fehler aufgetreten.' );
}
}

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

$logger->info( sprintf( 'Führe handle_wc_membership_saved aus %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('Führe full_wc_membership_sync aus') );

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('Überprüfe Mitgliedschaft von %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('Aktualisiere Gruppenberechtigung von %s', $user->user_login) );

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

	  $logger->info( sprintf('Warte 5 Sekunden') );
      
	  sleep(5);
   }
}
}

add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);

Ich habe auch run_full_wc_membership_sync über WP Crontrol hinzugefügt und ausgeführt.

Leider… wird ein WordPress-Benutzer mit aktiver Mitgliedschaft (ID 112) nicht zur Discourse-Gruppe (ID 41) hinzugefügt. Was übersehe ich hier?

Da dies die Leute immer wieder verwirrt, werde ich eine vollständige Anleitung zur WooCommerce-Mitgliedersynchronisierung veröffentlichen (egal ob WordPress oder Discourse der DiscourseConnect-Anbieter ist) :). Schauen Sie hier Anfang nächster Woche vorbei, falls ich Sie noch nicht darauf hingewiesen habe.

3 „Gefällt mir“

Danke! Habe gerade versucht, es herauszufinden… Ich habe sogar ein Plugin GitHub - paviliondev/discourse-woocommerce verwendet, aber auch ohne Erfolg

1 „Gefällt mir“