# 使用 pmpro 和 wp-discourse 更新会员等级

**URL:** https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583
**Category:** WordPress
**Created:** [2020年五月6日 11:56 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583 "2020-05-06T11:56:25Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![waffleslop](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/waffleslop/32/244974_2.png) [@waffleslop](https://meta.discourse.org/u/waffleslop)
#### Post date: [2020年五月6日 11:56 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/1 "2020-05-06T11:56:26Z")

</div>

我同时使用了 Discourse 和 Paid Memberships Pro (PMPro) 插件，以及 PMPro 的 Zapier 附加组件。我尝试将用户的会员等级同步更新到 Discourse。我的期望是：当在 WordPress 后台（wp-admin）更改任何用户的会员等级时，该变更应自动同步到 Discourse 网站的管理员用户部分。为此我需要怎么做？请提供一些思路。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2020年五月6日 15:23 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/2 "2020-05-06T15:23:39Z")

</div>

您需要向 `functions.php` 添加一个动作

```plaintext
/* 示例参见 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 ) {

 . . . . 获取会员等级和分组并将其添加到分组的代码

}

```

---

<div class="post-metadata">

### Author: ![waffleslop](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/waffleslop/32/244974_2.png) [@waffleslop](https://meta.discourse.org/u/waffleslop)
#### Post date: [2020年五月7日 09:44 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/3 "2020-05-07T09:44:19Z")

</div>

能否请您解释一下，如何获取更新后用户的 $level\_id、$user\_id、$cancel\_level 以及组名？

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2020年五月7日 09:47 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/4 "2020-05-07T09:47:18Z")

</div>

我已链接到文档。我认为它们是通过动作钩子传递的。

---

<div class="post-metadata">

### Author: ![waffleslop](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/waffleslop/32/244974_2.png) [@waffleslop](https://meta.discourse.org/u/waffleslop)
#### Post date: [2020年五月7日 11:03 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/5 "2020-05-07T11:03:41Z")

</div>

你好 Jay，感谢你的回复，它在我这里确实起作用了，但旧的值仍然保留在那里。也就是说，我同时获取到了新的会员等级和旧的会员等级的值。有什么办法可以移除旧的会员等级值吗？

我使用的是以下内容：

`DiscourseUtilities::remove_user_from_discourse_group( $user_id, $group_name );`

这是我的移除函数：

```plaintext
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;
}

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2020年五月7日 16:50 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/6 "2020-05-07T16:50:10Z")

</div>

我认为 wp-discourse 中有一个可以调用的“从群组移除”功能。

---

<div class="post-metadata">

### Author: ![waffleslop](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/waffleslop/32/244974_2.png) [@waffleslop](https://meta.discourse.org/u/waffleslop)
#### Post date: [2020年五月8日 10:13 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/7 "2020-05-08T10:13:47Z")

</div>

这是 [Simon Cossar] ([https://meta.discourse.org/u/Simon\_Cossar](https://meta.discourse.org/u/Simon_Cossar))[团队](https://meta.discourse.org/g/team) 使用的相同函数，请参阅此链接：

> [Manage group membership in Discourse with WP Discourse SSO](https://meta.discourse.org/t/managing-discourse-group-membership-with-wp-discourse/74724)

我使用了相同的函数，需要帮助。我也在上面的消息中发布了代码。

这是我的更新会员等级代码：

```php
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 );

```

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [2020年五月8日 17:09 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/8 "2020-05-08T17:09:04Z")

</div>

我不确定你代码中的这一行在做什么：

```plaintext
$groupname = DiscourseUtilities::get_discourse_user( $user_id, false );

```

这会将 `$groupname` 设置为一个 Discourse 用户对象。我认为你需要删除这一行，并使用你在代码第一行中设置的 `$group_name` 变量。

---

<div class="post-metadata">

### Author: ![waffleslop](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/waffleslop/32/244974_2.png) [@waffleslop](https://meta.discourse.org/u/waffleslop)
#### Post date: [2020年五月9日 05:09 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/9 "2020-05-09T05:09:56Z")

</div>

我之前用过，但不起作用。  
请提供解决方案。

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [2020年五月9日 18:46 UTC](https://meta.discourse.org/t/update-membership-level-with-pmpro-and-wp-discourse/150583/10 "2020-05-09T18:46:52Z")

</div>

如果您希望我们为您提供解决方案，您需要向我们支付费用。请在 [https://discourse.org/buy](https://discourse.org/buy) 注册托管计划。
