Sincronize WooCommerce Memberships com grupos Discourse

Se você não precisa que as pessoas sejam removidas do grupo após um certo período, ou seja, se elas compram acesso vitalício ao grupo em vez de acesso temporário ou periódico, você pode se conectar ao hook woocommerce_payment_complete e adicioná-las ao grupo quando a compra for realizada. Você também pode se conectar ao SSO e atualizar seus grupos no momento do login.

1 curtida

Obrigado, Jay!

Desde o início, não ofereceremos uma opção de acesso vitalício para nenhum dos nossos grupos de assinatura. A natureza do nosso “mercado de mentores” é que os usuários terão um coach/mentor cujo grupo desejam ingressar. Eles podem experimentar por alguns meses e depois cancelar, optando por se inscrever com um mentor diferente que possa atender melhor às suas necessidades ou expectativas.

Portanto, precisaríamos de um SYNC ativo para que, quando um membro se inscrever em um grupo personalizado no WP, seja automaticamente adicionado ao grupo correspondente no Discourse. E, caso alguém cancele sua assinatura no WP, será automaticamente removido do grupo no Discourse.

Se você quiser a versão mais recente deste código, pode encontrá-la neste repositório: GitHub - paviliondev/discourse-woocommerce · GitHub.

Isso é usado em produção e continua funcionando conforme descrito.

Passos

  1. Instale o código como um plugin do WordPress.
  2. Atualize os IDs do grupo e do plano.
  3. A sincronização ocorrerá a cada alteração no status da associação.

Se alguém puder wikificar a OP, eu a atualizarei com instruções melhores.

6 curtidas

Olá! Comprei o plugin WooCommerce Memberships. Ele faz tudo o que você precisa. Depois, tudo se esclareceu para mim. Publiquei aqui um tutorial sobre uma integração totalmente funcional que configurei.

1 curtida

Então, você instala o plugin no OP primeiro?

Sou como você, pois estou usando o Wordpress como provedor do nosso SSO… não o Discourse (como mencionado no título deste tópico e no OP)

Sei que o tópico original (OP) trata da sincronização de grupos quando o Discourse é o provedor de SSO, mas faria sentido atualizar o título do tópico e incluir instruções para realizar essa sincronização quando o Wordpress é o provedor de SSO?

@Ed_Bobkov forneceu alguns detalhes sobre como fazer a sincronização com uma inversão do provedor de SSO…

Então, só para esclarecer…

Seria realmente ótimo e provavelmente útil para outros a longo prazo se houvesse dois conjuntos diferentes de instruções no OP…

Sincronizar as Membros do WooCommerce com os grupos do Discourse quando:

  1. O Discourse é o provedor de SSO
  2. O Wordpress é o provedor de SSO
2 curtidas

Você está errado. Eu uso o Discourse como provedor de SSO. Mas isso não muda o sentido.
Você pode encontrar aqui tópicos com instruções quando o WP é o provedor de SSO.
O principal é que:

  1. Você pode gerenciar suas inscrições de grupo no Wordpress, assinaturas e termos pelo plugin “WooCommerce Memberships” em todos os casos - quando o WP é um provedor de SSO OU o Discourse é um provedor de SSO.
  2. Para sincronizar membros e grupos do Discourse com o Wordpress, você precisa, em todos os casos, usar este plugin: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. Em suas configurações, você pode escolher o tipo de integração - WP ou Discourse como provedor de SSO.
    Também este plugin pode ser útil: GitHub - paviliondev/discourse-woocommerce · GitHub
  3. Para fazer uma sincronização em lote via cron, você precisa usar este plugin: WP Crontrol – WordPress plugin | WordPress.org
    Instruções detalhadas você pode encontrar neste tópico (acima).
4 curtidas

Esse link agora é um 404. Ele mudou de lugar?

1 curtida

O OP agora é um wiki.

2 curtidas

Atualizei a mensagem original com um link para a versão mais recente do código e instruções.

Ah, eu havia esquecido de torná-lo público. Obrigado.

@jord8on Como Ed menciona, você deve usar o plugin oficial do Discourse para WordPress se o WordPress for o provedor de SSO.

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