Holy
! How’d you manage to find it!? Nice work.
By adding log statments to my development site. This should be an easy fix, but I’d rather not push the change to WordPress before I test it out some more.
Sure you have a reasonable development environment. Like a real developer. That I understand (in spite of my not having such!) But even thinking to try usernames that had changed… I guess the 2 was the clue.
Here’s a slightly different method to handle Paid Memberships Pro group sync. Pop this into your functions.php file. Expected behavior is add upon subscribe and remove upon cancellation. Thanks to @dfriestedt for sponsoring.
Awesome, anything stopping this being wrapped into a plugin for customers who aren’t confident editing PHP?
No, probably not, but PHP/WP development isn’t my forte, and I don’t plan on personally actively maintaining this code long-term.
I am implementing the PMPro code above and am hung up on something. My understanding is that this code only fires when users buy subscription or cancel a subscription.
Is there a way that I can auto-sync users as they are created on Discourse? In my case, I have some users who are subscribers but don’t have a Discourse accounts (will be created via SSO).
If wordpress is the SSO master then you can have it update groups at every login.
Is there a code snippet that shows an example of updating groups on WP login?
The add_user_to_discourse_groups function will create a Discourse user if it doesn’t already exist. If that function is being called for your users, then you should be fine. Where you might run into problems will be for existing WordPress users who got their membership before the code was added to your site. If that is the case, you will probably need to add the users to Discourse groups through the SSO parameters that are passed to Discourse on login.
To pass additional SSO parameters with the WP Discourse plugin, you can hook into the 'wpdc_sso_params' filter. The parameter you need to use to add users to a Discourse group is called add_groups. You can use it with something like this:
add_filter( 'wpdc_sso_params', 'wpdc_custom_sso_params', 10, 2 );
function wpdc_custom_sso_params( $params, $user ) {
if ( /* some condition that returns true if groups should be added for the user */ ) {
$params['add_groups'] = 'comma,separated,group,names'; // Don't use spaces between names.
}
return $params;
}
Me doy cuenta de que este es solo código de ejemplo, pero parece tener un error bastante crítico.
Si el pago no se completa y el estado de la membresía es “token”
El grupo todavía se agrega al usuario de Discourse ![]()
Lo investigaré más adelante, pero creo que vale la pena mencionarlo.
Deseo utilizar este código para restringir mi comunidad de Discourse ÚNICAMENTE a miembros de pago que utilicen Paid Memberships Pro. Tengo un nivel de membresía gratuito y dos niveles de membresía de pago.
¿Cómo puedo modificar este código: Manage group membership in Discourse with WP Discourse SSO para que SÓLO los miembros de pago puedan acceder a la comunidad? De lo contrario, serán redirigidos a la página de registro de membresías de pago.
Gracias.
Para mi propia referencia, aquí está el código que deseas modificar:
add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
if ( /* alguna condición */ ) {
wp_safe_redirect( home_url() );
exit;
}
}
Lo que necesitas hacer es reemplazar el comentario /* alguna condición */ del código con una condición que devuelva true para los usuarios que no tienen membresías de pago. Estos usuarios luego pueden ser redirigidos a la página de registro de tu membresía.
Actualmente no tengo el plugin Paid Memberships Pro instalado en mi sitio de prueba, pero según su documentación, parece que puedes usar su función pmpro_hasMembershipLevel para verificar si un usuario tiene un nivel de membresía determinado: Using the pmpro_hasMembershipLevel() Function.
Para usar la función pmpro_hasMembershipLevel, necesitas conocer los IDs (o los nombres) de tus dos niveles de membresía de pago. Puedes obtener esos IDs de la página de administración de “Niveles de Membresía” de pmp. Por ejemplo, si los IDs de tus dos niveles de pago son 1 y 2, podrías usar la siguiente condición:
if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))
Sustituido en el código, eso sería:
add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
if (! pmpro_hasMembershipLevel( array( 1, 2 ), $user_id ) ) {
wp_safe_redirect( home_url() );
exit;
}
}
La otra línea que necesitarás cambiar es:
wp_safe_redirect( home_url() );
Actualmente está configurada para redirigir a los usuarios a la página de inicio del sitio. Necesitarás cambiarla para redirigir a la ruta o a la URL completa de la página de registro de tu sitio:
wp_safe_redirect( /* ruta_a_tu_pagina_de_registro */ );
Ten en cuenta que no he probado este código. Si estás realizando cambios directamente en el archivo functions.php de tu sitio en vivo, asegúrate de que puedes acceder al archivo functions.php del sitio desde el backend del sitio, por si acaso hay algún error o error tipográfico en el código.
Dejándome una nota aquí relacionada con \u003chttps://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4\u003e. Si la opción de WP Discourse Crear o Sincronizar Usuarios de Discourse al Iniciar Sesión está habilitada, se crearán automáticamente cuentas de Discourse para todos los usuarios del sitio de WordPress, incluso si se les impide iniciar sesión en Discourse a través del método descrito en el OP. Los detalles sobre cómo evitar que se creen automáticamente cuentas para usuarios que no tienen el nivel de membresía apropiado se encuentran en la segunda parte de esta publicación: How to prevent some WP users from being able to login to Discourse - #2 by simon.
Básicamente:
add_filter( 'wpdc_bypass_sync_sso', 'wpdc_custom_bypass_sync_sso', 10, 3 );
function wpdc_custom_bypass_sync_sso( $bypass_sync, $user_id, $user ) {
if ( /* Alguna condición que devuelve true si el usuario no cumple el requisito de membresía */ ) {
$bypass_sync = true;
}
return $bypass_sync;
}
Me estoy poniendo un recordatorio para actualizar el OP con esos detalles.
Gracias, Simon. Pude configurar esto para mi sitio web usando tus instrucciones.
Una aclaración.
Sin nivel (no es un usuario): 0
Nivel gratuito = 1
Tengo dos niveles de pago: 2,3
Dijiste:
Lo que necesitas hacer es reemplazar el comentario
/* alguna condición */del código con una condición que devuelvatruepara los usuarios que no tienen membresías de pago. Estos usuarios pueden ser redirigidos a tu página de registro de membresía.
Y
Para usar la función
pmpro_hasMembershipLevel, necesitas conocer los IDs (o los nombres) de tus dos niveles de membresía de pago. Puedes obtener esos IDs de la página de administración de “Niveles de Membresía” de pmp. Por ejemplo, si los IDs de tus dos niveles de pago son 1 y 2, podrías usar la siguiente condición:
if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))
¿Son estas afirmaciones contradictorias?
En mi entendimiento:
Debería usar lo siguiente:
if (! pmpro_hasMembershipLevel(array(0,1), $user_id))
para redirigir a los usuarios que NO tienen una membresía de pago a la página de registro de miembros.
Por favor, corrígeme si me equivoco.
Gracias.
Si la condición devuelve true, los usuarios serán redirigidos a tu página de registro.
Creo que lo más seguro para tu caso sería usar una condición que devuelva true si el usuario no tiene el nivel 2 ni el 3:
if (! pmpro_hasMembershipLevel(array(2, 3), $user_id))
Gracias. Me faltó el signo de “!” en tu segundo fragmento.


