Memberpress + WP Discourse (Управление группами)

Я годами наблюдал за обсуждениями на форумах meta.discourse, собирая фрагменты кода и изучая, как улучшить сайт клиента, использующий WordPress + MemberPress + Discourse (с собственным хостингом).

Мне нужно (и всё ещё нужно) назначать группы Discourse на основе членств MemberPress.

Для справки:

Ранее (в течение нескольких лет) я использовал метод фильтра add_filter( 'wpdc_sso_params':

Недостатком этого подхода казалось то, что группы Discourse обновлялись только при входе пользователя в систему. Мне требовалось решение с более мгновенным эффектом (например, при совершении транзакции MemberPress).

Сознаюсь, мои навыки программирования на PHP довольно базовые. Я больше фронтенд-разработчик, работающий с HTML/CSS.

Теперь я переписал свои функции для сайта клиента, используя более совершенную функцию WP Discourse, описанную здесь:

Она использует функции: \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group и \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group.

Теперь я могу отслеживать события MemberPress и добавлять группы Discourse с помощью этого блока кода (functions.php):

add_action('mepr-event-create', 'listen_to_mepr_events');
function listen_to_mepr_events($event) {
  $obj = $event->get_data();
  //$obj может быть объектом MeprTransaction или MeprSubscription

  if(!($obj instanceof MeprTransaction) && !($obj instanceof MeprSubscription)) {
    return; // Ничего не делаем, если речь не о транзакции или подписке
  }

  $member = $obj->user(); // Получаем данные объекта члена из объекта события

  $user_id = $member->ID; // Получаем ID пользователя из объекта

  if($member->is_active_on_membership($obj)) { // Активное членство
    
    if(3780 == $obj->product_id) { // Ежемесячное членство
        $add_group = 'Ksenia_Basic'; // Название группы Discourse
        $remove_groups = ['Ksenia_Essential','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // Добавляем в группу Discourse
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // Удаляем из групп Discourse
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
    else if(3847 == $obj->product_id) { // Членство на 6 месяцев (Essential)
        $add_group = 'Ksenia_Essential'; // Название группы Discourse
        $remove_groups = ['Ksenia_Basic','Ksenia_Premium','Ksenia_Free','Ksenia_Annual'];
        // Добавляем в группу Discourse
        \WPDiscourse\Utilities\Utilities::add_user_to_discourse_group( $user_id, $add_group );
        // Удаляем из групп Discourse
        \WPDiscourse\Utilities\Utilities::remove_user_from_discourse_group( $user_id, $remove_groups );
    }
  }
  else { // Нет совпадений
  }
}

Дополнительная справка: пример использования хука действия MemberPress add_action('mepr-event-create', 'listen_to_mepr_events'); можно найти здесь:

К сведению: это упрощённая версия того, что я использую на сайте клиента. Полная версия (которая также включает управление Learndash и Mailster) доступна здесь: Memberpress + Learndash + Mailster + WP Discourse · GitHub

Спасибо всем участникам этого форума, которые на протяжении лет предоставляли фрагменты кода и поддержку. Я знаю, что многие «наблюдатели», подобные мне, находят этот ресурс чрезвычайно ценным и полезным.

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

Спасибо, Эндрю. Я изучу это завтра и дам вам более подробный ответ в понедельник. Только как предварительное замечание: вы уже смотрели на плагин синхронизации групп Memberpress, разработанный @fzngagan?

Ролевая система — круто :sunglasses: Нет, я не видел этот плагин. Отличный вклад.

Как мне это реализовать? Я использую WordPress с плагином Memberpress и только что установил Discourse на поддомене, размещённом на виртуальном сервере DigitalOcean. Нужно ли мне буквально загрузить код так же, как обычный плагин?

Да, wp-discourse-mepr-sync — это однофайловый плагин для WordPress.

Я только что ознакомился с кодом. Если это не очевидно, плагин Memberpress Sync зависит от кода плагина WP Discourse: WP Discourse – WordPress plugin | WordPress.org. Это означает, что вам также потребуется установить, активировать и настроить плагин WP Discourse: Connect WP Discourse to Discourse. Кроме того, вам нужно настроить свой сайт WordPress как провайдера DiscourseConnect для вашего сайта Discourse. Подробная информация о настройке доступна здесь: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

В плагине Memberpress Sync есть один момент, в котором я не уверен. На мой взгляд, в код плагина жестко зашиты два идентификатора продуктов Memberpress и две группы Discourse:

Я думаю, вам потребуется внести некоторые изменения в этот файл. Значения в массиве, определенном константой PV_MEMBERPRESS_PRODUCT_IDS, необходимо установить в соответствии с идентификаторами подписок вашего сайта. Также вам нужно задать определения PV_DISCOURSE_ENROLLED_GROUP и PV_DISCOURSE_UNENROLLED_GROUP так, чтобы они соответствовали группам, существующим на вашем сайте Discourse.

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

Может быть, @fzngagan сможет подтвердить, правильно ли я понял? Если это так, то настройка кода для сайта @earlysound будет довольно простой. Однако возможно, что я неправильно понимаю принцип работы плагина. У меня нет копии плагина Memberpress. Если бы я мог получить доступ к разработочной версии Memberpress, я мог бы протестировать это самостоятельно.

Я читаю ту же логику из кода, которую вы объяснили. Было бы очень здорово, если бы @fzngagan мог это подтвердить.

Привет, ребята! Я знаю, что с момента последнего поста прошло несколько месяцев, но надеюсь, что информация ниже всё ещё полезна.

Конечно, я не @fzngagan, но я тот клиент, для которого изначально разрабатывался этот плагин!

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

Когда пользователи отписывались и уходили, их удаляли из группы Discourse и добавляли в группу «Альма-матер» (Alumni), которая имела доступ только к определённым разделам форума.

@simon прав: идентификаторы членства и группы Discourse прописаны жёстко. Я полагаю, что для использования плагина достаточно просто заменить их на свои собственные.

Да, всё верно. Вам нужно лишь изменить эти значения:

define('PV_MEMBERPRESS_PRODUCT_IDS', array(153, 161));
define('PV_DISCOURSE_ENROLLED_GROUP', 'locker');
define('PV_DISCOURSE_UNENROLLED_GROUP', 'KaizenAlumni');
define('PV_MEPR_ACTIVE_STATUSES', array('complete'));