Manage group membership in Discourse with WP Discourse SSO

Holy :cow:! 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.

3 лайка

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.

8 лайков

Awesome, anything stopping this being wrapped into a plugin for customers who aren’t confident editing PHP?

1 лайк

No, probably not, but PHP/WP development isn’t my forte, and I don’t plan on personally actively maintaining this code long-term.

3 лайка

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.

1 лайк

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;
}
7 лайков

Я понимаю, что это всего лишь пример кода, но, похоже, в нём есть довольно критическая ошибка.

Если оплата не завершена, а статус членства равен «token»

группа всё равно добавляется к пользователю Discourse :open_mouth:

Я займусь этим позже, но, думаю, стоит упомянуть об этом.


1 лайк

Я хочу использовать этот код, чтобы ограничить доступ к моему сообществу Discourse только для платных участников с помощью плагина Paid Memberships Pro. У меня есть бесплатный уровень членства и два платных уровня.

Как мне изменить этот код: Manage group membership in Discourse with WP Discourse SSO,

чтобы доступ к сообществу имели только платные участники? В противном случае они должны перенаправляться на страницу регистрации платного членства.

Спасибо.

Для справки, вот код, который вы хотите изменить:

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 ( /* some condition */ ) {
	    wp_safe_redirect( home_url() );

	    exit;
    }
}

Вам нужно заменить комментарий /* some condition */ в коде на условие, которое будет возвращать true для пользователей, не имеющих платного членства. После этого таких пользователей можно перенаправлять на вашу страницу регистрации для членства.

На данный момент плагин Paid Memberships Pro не установлен на моём тестовом сайте, но, судя по документации, вы можете использовать их функцию pmpro_hasMembershipLevel, чтобы проверить, есть ли у пользователя определённый уровень членства: Using the pmpro_hasMembershipLevel() Function.

Чтобы использовать функцию pmpro_hasMembershipLevel, вам нужно знать идентификаторы (или названия) ваших двух платных уровней членства. Вы можете получить эти ID на странице администратора «Уровни членства» (Membership Levels) в PMPro. Например, если ID ваших двух платных уровней — 1 и 2, вы можете использовать следующее условие:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Подставив это в код, получится:

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;
    }
}

Ещё одну строку, которую нужно изменить:

wp_safe_redirect( home_url() );

Сейчас она настроена на перенаправление пользователей на главную страницу сайта. Вам нужно изменить её так, чтобы перенаправление шло либо по пути, либо по полному URL страницы регистрации вашего сайта:

wp_safe_redirect( /* path_to_your_signup_page */ );

Обратите внимание: я не тестировал этот код. Если вы вносите изменения напрямую в файл functions.php вашего работающего сайта, убедитесь, что у вас есть доступ к этому файлу через административную панель сайта на случай, если в коде будут ошибки или опечатки.

4 лайка

Оставляю себе заметку здесь, связанную с https://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4. Если включена опция Создание или синхронизация учётных записей Discourse при входе в плагине WP Discourse, учётные записи в Discourse будут автоматически создаваться для всех пользователей сайта WordPress, даже если им запрещено вход в Discourse способом, описанным в исходном посте. Подробная информация о том, как предотвратить автоматическое создание учётных записей для пользователей без необходимого уровня членства, содержится во второй части этого сообщения: How to prevent some WP users from being able to login to Discourse - #2 by simon.

Вкратце:

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 ( /* Условие, возвращающее true, если пользователь не соответствует требованиям членства */  ) {

        $bypass_sync = true;
    }

    return $bypass_sync;
}

Я ставлю себе напоминание обновить исходный пост, добавив эти детали.

2 лайка

Спасибо, Саймон. Я смог настроить это для своего сайта, используя ваши инструкции.

1 лайк

Уточнение.

Уровень «Не пользователь» (не пользователь): 0
Бесплатный уровень = 1
У меня два платных уровня: 2, 3

Вы написали:

Вам нужно заменить комментарий /* some condition */ в коде на условие, которое возвращает true для пользователей, у которых нет платной подписки. Этих пользователей затем можно перенаправить на страницу регистрации на членство.

И

Чтобы использовать функцию pmpro_hasMembershipLevel, вам нужно знать ID (или названия) ваших двух платных уровней членства. Вы можете получить эти ID на административной странице pmp «Уровни членства». Например, если ID ваших двух платных уровней — 1 и 2, вы можете использовать следующее условие:

if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))

Не противоречат ли эти утверждения друг другу?

По моему пониманию:
Мне следует использовать следующее:

if (! pmpro_hasMembershipLevel(array(0,1), $user_id))

чтобы перенаправить пользователей, у которых НЕТ платной подписки, на страницу регистрации на членство.

Поправьте меня, если я ошибаюсь.

Спасибо.

Если условие возвращает true, пользователи будут перенаправлены на вашу страницу регистрации.

Думаю, в вашем случае самым надёжным решением будет использовать условие, которое возвращает true, если у пользователя нет ни уровня 2, ни уровня 3:

if (! pmpro_hasMembershipLevel(array(2, 3), $user_id))

1 лайк

Спасибо. Я пропустил знак «!» во втором вашем фрагменте.

1 лайк