多年来,我一直在 meta.discourse 论坛潜水,收集零散信息,学习如何改进一个使用 Wordpress + Memberpress + Discourse(自托管)的客户网站。
我曾经需要(现在仍然需要)根据 Memberpress 会员资格分配 Discourse 群组。
供参考:
之前(几年来)我一直使用 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 函数。
现在我可以通过此代码块(functions.php)监听 Memberpress 事件并添加 Discourse 群组:
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 个月(高级)会员资格
$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
感谢论坛上所有多年来提供代码片段和支持的人。我知道有很多像我一样的潜水者,认为这是一个非常有价值和有用的资源。
如果您有任何建议或发现我的示例有问题,请告诉我如何改进。
6 个赞
angus
(Angus McLeod)
2
谢谢 Andrew,我明天会看看这个,并在周一给你一个更详细的回复。作为初步说明,你是否查看过 @fzngagan 开发的 Memberpress 组同步插件?
4 个赞
基于角色的 - 很好
不,我没见过那个插件。非常棒的贡献。
1 个赞
我该如何着手实现这个?我正在使用 Wordpress 和 Memberpress,并且刚刚在 DigitalOcean 虚拟机上的子域上安装了 Discourse。我是否需要像上传插件一样直接上传代码?
angus
(Angus McLeod)
5
是的,wp-discourse-mepr-sync 只是一个单文件 Wordpress 插件。
1 个赞
simon
6
我刚看了代码。如果还不清楚的话,Memberpress Sync 插件依赖于 WP Discourse 插件的代码:WP Discourse – WordPress plugin | WordPress.org WP Discourse 插件:https://meta.discourse.org/t/connect-wp-discourse-to-discourse/223490。您还需要将您的 WordPress 网站配置为 Discourse 站点的 DiscourseConnect 提供商。有关如何设置的信息在此处:https://meta.discourse.org/t/wp-discourse-and-discourseconnect/223494。
Memberpress Sync 插件中有些内容我不确定。在我看来,插件代码中硬编码了两个 Memberpress 产品 ID 和两个 Discourse 用户组:
我 认为 您需要对该文件进行一些更改。PV_MEMBERPRESS_PRODUCT_IDS 定义的数组中的值需要设置为您站点的订阅 ID。您还需要将 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 的开发版本,我可以自己测试一下。
1 个赞
我从代码中读到的逻辑与您解释的相同。如果 @fzngagan 能确认就太好了。
benm1
(Ben)
9
大家好,我知道距离上次发帖已经几个月了,但希望下面的内容仍然有帮助。
我当然不是 @fzngagan,但我就是这个插件最初开发的客户!
我们的想法是自动将拥有有效会员资格的会员添加到特定的 Discourse 群组。
当用户取消订阅并离开时,他们将从 Discourse 群组中移除,并添加到“校友”群组,该群组只能访问论坛的某些区域。
@simon 的说法是正确的,会员 ID 和 Discourse 群组是硬编码的。我相信您只需要替换成您自己的即可使用。
angus
(Angus McLeod)
10
是的,没错。你只需要更改这些值
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'));
1 个赞