Si no necesitas que las personas sean eliminadas del grupo después de un período de tiempo, es decir, si compran acceso de por vida al grupo en lugar de acceso temporal o periódico, entonces puedes conectarte al hook woocommerce_payment_complete y agregarlas al grupo cuando se realice la compra. También puedes conectarte al SSO y actualizar sus grupos al iniciar sesión.
¡Gracias, Jay!
Desde el principio, no ofreceremos una opción de acceso de por vida para ninguno de nuestros grupos de membresía. La naturaleza de nuestro “mercado de mentores” es que los usuarios tendrán un entrenador/mentor cuyo grupo desearán unirse. Pueden probarlo durante un par de meses y luego cancelar, optando por registrarse con un mentor diferente que pueda adaptarse mejor a sus necesidades o expectativas.
Por lo tanto, necesitaríamos una SYNC activa para que, cuando un miembro se suscriba a un grupo personalizado en WP, se le agregue automáticamente al grupo correspondiente en Discourse, y si alguien cancela su membresía en WP, se le elimine automáticamente del grupo en Discourse.
Si deseas la versión más reciente de este código, puedes encontrarla en este repositorio: GitHub - paviliondev/discourse-woocommerce · GitHub.
Esto se utiliza en producción y sigue funcionando según lo descrito.
Pasos
- Instala el código como un plugin de WordPress.
- Actualiza los identificadores del grupo y del plan.
- La sincronización se realizará en cada cambio de estado de la membresía.
Si alguien pudiera wikificar el OP, lo actualizaré con instrucciones más detalladas.
¡Hola! Compré el plugin WooCommerce Memberships. Hace todo lo necesario. Luego, todo se resolvió para mí. Publiqué aquí una instrucción sobre una integración totalmente funcional que configuré.
¿Entonces instalas el plugin en el OP primero?
Soy como tú en el sentido de que estoy usando WordPress como proveedor de nuestro SSO… no Discourse (como se indica en el título de este tema y en el OP)
Sé que el tema original (OP) se refiere a sincronizar grupos cuando Discourse es el proveedor de SSO, pero ¿tendría sentido actualizar el título del tema e incluir instrucciones para realizar esta sincronización cuando WordPress es el proveedor de SSO?
@Ed_Bobkov proporcionó algunos detalles sobre cómo realizar la sincronización con un inverso del proveedor de SSO…
Así que, solo para aclarar…
Sería realmente excelente y probablemente útil para otros a largo plazo si hubiera dos conjuntos diferentes de instrucciones en el OP…
Sincronizar membresías de WooCommerce con grupos de Discourse cuando:
- Discourse es el proveedor de SSO
- WordPress es el proveedor de SSO
Estás equivocado. Yo utilizo Discourse como proveedor de SSO. Pero eso no cambia el sentido.
Aquí puedes encontrar temas con instrucciones cuando WP es el proveedor de SSO.
Lo principal es lo siguiente:
- Puedes gestionar tus membresías de grupo, suscripciones y términos en Wordpress mediante el plugin “WooCommerce Memberships” en todos los casos, ya sea que WP sea el proveedor de SSO o que Discourse lo sea.
- Para sincronizar miembros y grupos de Discourse con Wordpress, en todos los casos debes usar este plugin: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. En su configuración puedes elegir el tipo de integración: si WP o Discourse es el proveedor de SSO.
También puede ser útil este plugin: GitHub - paviliondev/discourse-woocommerce · GitHub - Para realizar una sincronización por lotes mediante cron, debes usar este plugin: WP Crontrol – WordPress plugin | WordPress.org
Las instrucciones detalladas las encontrarás en este tema (más arriba).
Ese enlace ahora es un 404. ¿Se ha movido?
El OP ahora es un wiki.
He actualizado el primer mensaje con un enlace a la última versión del código y las instrucciones.
Ah, se me olvidó hacerlo público. Gracias.
@jord8on Como menciona Ed, debes usar el plugin oficial de Discourse para WordPress si WordPress es el proveedor de SSO.
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 ![]()
¿Puedes confirmarme cada una de estas cosas?
- 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)
- Estás usando el plugin WP Discourse en Wordpress
- 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:
-
El plugin WP Discourse instalado; y
-
Código para sincronizar tus grupos de WooCommerce (por ejemplo, como este) ← ¿Has añadido esto? ¿Podrías compartir lo que has añadido?
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.
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.
¡Gracias! Acabo de intentar resolverlo… Incluso usé un plugin GitHub - paviliondev/discourse-woocommerce pero tampoco tuve suerte.