Wordpress SSO - Restrict Content / user levels / groups

I have WP discourse working for SSO and Restrict Content Pro for subscription, signup, but I am wondering how to set up levels during signup … That carry over to discourse?

Eg reader level 1, contributor level 2, moderator, level 3

So Signup through Wordpress, and level affects group in Discourse?

Are you committed to using Restricted Content Pro? There are quite a few different WordPress membership plugins. My plan is to make a general wp-discourse-groups plugin that will work for most of them, but at the moment I’m making a plugin specifically for the WishList Member plugin. When it’s finished, I think it will do everything that you are looking for.

Thats great! I am opening to using any of them. Keep us posted! : )

Is there no way to do this with current WP Discourse setup?

I’ve written code for some WordPress subscription manager that used API calls to manage groups on WordPress. It shouldn’t be hard to set up WordPress groups that whatever group manager you uses could connect to.

Привет, ребята, я воскрешаю эту старую тему, потому что мой вопрос касается Restrict Content Pro, поэтому он похож на вопрос автора оригинального поста (OP). По сути, я помогаю с сайтом, где система членства — Restrict Content Pro, и пытаюсь настроить синхронизацию групп Discourse для платных членств RCP. В частности, нужно, чтобы любой пользователь с активным членством синхронизировался с группой Members на форуме Discourse.

Я потратил много времени, пытаясь запустить что-то вроде примера Саймона Управление членством в группах Discourse с помощью WP Discourse SSO. SSO работает нормально, но членства всё ещё не синхронизируются (добавление пользователей в группу при успешной активации членства или удаление из группы при истечении срока действия).

В этом посте я пока просто пытаюсь добиться того, чтобы новые пользователи добавлялись в группу Discourse. На форуме Discourse этого сайта есть только одна группа — Members. (Удаление из групп должно быть достаточно простым, так как хук Restrict Content Pro тот же, нужно лишь заменить суффикс active на expired. Хук действия rcp_transition_membership_status_active в Restrict Content Pro срабатывает при изменении статуса членства. Он принимает параметры $old_status и $membership_id. Функция rcp_get_membership() возвращает объект RCP_Membership (который содержит, среди прочего, ссылку на $user_id WordPress).

Вот максимально упрощённая версия кода, которую я смог составить:


use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Добавляет пользователя в группу Discourse 'members'.
function rcpdc_add_member_to_group( $membership_id ) {
    $membership = rcp_get_membership( $membership_id );
    $user_id = $membership->get_user_id();
    DiscourseUtilities::add_user_to_discourse_group( $user_id, 'Members' );
}

// Убедитесь, что класс Discourse существует.
if ( class_exists( '\WPDiscourse\Discourse\Discourse' ) ) {
    // Действие rcp с суффиксом {active} срабатывает при добавлении нового членства
    add_action( 'rcp_transition_membership_status_active', 'rcpdc_add_member_to_group' );
}

Если вы видите очевидную ошибку, из-за которой это действие не выполняется корректно, буду очень признателен за помощь. Спасибо!

Ой! У меня возникла ошибка на стороне Restrict Content Pro, извините. Используемый мной хук действия требует два аргумента:

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Добавляет пользователя в группу Discourse 'members'.
function rcpdc_add_member_to_group( $old_status, $membership_id ) {
    $membership = rcp_get_membership( $membership_id );
    $customer = $membership->get_customer();
    $user_id = $customer->get_user_id();
    DiscourseUtilities::add_user_to_discourse_group( $user_id, 'Members' );
}

// Обязательно проверяйте, существует ли класс Discourse. Если нет, и вы отключите wp-discourse, ваш сайт может аварийно завершить работу.
if ( class_exists( '\WPDiscourse\Discourse\Discourse' ) ) {
    add_action( 'rcp_transition_membership_status_active', 'rcpdc_add_member_to_group', 10, 2 );
}

С указанным выше изменением функция add_action должна работать, но у меня всё ещё не получается с функцией add_user_to_discourse_group.

Недавно активированные подписки по-прежнему не добавляются в группу Members успешно, поэтому я всё ещё буду признателен за любые советы. Спасибо.

Если возможно, попробуйте создать файл debug.log на вашем сервере WordPress, а затем записывать в него данные из вашей функции rcpdc_add_member_to_group. Это поможет убедиться, что функция вызывается, и проверить, что правильные значения присваиваются переменным, которые вы создаёте.

Для отладки я обычно использую подход, описанный здесь: Debugging in WordPress – Advanced Administration Handbook | Developer.WordPress.org. Вам нужно вручную создать файл debug.log и добавить его в директорию wp-content.

Спасибо, Саймон! Сработало отлично. Мне удалось заставить код работать. Оказалось, что код, обернутый вокруг действия, мешал функции add_action запускать функцию. Как только я убрал

if ( class_exists( '\WPDiscourse\Discourse\Discourse' ) ) {

и оставил только саму add_action, плагин заработал нормально. Меня не слишком беспокоит эта проверка, так как я единственный администратор этого сайта. Так что теперь синхронизация работает безупречно как для добавления, так и для удаления участников из групп.

Еще раз спасибо за ваш быстрый и полезный ответ.

Спасибо, что обратили на это внимание. Я добавлю в плагин опцию для работы с комментариями в приватных категориях. К сожалению, на этой неделе у меня не хватило времени, чтобы это реализовать. Эта опция будет добавлена в следующем обновлении плагина. Постараюсь сделать это в начале следующей недели.