Mantengo Discourse y MemberMouse funcionando en 2 sitios. Espero que esta guía sea útil para otras personas. Sus especificaciones exactas pueden diferir de los resultados que yo busqué. Esta guía asume que está familiarizado con los hooks de MemberMouse, los filtros y la interfaz PHP de MemberMouse. También asume que puede agregar código personalizado a WordPress cómodamente a través de functions.php o su propio plugin personalizado.
La siguiente guía es lo que agregamos para:
- Activar/desactivar al usuario en Discourse dependiendo de su estado de membresía en MemberMouse
- Configurar grupos de Discourse que representen los niveles de membresía de MemberMouse
- Sincronizar instantáneamente los cambios de nombre de usuario/correo electrónico
- Y varios otros ajustes menores útiles
Paso 1: Instale Discourse, WordPress y el plugin wp-discourse para WordPress
Configure y haga funcionar WordPress, Discourse y el plugin wp-discourse para WordPress correctamente, con WordPress como proveedor de SSO. Hay muchos hilos sobre esto aquí.
Paso 2: Marque la casilla para permitir que el plugin wp-discourse cree un nuevo usuario en Discourse cuando se crea un usuario en WordPress
Descubrí que, para que wp-discourse realmente cree un usuario en Discourse cuando se crea un usuario en WordPress, necesitaba realizar un cambio de código en el plugin. Esto se debe a que el plugin depende de la acción “wp_login”, pero se comporta de manera diferente en MemberMouse que en el comportamiento normal de WordPress. Por lo tanto, debe agregar esta línea al archivo /lib/discourse-sso.php en la función pública __construct( $wordpress_email_verifier ):
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
Y en functions.php o en su propio plugin, agregue:
function add_user_to_discourse($data) {
do_action( 'my_mm_account_added', $data["username"], get_user_by('ID',$data["member_id"]) );
}
add_action('mm_member_add', 'add_user_to_discourse');
Paso 3: Si lo desea, haga que los nuevos usuarios no necesiten hacer clic en un enlace de activación de correo electrónico de Discourse
Por defecto, Discourse enviará un correo electrónico de activación al nuevo usuario, pero elegí desactivarlo ya que el usuario ya ha superado un número satisfactorio de obstáculos en WordPress para unirse. Si su sitio de WordPress tiene una barrera baja para unirse, es posible que no quiera omitir el correo electrónico de activación. En nuestro caso, hay que pagar para unirse. Agregue esto a functions.php o a un plugin especial que cree.
add_filter( 'wpdc_auto_create_user_require_activation', 'my_wpdc_auto_create_user_require_activation' );
function my_wpdc_auto_create_user_require_activation( $require_activation ) {
return false;
}
Paso 4: Siempre que ocurra un cambio de cuenta en un usuario de MemberMouse:
Mapee los niveles de membresía de MemberMouse a los grupos de Discourse
Sincronice la dirección de correo electrónico/nombre de usuario
Active/desactive al usuario en Discourse según corresponda
Puede agregar esto a functions.php o a su propio plugin.
add_action('mm_member_membership_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_status_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_account_update', 'run_discourse_sync_based_on_mm_acct_change');
En la función run_discourse_sync_based_on_mm_acct_change, desea:
(1) Usar la API de Discourse para obtener el nombre de usuario de Discourse de este usuario (puede ser ligeramente diferente al de WordPress debido a las propias reglas de nombre de usuario de Discourse) y el número de ID de Discourse. (documentación)
(2) Mapee el ID de nivel de membresía de MemberMouse al ID de grupo equivalente de Discourse y luego establezca su grupo en Discourse. Primero debe eliminar su antiguo ID de grupo. (documentación). Luego puede establecer el nuevo grupo. (documentación)
(3) Sincronice su nombre de usuario y correo electrónico si han sido cambiados en WordPress. Solo permitimos que estos se cambien en WordPress. Obtuve ayuda con esta parte aquí.
(4) Active/desactive al usuario en Discourse dependiendo de su estado en MemberMouse. Activar (documentación). Desactivar parece estar faltando en la documentación de la API. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
Paso 5: Redirección automática de vuelta a Discourse cuando sea apropiado
(Recomiendo encarecidamente esperar con esta parte hasta que tenga una muy buena idea de cómo funcionan WordPress y Discourse juntos.)
Si un usuario NO ha iniciado sesión en Discourse y NO ha iniciado sesión en WordPress. Y llegan a una URL en Discourse y hacen clic en el botón azul de Iniciar sesión, son llevados a WordPress para iniciar sesión, pero luego MemberMouse dirige al usuario a la página a la que esté configurado para redirigir en la configuración de MemberMouse. Lamentablemente, el usuario no es redirigido de vuelta a Discourse. Así es como resolví esto. Puede agregar esto a functions.php o a su propio plugin. (Hilo para más información.)
// Si la persona vino del foro de Discourse, envíela exactamente a donde estaba después de iniciar sesión
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // Debe ocuparse de establecer esta cookie temporal si el usuario acaba de llegar vía Discourse
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// Payload y firma.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// Cambie %0B de nuevo a %0A.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// Valide la firma.
$sso_secret = 'YOUR-SSO-SECRET';
$sso = new \WPDiscourse\SSO\SSO( $sso_secret );
if ( ! ( $sso->validate( $payload, $sig ) ) ) {
return '';
}
$nonce = $sso->get_nonce( $payload );
$params = array(
'nonce' => $nonce,
'username' => $current_user->user_login,
'email' => $current_user->user_email,
'external_id' => $user_id,
);
$params = apply_filters( 'wpdc_sso_params', $params, $current_user );
$q = $sso->build_login_string( $params );
do_action( 'wpdc_sso_provider_before_sso_redirect', $user_id, $current_user );
// Redirija de vuelta a Discourse.
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
