我同时使用了 Discourse 和 Paid Memberships Pro (PMPro) 插件,以及 PMPro 的 Zapier 附加组件。我尝试将用户的会员等级同步更新到 Discourse。我的期望是:当在 WordPress 后台(wp-admin)更改任何用户的会员等级时,该变更应自动同步到 Discourse 网站的管理员用户部分。为此我需要怎么做?请提供一些思路。
您需要向 functions.php 添加一个动作
/* 示例参见 http://hookr.io/actions/pmpro_after_change_membership_level/ */
do_action( 'pmpro_after_change_membership_level', $level_id, $user_id, $cancel_level );
function action_pmpro_after_change_membership_level( $level_id, $user_id, $cancel_level ) {
. . . . 获取会员等级和分组并将其添加到分组的代码
}
能否请您解释一下,如何获取更新后用户的 $level_id、$user_id、$cancel_level 以及组名?
我已链接到文档。我认为它们是通过动作钩子传递的。
你好 Jay,感谢你的回复,它在我这里确实起作用了,但旧的值仍然保留在那里。也就是说,我同时获取到了新的会员等级和旧的会员等级的值。有什么办法可以移除旧的会员等级值吗?
我使用的是以下内容:
DiscourseUtilities::remove_user_from_discourse_group( $user_id, $group_name );
这是我的移除函数:
function dcpmp_remove_member_from_group( $level_id, $user_id, $cancel_level ) {
if ( ! empty( $cancel_level ) ) {
$group_name = dcpmp_get_level_for_id( $cancel_level );
if ( is_wp_error( $group_name ) ) {
return null;
}
// 移除用户。
$result = DiscourseUtilities::remove_user_from_discourse_group( $user_id, $group_name );
if ( ! empty( $result->success ) ) {
// 移除会员等级元数据键。
delete_user_meta( $user_id, "dcpmp_group_{$group_name}" );
}
return $result;
}
return null;
}
我认为 wp-discourse 中有一个可以调用的“从群组移除”功能。
这是 [Simon Cossar] (https://meta.discourse.org/u/Simon_Cossar)团队 使用的相同函数,请参阅此链接:
我使用了相同的函数,需要帮助。我也在上面的消息中发布了代码。
这是我的更新会员等级代码:
function action_pmpro_after_change_membership_level( $level_id, $user_id, $cancel_level ) {
$group_name = dcpmp_get_level_for_id( $level_id );
if ( is_wp_error( $group_name ) ) {
return null;
}
$groupname = DiscourseUtilities::get_discourse_user( $user_id, false );
// 移除用户。
$result = DiscourseUtilities::remove_user_from_discourse_group( $user_id, $groupname );
if ( ! empty( $result->success ) ) {
// 删除会员等级元数据键。
delete_user_meta( $user_id, "dcpmp_group_{$groupname}" );
}
$result1 = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
if ( ! empty( $result1->success ) ) {
// 如果用户已添加到组中,则添加一个可在以后使用的元数据键值对。
add_user_meta( $user_id, "dcpmp_group_{$group_name}", 1, true );
}
return $result;
return $result1;
}
add_action( 'pmpro_after_change_membership_level', 'action_pmpro_after_change_membership_level', 10, 3 );
我不确定你代码中的这一行在做什么:
$groupname = DiscourseUtilities::get_discourse_user( $user_id, false );
这会将 $groupname 设置为一个 Discourse 用户对象。我认为你需要删除这一行,并使用你在代码第一行中设置的 $group_name 变量。
我之前用过,但不起作用。
请提供解决方案。
如果您希望我们为您提供解决方案,您需要向我们支付费用。请在 https://discourse.org/buy 注册托管计划。