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 me gusta

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 Me gusta

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 me gusta

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 Me gusta

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 Me gusta

That link is now a 404. Did it move?

1 me gusta

The OP is now a wiki.

2 Me gusta

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 Me gusta

Tengo un problema con la integración de WooCommerce con Discourse.
Si el usuario compró una membresía específica, se le asignaría automáticamente al grupo respectivo en Discourse.
Funciona perfectamente en la mayoría de los casos.
Pero a veces, no es automático. Por ejemplo, 8 de cada 10 usuarios han sido asignados a un grupo específico de Discourse al comprar una membresía, pero los otros dos no. Así que quiero hacerlo automático para todos los usuarios.
¿Alguna sugerencia sobre cómo puedo hacerlo completamente automático?

Hola :slight_smile:

¿Puedes confirmarme cada una de estas cosas?

  1. Estás usando Discourse como tu proveedor de Discourse Connect (la gente inicia sesión con el formulario de inicio de sesión de Discourse para iniciar sesión en Wordpress)
  2. Estás usando el plugin WP Discourse en Wordpress
  3. Estás usando el código que publiqué en la primera publicación de este tema en Wordpress

¿Es correcto?

Tu segunda opción es correcta, estoy usando el plugin de Discourse. Y como mencioné, a mis usuarios se les asigna automáticamente a un grupo específico si compran una membresía específica.

Todo funciona bien. Solo que después de un par de meses o más (ocasionalmente) ocurre este problema de que a un usuario aleatorio no se le asigna al grupo específico después de comprar una membresía.

Quiero deshacerme también de ese problema que ocurre ocasionalmente.

Si solo la segunda opción es correcta, entonces estas instrucciones no te servirán, desafortunadamente. Las tres deben ser verdaderas. Parece que tienes una sincronización funcionando. Para que entienda, tienes:

  1. El plugin WP Discourse instalado; y

  2. Código para sincronizar tus grupos de WooCommerce (por ejemplo, como este) ← ¿Has añadido esto? ¿Podrías compartir lo que has añadido?

2 Me gusta

No, creo que el plugin se encargó de toda la automatización, no recuerdo haber insertado ningún tipo de código para la integración.

Quizás mi plugin sea la versión 2.2.3 y esté desactualizado porque la actualización disponible es la 2.4.1.

Quizás esté sucediendo debido a esta versión. Pero tengo un poco de curiosidad sobre si, después de actualizar, se dañaron mis funcionalidades actuales o no.

Para sincronizar grupos entre WooCommerce y Discourse, necesitarás algo de código personalizado. El plugin WP Discourse no lo hará por sí solo. Lo más probable es que tengas una implementación de las funciones descritas aquí.

Primero deberás identificar cómo se está produciendo la sincronización (no es solo el plugin WP Discourse) antes de que pueda ayudarte más.

1 me gusta

He agregado código a mi WordPress, el que publicó @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', 'El plugin WP Discourse no ha sido configurado correctamente.' );
}

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

$logger->info( sprintf( '%s membresía de %s cambió a %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( 'Enviando solicitud %s a %s con %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( 'Respuesta de 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', 'Ha habido un error al recuperar los datos del usuario de Discourse.' );
}
}

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

$logger->info( sprintf( 'Ejecutando 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('Ejecutando 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('Comprobando membresía de %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('Actualizando acceso al grupo de %s', $user->user_login) );

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

	  $logger->info( sprintf('Durmiendo por 5 segundos') );
      
	  sleep(5);
   }
}
}

add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);

También he agregado y ejecutado a través de WP Crontrol run_full_wc_membership_sync.

Lamentablemente… el usuario de WordPress con membresía activa (id 112) no se está agregando al grupo de Discourse (id 41). ¿Qué me falta aquí?

Como esto sigue confundiendo a la gente, voy a publicar un "Cómo" completo con la sincronización de membresías de WooCommerce (ya sea que WordPress o Discourse sea el proveedor de DiscourseConnect) :). Por favor, consulta aquí a principios de la próxima semana si aún no te he contactado al respecto.

3 Me gusta

¡Gracias! Acabo de intentar resolverlo… Incluso usé un plugin GitHub - paviliondev/discourse-woocommerce pero tampoco tuve suerte.

1 me gusta