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 curtida

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 curtidas

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 curtida

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 curtidas

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 curtidas

That link is now a 404. Did it move?

1 curtida

The OP is now a wiki.

2 curtidas

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 curtidas

Estou enfrentando um problema em relação à integração do WooCommerce com o Discourse.
Se o usuário comprou uma assinatura específica, ele seria automaticamente atribuído ao grupo respectivo no Discourse.
Está funcionando perfeitamente na maioria dos casos.
Mas, às vezes, não é automatizado. Por exemplo, 8 em cada 10 usuários foram atribuídos a um grupo específico do Discourse na compra da assinatura, mas os outros dois não. Portanto, quero torná-lo automatizado para todos os usuários.
Alguma sugestão sobre como posso torná-lo totalmente automatizado?

Olá :slight_smile:

Você pode apenas confirmar cada uma destas coisas para mim:

  1. Você está usando o Discourse como seu Provedor do Discourse Connect (as pessoas fazem login com o formulário de login do Discourse para fazer login no WordPress)
  2. Você está usando o plugin WP Discourse no WordPress
  3. Você está usando o código que postei na primeira postagem deste tópico no WordPress

Está correto?

Sua segunda opção está correta, estou usando o plugin discourse, e como mencionei que meus usuários são automaticamente atribuídos a um grupo específico se eles comprarem uma assinatura específica.

Tudo está funcionando bem. Apenas que após alguns meses ou mais (ocasionalmente) ocorre esse problema de que um usuário aleatório não é atribuído a um grupo específico após a compra da assinatura.

Quero me livrar desse problema que acontece ocasionalmente também.

Se apenas a segunda opção estiver correta, então estas instruções infelizmente não funcionarão para você. Todas as três precisam ser verdadeiras. Parece que você tem uma sincronização funcionando. Só para eu entender, você tem

  1. O plugin WP Discourse instalado; e

  2. Código para sincronizar seus grupos do WooCommerce (por exemplo, como este) ← Você adicionou isso? Você poderia compartilhar o que adicionou?

2 curtidas

Não, acho que o plugin fez toda a automação, não me lembro de ter colocado nenhum tipo de código para integração.

Talvez meu plugin seja da versão 2.2.3, e ele esteja desatualizado porque a atualização disponível é a 2.4.1.

Talvez esteja acontecendo devido a essa versão. Mas estou um pouco curioso se, após fazer uma atualização, isso prejudicou minhas funcionalidades atuais ou não.

Para sincronizar grupos entre WooCommerce e Discourse, você precisará de algum código personalizado. O plugin WP Discourse não fará isso sozinho. Você provavelmente já tem uma implementação das funções descritas aqui.

Você precisará primeiro identificar como a sincronização está acontecendo (não é apenas o plugin WP Discourse) antes que eu possa ajudá-lo ainda mais.

1 curtida

Adicionei código ao meu WordPress - o que @Ed_Bobkov publicou:

<?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', 'O plugin WP Discourse não foi configurado corretamente.' );
}

$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', 'Houve um erro ao recuperar os dados do usuário do 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’);

Também adicionei e executei via WP Crontrol run_full_wc_membership_sync

Infelizmente… o usuário do WordPress com Assinatura ativa (id 112) não está sendo adicionado ao grupo do discourse (id 41). O que estou perdendo aqui?

Como isso continua confundindo as pessoas, vou publicar um "Como fazer" completo com sincronização de associação do WooCommerce (seja o WordPress ou o Discourse o Provedor do DiscourseConnect) :slight_smile: . Por favor, verifique aqui no início da próxima semana se eu ainda não entrei em contato com você sobre isso.

3 curtidas

Obrigado! Acabei de tentar descobrir… Cheguei a usar um plugin GitHub - paviliondev/discourse-woocommerce, mas também sem sucesso.

1 curtida