Я годами наблюдал за обсуждениями на форумах meta.discourse, собирая фрагменты кода и изучая, как улучшить сайт клиента, использующий WordPress + MemberPress + Discourse (с собственным хостингом).
Мне нужно (и всё ещё нужно) назначать группы Discourse на основе членств MemberPress.
Для справки:
- Сайт клиента (провайдер SSO): https://secretsofsolo.com/
- Сайт Discourse: https://jamcircle.secretsofsolo.com/
Ранее (в течение нескольких лет) я использовал метод фильтра 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
Спасибо всем участникам этого форума, которые на протяжении лет предоставляли фрагменты кода и поддержку. Я знаю, что многие «наблюдатели», подобные мне, находят этот ресурс чрезвычайно ценным и полезным.
Если у вас есть предложения или вы видите проблемы в моём примере, дайте знать, как я могу его улучшить.