Memberpress + WP Discourse (إدارة المجموعات)

لقد كنت أراقب منتديات meta.discourse لسنوات، وأجمع مقتطفات وأتعلم كيفية تحسين موقع عميل يستخدم Wordpress + Memberpress + Discourse (مستضاف ذاتيًا).

كنت بحاجة (ولا أزال بحاجة) إلى تعيين مجموعات Discourse بناءً على عضويات Memberpress.

للمرجع:

سابقًا (لعدة سنوات) استخدمت طريقة فلتر 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; // الحصول على معرف المستخدم من الكائن

  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 إعجابات

شكراً أندرو، سألقي نظرة على هذا غداً وأقدم لك رداً مفصلاً يوم الاثنين. كملاحظة أولية، هل اطلعت على المكون الإضافي لمزامنة مجموعات Memberpress الذي طوره @fzngagan؟

4 إعجابات

قائم على الأدوار - لطيف :sunglasses: لا، لم أر هذا المكون الإضافي. مساهمة ممتازة.

إعجاب واحد (1)

كيف يمكنني المضي قدمًا في تنفيذ هذا؟ أنا أستخدم ووردبريس مع Memberpress، وقمت للتو بتثبيت Discourse على نطاق فرعي مستضاف على قطرة DigitalOcean. هل أقوم فعليًا بتحميل الكود كما أفعل مع المكون الإضافي؟

نعم، wp-discourse-mepr-sync هو مجرد إضافة ووردبريس من ملف واحد.

إعجاب واحد (1)

لقد ألقيت نظرة على الكود. في حال لم يكن الأمر واضحًا، فإن إضافة Memberpress Sync تعتمد على كود من إضافة WP Discourse: WP Discourse – WordPress plugin | WordPress.org. هذا يعني أنك ستحتاج أيضًا إلى تثبيت وتفعيل وتهيئة إضافة WP Discourse: Connect WP Discourse to Discourse. ستحتاج أيضًا إلى تهيئة موقع WordPress الخاص بك كمزود لـ DiscourseConnect لموقع Discourse الخاص بك. التفاصيل حول إعداد ذلك موجودة هنا: Configure single sign-on (SSO) with WP Discourse and DiscourseConnect.

هناك شيء في إضافة Memberpress Sync لست متأكدًا منه. يبدو لي أن هناك معرفي منتج Memberpress ومجموعتي Discourse محددين بشكل ثابت في كود الإضافة:

أعتقد أنك ستحتاج إلى إجراء بعض التغييرات على هذا الملف. ستحتاج القيم الموجودة في المصفوفة التي تم تعريفها بواسطة PV_MEMBERPRESS_PRODUCT_IDS إلى تعيينها إلى معرفات الاشتراك الخاصة بموقعك. ستحتاج أيضًا إلى تعيين تعريفات 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 من التأكيد.

مرحباً يا رفاق، أعلم أنه قد مر بضعة أشهر منذ آخر منشور، ولكن آمل أن يكون ما يلي لا يزال مفيدًا.

أنا لست @fzngagan بالطبع، ولكني العميل الذي تم تطوير هذا المكون الإضافي له في الأصل!

الفكرة هي أننا أردنا إضافة المستخدمين الذين لديهم عضوية Memberpress متكررة نشطة تلقائيًا إلى مجموعة Discourse محددة.

عندما ألغى المستخدمون الاشتراك وغادروا، تمت إزالتهم من مجموعة Discourse وإضافتهم إلى مجموعة “الخريجين” بدلاً من ذلك، والتي كان لديها وصول إلى مناطق معينة فقط من المنتدى.

@simon على حق في أن معرفات العضوية ومجموعات Discourse مرمزة بشكل ثابت. أعتقد أنه يجب أن يكون مجرد مسألة استبدالها بالخاصة بك من أجل استخدامها.

نعم، هذا صحيح. ستحتاج فقط إلى تغيير هذه القيم

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)