# Приостановка/возобновление пользователя на основе статуса членства в WP

**URL:** https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165
**Category:** WordPress
**Created:** [29.Октябрь.2019 18:48:12 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165 "2019-10-29T18:48:12Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![omarfilip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/omarfilip/32/208019_2.png) [@omarfilip](https://meta.discourse.org/u/omarfilip)
#### Post date: [29.Октябрь.2019 18:48:12 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/1 "2019-10-29T18:48:12Z")

</div>

Мне нужна консультация по следующим вопросам:

- как приостанавливать учётную запись пользователя Discourse при истечении срока действия подписки в WP или её отмене, и
- как снимать блокировку с учётной записи пользователя при продлении ранее истёкшей подписки.

WP выступает в роли провайдера SSO. Мой сайт использовал код @simon [dcpmp](https://github.com/scossar/dcpmp_groups/blob/master/dcpmp_groups.php), но я планирую перейти с PMPro на связку WooCommerce + [WC Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) + [WC Memberships](https://woocommerce.com/products/woocommerce-memberships/).

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

Справочная информация по WC Subscriptions:  
[Subscriptions Action Reference Documentation - WooCommerce](https://docs.woocommerce.com/document/subscriptions/develop/action-reference/)  
[Introduction to Subscriptions Developer Documentation Documentation - WooCommerce](https://docs.woocommerce.com/document/subscriptions/develop/)  
[https://prospress.github.io/subscriptions-rest-api-docs/](https://prospress.github.io/subscriptions-rest-api-docs/)

---

<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: [29.Октябрь.2019 22:51:07 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/2 "2019-10-29T22:51:07Z")

</div>

Вы уже посмотрели [WordPress Membership Integration (Private Forum) with Discourse](https://meta.discourse.org/t/wordpress-membership-integration-private-forum-with-discourse/91438)? Я почти уверен, что там подробно всё описано.

---

<div class="post-metadata">

### Author: ![omarfilip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/omarfilip/32/208019_2.png) [@omarfilip](https://meta.discourse.org/u/omarfilip)
#### Post date: [29.Октябрь.2019 23:16:49 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/3 "2019-10-29T23:16:49Z")

</div>

Я пробовал, но этот метод не приостанавливает пользователя в 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: [29.Октябрь.2019 23:39:51 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/4 "2019-10-29T23:39:51Z")

</div>

О, понятно. Не вижу, чтобы у плагина была функция приостановки пользователя (но возможно, я просто не знаю, где искать). В худшем случае вы можете добавить вызов API в хук, который срабатывает при сбое подписки, и использовать его для приостановки пользователя. Найти его можно здесь: [Reverse engineer the Discourse API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576)

---

<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: [29.Октябрь.2019 23:43:10 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/5 "2019-10-29T23:43:10Z")

</div>

Приостановка и возобновление доступа пользователей — это самая простая часть. Сложность заключается в том, чтобы определить, к каким действиям WooCommerce нужно подключить обработчики.

Похоже, что действие [woocommerce\_subscription\_status\_updated](https://docs.woocommerce.com/document/subscriptions/develop/action-reference/#section-2) должно подойти. Этот хук передаёт три параметра: `$subscription`, `$new_status`, `$old_status`. Параметры статуса — это строки, поэтому их значение должно быть вполне понятным. Параметр `$subscription` — это объект `WC_Subscription`. Я предполагаю, что он содержит данные, позволяющие найти идентификатор пользователя, с которым связана подписка. Однако, чтобы подтвердить это, мне нужно будет заглянуть в код.

---

<div class="post-metadata">

### Author: ![omarfilip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/omarfilip/32/208019_2.png) [@omarfilip](https://meta.discourse.org/u/omarfilip)
#### Post date: [29.Октябрь.2019 23:54:18 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/6 "2019-10-29T23:54:18Z")

</div>

Возможно, эти:  
[Subscriptions Action Reference Documentation - WooCommerce](https://docs.woocommerce.com/document/subscriptions/develop/action-reference/#section-2)

* * *

**Действие:** `'woocommerce_subscription_status_active'`

**Параметры:** `$subscription` Объект `WC_Subscription`, представляющий подписку, статус которой только что был изменён.

**Описание:** Это действие вызывается после того, как указанная в `$subscription` подписка перешла в статус «активна». Статус подписки мог измениться с «ожидает» на «активна», с «на удержании» на «активна» или с любого другого пользовательского статуса на «активна».

* * *

**Действие:** `'woocommerce_subscription_status_cancelled'`

**Параметры:** `$subscription` Объект `WC_Subscription`, представляющий подписку, статус которой только что был изменён.

**Описание:** Это действие вызывается после изменения статуса указанной в `$subscription` подписки.

Статус подписки мог измениться с «ожидает» на «отменена», с «на удержании» на «отменена», с «ожидает отмены» на «отменена» или с любого другого пользовательского статуса на «отменена».

* * *

**Действие:** `'woocommerce_subscription_status_expired'`

**Параметры:** `$subscription` Объект `WC_Subscription`, представляющий подписку, статус которой только что был изменён.

**Описание:** Вызывается, когда подписка достигает конца своего срока действия, если при покупке продукта подписки был установлен её срок или если для подписки была задана дата окончания.

---

<div class="post-metadata">

### Author: ![omarfilip](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/omarfilip/32/208019_2.png) [@omarfilip](https://meta.discourse.org/u/omarfilip)
#### Post date: [29.Октябрь.2019 23:58:14 UTC](https://meta.discourse.org/t/suspend-unsuspend-user-based-on-wp-membership-status/132165/7 "2019-10-29T23:58:14Z")

</div>

> [@simon](#):
>
> Я предполагаю, что в нём содержатся данные, позволяющие найти идентификатор пользователя, с которым связана подписка.

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