Memberpress + WP Discourse (Gestión de Grupos)

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:

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.

6 Me gusta

Gracias Andrew, le echaré un vistazo mañana y le daré una respuesta más detallada el lunes. Como nota inicial, ¿ha revisado el plugin de sincronización de grupos Memberpress desarrollado por @fzngagan?

4 Me gusta

Basado en roles - genial :sunglasses: No, no había visto ese plugin. Excelente contribución.

1 me gusta

¿Cómo podría implementar esto? Estoy usando Wordpress con Memberpress e instalé Discourse en un subdominio alojado en un droplet de DigitalOcean. ¿Subo el código literalmente como lo haría con un plugin?

Sí, wp-discourse-mepr-sync es solo un plugin de Wordpress de un solo archivo.

1 me gusta

Eché un vistazo al código. En caso de que no esté claro, el plugin Memberpress Sync depende del código del plugin WP Discourse: WP Discourse – WordPress plugin | WordPress.org. Eso significa que también necesitarás instalar, activar y configurar el plugin WP Discourse: Connect WP Discourse to Discourse. También necesitarás configurar tu sitio de WordPress como el proveedor de DiscourseConnect para tu sitio de Discourse. Los detalles sobre cómo configurarlo están aquí: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

Hay algo en el plugin Memberpress Sync que no me queda claro. Me parece que hay dos IDs de producto de Memberpress y dos grupos de Discourse codificados en el código del plugin:

Creo que necesitarás hacer algunos cambios en ese archivo. Los valores en la matriz definida por PV_MEMBERPRESS_PRODUCT_IDS deberán establecerse en los IDs de suscripción de tu sitio. También deberás establecer las definiciones PV_DISCOURSE_ENROLLED_GROUP y PV_DISCOURSE_UNENROLLED_GROUP en grupos que existan en tu sitio de Discourse.

Parece que el plugin agrega a cualquier usuario que tenga una suscripción activa para cualquiera de tus productos al PV_DISCOURSE_ENROLLED_GROUP. Si un usuario que tenía una o más suscripciones activas luego ve expirar todas sus suscripciones, será eliminado del PV_DISCOURSE_ENROLLED_GROUP y agregado al PV_DISCOURSE_UNENROLLED_GROUP.

¿Quizás @fzngagan pueda confirmar si esto es correcto? Si es así, será bastante sencillo configurar el código para el sitio de @earlysound. Sin embargo, es posible que esté malinterpretando cómo funciona el plugin. No tengo una copia del plugin Memberpress. Si pudiera acceder a una versión de desarrollo de Memberpress, podría probarlo yo mismo.

1 me gusta

Estoy leyendo la misma lógica en los códigos que has explicado. Sería muy bueno si @fzngagan pudiera confirmar.

Hola chicos, sé que han pasado algunos meses desde la última publicación, pero espero que lo siguiente siga siendo útil.

Por supuesto, no soy @fzngagan, ¡pero soy el cliente para el que se desarrolló originalmente este plugin!

La idea es que queríamos agregar automáticamente a los usuarios con una membresía activa recurrente de Memberpress a un grupo específico de Discourse.

Cuando los usuarios se daban de baja y se iban, se les eliminaba del grupo de Discourse y se les agregaba a un grupo de “Exalumnos” en su lugar, que solo tenía acceso a ciertas áreas del foro.

@simon tiene razón en que los ID de membresía y los grupos de Discourse están codificados. Creo que solo debería ser cuestión de reemplazarlos por los suyos para poder usarlo.

Sí, eso es correcto. Solo necesitarías cambiar estos valores

define('PV_MEMBERPRESS_PRODUCT_IDS', array(153, 161));
define('PV_DISCOURSE_ENROLLED_GROUP', 'locker');
define('PV_DISCOURSE_UNENROLLED_GROUP', 'KaizenAlumni');
define('PV_MEPR_ACTIVE_STATUSES', array('complete'));
1 me gusta