He estado observando los foros de meta.discourse durante años, recopilando fragmentos y aprendiendo cómo mejorar un sitio de cliente que utiliza Wordpress + Memberpress + Discourse (autoalojado).
Necesitaba (y todavía necesito) asignar Grupos de Discourse basándome en las Membresías de Memberpress.
Como referencia:
- El sitio del cliente (proveedor de SSO): https://secretsofsolo.com/
- El sitio de Discourse: https://jamcircle.secretsofsolo.com/
Anteriormente (durante algunos años) he utilizado el método del filtro add_filter( 'wpdc_sso_params':
La desventaja parecía ser que los Grupos de Discourse solo se actualizaban al iniciar sesión, yo quería algo que tuviera un efecto más inmediato (por ejemplo, cuando ocurre una transacción de Memberpress).
Es cierto que mis propias habilidades de codificación en PHP son bastante básicas. Soy más un desarrollador front-end HTML/CSS.
Ahora he reescrito mis funciones para el sitio del cliente utilizando una mejor función de WP Discourse descrita aquí
Que utiliza las funciones: \\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group y: \\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group.
Ahora puedo escuchar los Eventos de Memberpress y agregar los Grupos de Discourse con este bloque de código (functions.php):
add_action('mepr-event-create', 'listen_to_mepr_events');
function listen_to_mepr_events($event) {
$obj = $event->get_data();
//$obj podría ser un objeto MeprTransaction o un objeto MeprSubscription
if(!($obj instanceof MeprTransaction) && !($obj instanceof MeprSubscription)) {
return; // no hay nada que hacer aquí si no estamos tratando con una transacción o suscripción
}
$member = $obj->user(); // obtener los datos del objeto miembro del objeto evento
$user_id = $member->ID; // obtener el ID del usuario del objeto
if($member->is_active_on_membership($obj)) { // membresía activa
if(3780 == $obj->product_id) { // Membresía MENSUAL
$add_group = 'Ksenia_Basic'; // Nombre del Grupo de Discourse
$remove_groups = ['Ksenia_Essential','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
// agregar al Grupo de Discourse
\\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group( $user_id, $add_group );
// eliminar de los Grupos de Discourse
\\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
}
else if(3847 == $obj->product_id) { // Membresía de 6 meses (Esencial)
$add_group = 'Ksenia_Essential'; // Nombre del Grupo de Discourse
$remove_groups = ['Ksenia_Basic','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
// agregar al Grupo de Discourse
\\WPDiscourse\\Utilities\\Utilities::add_user_to_discourse_group( $user_id, $add_group );
// eliminar de los Grupos de Discourse
\\WPDiscourse\\Utilities\\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
}
}
else { // sin coincidencias
}
}
Referencia adicional: El hook de acción de Memberpress add_action('mepr-event-create', 'listen_to_mepr_events'); se puede encontrar aquí:
Para tu información, esta es una versión simplificada de lo que estoy usando en el sitio de mi cliente. La versión completa (que incluye la gestión de Learndash + Mailster) se puede encontrar aquí: Memberpress + Learndash + Mailster + WP Discourse · GitHub
Gracias a todos en este foro que proporcionaron fragmentos y apoyo a lo largo de los años. Sé que hay muchos observadores como yo que encuentran este un recurso extremadamente valioso y útil.
Si tienen alguna sugerencia o ven algún problema con mi ejemplo, háganmelo saber cómo puedo mejorar.