Memberpress: how to add users to groups upon Sign up

Hi Eva, I went over your code and there’s no errors that I can spot - and I totally get your frustration. If it hadn’t been for Simon Cossar I don’t know how I’d have resolved it myself.

So, taking it backwards: if the PHP is correct, then something else must be disconnected. (browniepoints for me, yay.)

But…
I don’t know enough about any of that to be able to give suggestions or help.
If you’ve got your forum parked with the boys from Discourse Hosting, you could ask Richard (his name tag won’t pop, but this is his profile: Profile - RGJ - Discourse Meta )

Or perhaps @simon might be able to provide you with the missing steps.

Keeping my fingers crossed for you.

edit:
p.s. these are all the related plug-ins i use (+ that PHP one)
(Memberpress Drip is email marketing, so not related to this)

At least the code is okay…

Just going to ask some easy questions just to be sure it’s not a stupid mistake :

On discourse :

  • Are your groups hidden/closed/opened ?
  • Is your group full name different from the name and default title ? Which one is considered by the PHP code ?
  • Have you done anything special in the parameters section concerning this ?

On wordpress :

  • Does your WP-Discourse plugin have specific settings/webhooks for this ?
  • Do you validate the user’s email when they register on wordpress or you use Discourse’s email validation ?

I’m not sure the issue is there but I always take a shot, thank you again !

On Discourse:

  • groups are any and all: closed and opened (i don’t give access to hidden groups, come to think of it)
  • these are some of the group names as displayed in ‘Groups’ - and as you can see, the “NoSpacesNames” are the ones that coincide with the PHP settings
    26
    54
  • If by parameters you mean the following, then no:
    22

nor in the actual group settings (where you create it, with name, owner, etc.), it’s all straight forward and not connected to accessing through SSO - so setting or not setting this as a person’s primary group is not relavant.

There is one webhook here on Discourse that I put in as instructed by the WP-Discourse plugin:


but I don’t actually have that box checked…

  • email verification technically goes via memberpress: they (my wp-instance) send the log-in details to the user. by clicking the log-in link the users verify their address.
    i know for a fact that it’s not through Discourse, because for a while it ALSO went through discourse (glitch somewhere) and Richard sorted that for me.

you’re welcome!

Возможно ли с помощью этого метода назначать пользователям уровень доверия 2 в Discourse при регистрации через оплату и понижать его до уровня 1 в случае отсутствия ежемесячной оплаты?

Я давно не смотрел на это, но вам понадобится взаимодействие между кодом вашего Discourse и кодом платежной системы (в моём случае — MemberPress).

Таким образом, если человек перестаёт платить, MemberPress меняет его код, и этот код соответствует другому уровню группы.
Если связи с платежом нет, уровень группы не будет скорректирован.

О, подождите.
Повторно перечитав ваш вопрос: я не уверен, как это работает с уровнями доверия…
но… если всё остальное не сработает, вы можете легко создать ГРУППУ, установленную на уровень доверия 2, и другую — на уровень доверия 1, а ваш плагин членства будет назначать эти группы вашим участникам.

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

Отличная идея! Да, мы можем настроить уровни доверия для групп в Discourse. Однако у меня недостаточно опыта работы с MemberPress.

Можно ли автоматически добавлять платящих пользователей из MemberPress в специальную группу?

Этот вопрос возник в другом посте на Meta сегодня, поэтому я изучил код, чтобы подтвердить, может ли уровень доверия пользователя быть снижен путём добавления его в группу, устанавливающую нижний уровень доверия, чем текущий уровень пользователя. Изучив код, я вижу, что это невозможно:

  def grant
    if @user.trust_level < @trust_level
      @user.change_trust_level!(@trust_level)
      @user.save!
    end
  end

Если уровень доверия пользователя ниже, чем уровень доверия, предоставляемый группой, добавление пользователя в группу обновит его уровень доверия. В противном случае изменений в уровне доверия пользователя не произойдёт.

Наверняка есть и другие плагины для управления подписками, которые могут сделать то же самое для вас.

У меня уже 8 вечера, и я сегодня завершаю работу, но если вам понадобится дополнительная помощь, я с радостью займусь этим утром. Просто дайте знать.

Я немного забыл (да и время позднее), но уровень доверия здесь не так важен. Я вообще не использую уровни доверия. Группа TL 2 имеет доступ к «этому», а группа TL 1 — нет.
Сам уровень доверия не используется. Любой участник может иметь уровень доверия 1 и всё равно получить доступ (через оплату) к группе TL 4 — при условии, что я настраиваю разрешения не для уровней доверия, а только для групп.

Да, правильный подход — использовать группы и права доступа к категориям. Полагаться на уровни доверия не следует.

@Dani1, спасибо, что поделились своим опытом и трудностями здесь, это очень полезно для других пользователей MemberPress, таких как я.

Это действительно логично, но мне интересно, что произойдет, если подписка участника истечет, а он не выйдет из системы и продолжит получать доступ к группе… Сталкивались ли вы с такой проблемой?

Если да, то интересно, есть ли способ принудительно обновить сессию или выйти из системы…

Спасибо!
Ray

Вам нужно перехватить событие Memberpress и соответствующим образом настроить группы.

См. также Bring over permission level from WordPress MemberPress - #2 by simon и Manage group membership in Discourse with WP Discourse SSO

@RGJ Код, помеченный выше как решение (Memberpress: how to add users to groups upon Sign up - #11 by simon), действительно удаляет участников из групп, но, как отметила Dani1, изменения вступают в силу только после выхода из системы.

Если пользователь обновляется через обычный процесс входа SSO, обновление не произойдет, пока он не выйдет из системы и не войдет снова. Приведенный выше пример кода — самый простой способ решить проблему, но, вероятно, не лучший вариант для управления членством в группах.

Плагин WP Discourse включает несколько вспомогательных функций, которые активируются, когда WordPress выступает в качестве провайдера SSO для Discourse. Эти функции позволяют обновлять членство в группах без необходимости выхода пользователя из Discourse. Они описаны в теме, на которую дал ссылку Ричард: Manage group membership in Discourse with WP Discourse SSO.

В посте, на который ссылался Ричард, приведены некоторые подробности о двух разных подходах. На следующей неделе я добавлю эти детали в тему howto. Пока же будет полезно прочитать этот пост.

А, я думаю, теперь понимаю. Часть моего недоумения связана с темой https://meta.discourse.org/t/bring-over-permission-level-from-wordpress-memberpress/78074/2: в её нижней части ссылка велла именно на эту тему как на решение, что и вызвало путаницу.

Мне это всё ещё кажется слишком сложным, но я с нетерпением жду вашего руководства по этой теме.

Спасибо всем за помощь!
Рэй

Тогда выведите их из системы :slight_smile:
Что-то вроде этого должно сработать:

  $url = sprintf('https://%s/users/by-external/%d.json', $discourseHostname, $wpUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_get($url, $options);
  if (wp_remote_retrieve_response_code($request) != 200) {
	return; // пользователь не найден, выходим
  }
  
  $userData = json_decode(wp_remote_retrieve_body($request), true);
  if (!isset($userData['user']['id'])) {
	return false; // неверный ответ, выходим
  }
  
  $discourseUserID = $userData['user']['id'];
  
  $url = sprintf('https://%s/admin/users/%d/log_out', $discourseHostname, $discourseUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_post($url, options);

Вы можете выйти из системы от их имени. Просто притворитесь ими.

На самом деле, достаточно просто перейти на страницу деталей их профиля, чтобы выйти из системы.

(Очевидно, что всё это очень вручную. У меня всего несколько человек, и я точно знаю, чем каждый занимается. Я ещё не пробовал решение Ричарда, но хорошо знать, что оно есть!)

Можете ли вы, пожалуйста, добавить сюда ссылку, когда это произойдёт? Спасибо!

Конечно, тема находится здесь: Manage group membership in Discourse with WP Discourse SSO. В ней описывается, как использовать функции WP Discourse add_user_to_discourse_group и remove_user_from_discourse_group. Предполагается, что ваш сайт WordPress настроен как провайдер SSO для Discourse; именно эти функции следует использовать для управления членством в группах на Discourse.

В примере, приведённом в этой теме, используется плагин PaidMembershipsPro, но аналогичный подход должен работать с любым хорошо написанным плагином членства для WordPress.

Я добавлю в тему некоторые детали о том, как управлять членством в группах с помощью параметров SSO add_groups и remove_groups. В большинстве случаев управление членством в группах путём добавления этих параметров в полезную нагрузку SSO не является лучшим решением, поскольку это требует, чтобы пользователи вышли из системы и снова вошли в Discourse, прежде чем их членство в группах будет обновлено.

Я надеюсь, что в ближайшем будущем появится готовое решение для связывания Discourse с конкретными плагинами членства WordPress. В настоящее время это можно сделать только путём добавления небольшого количества пользовательского кода на ваш сайт WordPress. Если вы обычно не занимаетесь подобными задачами, возможно, вам потребуется нанять разработчика для помощи в этом.

Спасибо за подробности. Постараюсь это усвоить.

Я согласен — мне больше нравится, когда добавление/удаление групп происходит динамически, а не при выходе и последующем входе пользователя.

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

Эй, Рэй, что ты в итоге тут сделал?