Memberpress: كيفية إضافة المستخدمين إلى المجموعات عند التسجيل

Hi Eva, I went over your code and there’s no errors that I can spot - and I totally get your frustration. If it hadn’t been for Simon Cossar I don’t know how I’d have resolved it myself.

So, taking it backwards: if the PHP is correct, then something else must be disconnected. (browniepoints for me, yay.)

But…
I don’t know enough about any of that to be able to give suggestions or help.
If you’ve got your forum parked with the boys from Discourse Hosting, you could ask Richard (his name tag won’t pop, but this is his profile: Profile - RGJ - Discourse Meta )

Or perhaps @simon might be able to provide you with the missing steps.

Keeping my fingers crossed for you.

edit:
p.s. these are all the related plug-ins i use (+ that PHP one)
(Memberpress Drip is email marketing, so not related to this)

At least the code is okay…

Just going to ask some easy questions just to be sure it’s not a stupid mistake :

On discourse :

  • Are your groups hidden/closed/opened ?
  • Is your group full name different from the name and default title ? Which one is considered by the PHP code ?
  • Have you done anything special in the parameters section concerning this ?

On wordpress :

  • Does your WP-Discourse plugin have specific settings/webhooks for this ?
  • Do you validate the user’s email when they register on wordpress or you use Discourse’s email validation ?

I’m not sure the issue is there but I always take a shot, thank you again !

On Discourse:

  • groups are any and all: closed and opened (i don’t give access to hidden groups, come to think of it)
  • these are some of the group names as displayed in ‘Groups’ - and as you can see, the “NoSpacesNames” are the ones that coincide with the PHP settings
    26
    54
  • If by parameters you mean the following, then no:
    22

nor in the actual group settings (where you create it, with name, owner, etc.), it’s all straight forward and not connected to accessing through SSO - so setting or not setting this as a person’s primary group is not relavant.

There is one webhook here on Discourse that I put in as instructed by the WP-Discourse plugin:


but I don’t actually have that box checked…

  • email verification technically goes via memberpress: they (my wp-instance) send the log-in details to the user. by clicking the log-in link the users verify their address.
    i know for a fact that it’s not through Discourse, because for a while it ALSO went through discourse (glitch somewhere) and Richard sorted that for me.

you’re welcome!

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

لم ألقِ نظرة على الأمر منذ فترة، لكن ما تحتاجه هو تواصل بين أكواد Discourse الخاصة بك وأكواد نظام الدفع (في حالتي: MemberPress).

لذا، إذا توقف الشخص عن الدفع، يقوم MemberPress بتغيير الكود الخاص به، وهذا الكود يتوافق مع مستوى مجموعة مختلف.
إذا لم يكن هناك رابط مع الدفع، فلن يتم تعديل مستوى المجموعة.

أوه، انتظر.
بإعادة قراءة سؤالك: لست متأكدًا من كيفية عمل ذلك مع مستويات الثقة…
لكن… إذا فشلت كل المحاولات، يمكنك بسهولة إنشاء مجموعة (GROUP) مُعدّة لمستوى ثقة 2 وأخرى مُعدّة لمستوى ثقة 1، ثم تطلب من إضافة العضوية أن تُعيّن هذه المجموعات لأعضائك.

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

هذه فكرة رائعة! نعم، يمكننا تعيين مستويات الثقة لمجموعات Discourse. لكنني لست خبيرًا بما يكفي في Memberpress.

هل يمكننا نقل المستخدمين المدفوعين في Memberpress إلى مجموعة خاصة تلقائيًا؟

ظهر هذا النقاش في منشور آخر على ميتا اليوم، لذا قمت بمراجعة الكود للتأكد مما إذا كان يمكن تقليل مستوى ثقة المستخدم بإضافته إلى مجموعة تُحدد مستوى ثقة أقل من مستوى المجموعة الحالية للمستخدم. من خلال النظر في الكود، أستنتج أن هذا غير ممكن:

  def grant
    if @user.trust_level < @trust_level
      @user.change_trust_level!(@trust_level)
      @user.save!
    end
  end

إذا كان مستوى ثقة المستخدم أقل من مستوى الثقة الذي تمنحه المجموعة، فإن إضافة المستخدم إلى المجموعة ستُحدّث مستوى ثقته. وإلا، فلن يكون هناك أي تغيير في مستوى ثقة المستخدم.

ربما توجد إضافات عضوية أخرى يمكنها فعل الشيء نفسه لك.

إنه الثامنة مساءً هنا وأنا أودّع اليوم، لكن إذا كنت بحاجة إلى مزيد من المساعدة، فسأكون سعيدًا بالنظر في الأمر صباح غد. فقط أخبرني بذلك.

أنا قليل الخبرة قليلاً (كما أنه متأخر من الوقت)، لكن مستوى الثقة لن يكون ذا صلة حقًا. أنا لا أستخدم مستويات الثقة على الإطلاق. مجموعة TL 2 لديها حق الوصول إلى “هذا” بينما مجموعة TL1 لا تملكه.
مستوى الثقة الفعلي غير مستخدم. يمكن لأي عضو أن يكون مستوى ثقة 1 ويظل يحصل على الوصول (عبر الدفع) إلى مجموعة TL 4 - بشرط ألا أقوم بتعيين الأذونات لمستويات الثقة، بل للمجموعات فقط.

نعم، الطريقة الصحيحة للتعامل مع هذا الأمر هي استخدام مجموعات وأذونات الأمان للفئات. لا ينبغي أن يكون هناك حاجة للاعتماد على مستويات الثقة.

@Dani1، شكرًا لمشاركتك تجاربك وتحدياتك هنا، فهذا مفيد جدًا للآخرين الذين يستخدمون MemberPress مثلي.

هذا منطقي بالفعل، لكنني أتساءل عما يحدث إذا انتهت اشتراك العضو ولم يسجل الخروج، فيستمر في الوصول إلى المجموعة… هل واجهت هذه المشكلة؟

إذا كانت كذلك، أتساءل إذا كان هناك طريقة لإجبار التحديث أو تسجيل الخروج…

شكرًا!
Ray

يجب عليك التقاط حدث Memberpress وتعديل المجموعات وفقًا لذلك.

انظر أيضًا Bring over permission level from WordPress MemberPress - #2 by simon و Manage group membership in Discourse with WP Discourse SSO

@RGJ الكود أعلاه المميز كحل [Memberpress: how to add users to groups upon Sign up - #11 by simon] يزيل الأعضاء من المجموعات، ولكن كما ذكرت داني1، فإن التأثير لا يظهر إلا بعد تسجيل الخروج.

إذا تم تحديث مستخدم عبر عملية تسجيل الدخول الموحد (SSO) العادية، فلن يتم تطبيق التحديث إلا بعد تسجيل الخروج ثم تسجيل الدخول مرة أخرى. مثال الكود أعلاه هو أسهل طريقة لمعالجة المشكلة، لكنه ربما ليس أفضل طريقة لإدارة عضوية المجموعات.

يحتوي مكون WP Discourse على دالتين مساعدتين يتم تفعيلهما عندما يعمل WordPress كموقع مزوّد لتسجيل الدخول الموحد (SSO) لـ Discourse. تتيح لك هذه الدوال تحديث عضوية المجموعات دون الحاجة إلى تسجيل خروج المستخدم من Discourse. توجد هذه الدوال في الموضوع الذي رتبه ريتشارد: Manage group membership in Discourse with WP Discourse SSO.

يُقدّم الموضوع الذي رتبه ريتشارد بعض التفاصيل حول الطريقتين المختلفتين. سأقوم بإضافة هذه التفاصيل إلى موضوع howto الأسبوع المقبل. في الوقت الحالي، من الجيد قراءة المنشور بعناية.

آه، أعتقد أنني فهمت الآن. جزء من حيرتي كان في الموضوع https://meta.discourse.org/t/bring-over-permission-level-from-wordpress-memberpress/78074/2، حيث أشار الجزء السفلي منه إلى هذا الموضوع كحل، مما سبب الارتباك.

لا يزال الأمر فوق طاقتي المحدودة، لكنني أتطلع إلى دليلك (howto) في هذا الشأن.

شكرًا للجميع على مساعدتكم!
راي

ثم سجّلهم الخروج :slight_smile:
يجب أن يكون شيء مثل هذا كافيًا:

  $url = sprintf('https://%s/users/by-external/%d.json', $discourseHostname, $wpUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_get($url, $options);
  if (wp_remote_retrieve_response_code($request) != 200) {
	return; // لم يتم العثور على المستخدم، اخرج
  }
  
  $userData = json_decode(wp_remote_retrieve_body($request), true);
  if (!isset($userData['user']['id'])) {
	return false; // استجابة غير صحيحة، اخرج
  }
  
  $discourseUserID = $userData['user']['id'];
  
  $url = sprintf('https://%s/admin/users/%d/log_out', $discourseHostname, $discourseUserID);
  $options = [
    'headers' => [
      'Api-Key' => $apiKey,
      'Api-Username' => 'system'
    ]
  ];
  $request = wp_remote_post($url, options);

يمكنك تسجيل خروجهم نيابةً عنهم. فقط تظاهر بأنك أحد المستخدمين.

في الواقع، مجرد الانتقال إلى تفاصيل المستخدم الخاص بهم يجب أن يتيح لك تسجيل خروجهم.

(من الواضح أن هذا كله يدوي للغاية. لدي عدد قليل فقط من الأشخاص وأعرف بالضبط ما يفعله الجميع. لم أجرب حل ريتشارد بعد، لكن من الجيد معرفة أنه موجود!)

هل يمكنك إضافة رابط هنا عند حدوث ذلك؟ شكرًا لك!

بالتأكيد، الموضوع موجود هنا: Manage group membership in Discourse with WP Discourse SSO. يصف كيفية استخدام دوال add_user_to_discourse_group و remove_user_from_discourse_group في WP Discourse. بافتراض أن موقع ووردبريس الخاص بك مُعد ليكون موقع مزوّد SSO لـ Discourse، فهذه هي الدوال التي يجب استخدامها لإدارة عضوية المجموعات في Discourse.

المثال المستخدم في هذا الموضوع يعتمد على إضافة PaidMembershipsPro، لكن نهجًا مشابهًا يجب أن يعمل مع أي إضافة عضوية ووردبريس جيدة الصنع.

سأضيف بعض التفاصيل إلى الموضوع حول كيفية إدارة عضوية المجموعة باستخدام معلمات SSO add_groups و remove_groups. في معظم الحالات، لن يكون إدارة عضوية المجموعة عن طريق إضافة هذه المعلمات إلى حمولة SSO هو النهج الأفضل، لأنه يتطلب من المستخدمين تسجيل الخروج ثم الدخول مرة أخرى إلى Discourse قبل تحديث عضويتهم في المجموعة.

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

شكرًا للتفاصيل. سأحاول استيعابها.

أتفق معك — أفضل أن تتم إضافة/حذف المجموعات في الوقت الفعلي بدلاً من انتظار تسجيل الخروج ثم الدخول من قبل المستخدم.

إذا لم أتمكن من حل الأمر، سأقوم بتوظيف مطور هنا لتنفيذه ومشاركة الكود. أعتقد أن هناك عددًا قليلًا منهم قد قام بذلك في قسم السوق.

راي

يا راي، ماذا فعلت هنا؟