Holy
! How’d you manage to find it!? Nice work.
By adding log statments to my development site. This should be an easy fix, but I’d rather not push the change to WordPress before I test it out some more.
Sure you have a reasonable development environment. Like a real developer. That I understand (in spite of my not having such!) But even thinking to try usernames that had changed… I guess the 2 was the clue.
Here’s a slightly different method to handle Paid Memberships Pro group sync. Pop this into your functions.php file. Expected behavior is add upon subscribe and remove upon cancellation. Thanks to @dfriestedt for sponsoring.
Awesome, anything stopping this being wrapped into a plugin for customers who aren’t confident editing PHP?
No, probably not, but PHP/WP development isn’t my forte, and I don’t plan on personally actively maintaining this code long-term.
I am implementing the PMPro code above and am hung up on something. My understanding is that this code only fires when users buy subscription or cancel a subscription.
Is there a way that I can auto-sync users as they are created on Discourse? In my case, I have some users who are subscribers but don’t have a Discourse accounts (will be created via SSO).
If wordpress is the SSO master then you can have it update groups at every login.
Is there a code snippet that shows an example of updating groups on WP login?
The add_user_to_discourse_groups function will create a Discourse user if it doesn’t already exist. If that function is being called for your users, then you should be fine. Where you might run into problems will be for existing WordPress users who got their membership before the code was added to your site. If that is the case, you will probably need to add the users to Discourse groups through the SSO parameters that are passed to Discourse on login.
To pass additional SSO parameters with the WP Discourse plugin, you can hook into the 'wpdc_sso_params' filter. The parameter you need to use to add users to a Discourse group is called add_groups. You can use it with something like this:
add_filter( 'wpdc_sso_params', 'wpdc_custom_sso_params', 10, 2 );
function wpdc_custom_sso_params( $params, $user ) {
if ( /* some condition that returns true if groups should be added for the user */ ) {
$params['add_groups'] = 'comma,separated,group,names'; // Don't use spaces between names.
}
return $params;
}
أدرك أن هذه مجرد عينة من التعليمات البرمجية ولكن يبدو أن بها خطأً فادحًا.
إذا لم تكتمل عملية الدفع وكان وضع العضوية “token”
فلا يزال يتم إضافة المجموعة إلى مستخدم Discourse ![]()
سأبحث في هذا الأمر لاحقًا ولكني أعتقد أنه يستحق الذكر
أرغب في استخدام هذا الرمز لتقييد مجتمع Discourse الخاص بي حصريًا للأعضاء المدفوعين باستخدام Paid Memberships Pro. لدي مستوى عضوية مجاني ومستويان للعضوية المدفوعة.
كيف يمكنني تعديل هذا الرمز: Manage group membership in Discourse with WP Discourse SSO
بحيث يتمكن الأعضاء المدفوعون فقط من الوصول إلى المجتمع. وإلا، سيتم إعادة توجيههم إلى صفحة التسجيل للعضويات المدفوعة.
شكرا لك.
للرجوع إليها، إليك الكود الذي تريد تعديله:
add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
if ( /* some condition */ ) {
wp_safe_redirect( home_url() );
exit;
}
}
ما تحتاج إلى القيام به هو استبدال التعليق /* some condition */ في الكود بشرط يعيد true للمستخدمين الذين ليس لديهم عضويات مدفوعة. يمكن بعد ذلك إعادة توجيه هؤلاء المستخدمين إلى صفحة الاشتراك في عضويتك.
لا يوجد لدي حاليًا إضافة Paid Memberships Pro مثبتة على موقع الاختبار الخاص بي، ولكن من وثائقهم، يبدو أنه يمكنك استخدام دالة pmpro_hasMembershipLevel للتحقق مما إذا كان لدى المستخدم مستوى عضوية معين: Using the pmpro_hasMembershipLevel() Function.
لاستخدام دالة pmpro_hasMembershipLevel، تحتاج إلى معرفة معرفات (أو أسماء) مستويي العضوية المدفوعة لديك. يمكنك الحصول على هذه المعرفات من صفحة “مستويات العضوية” في لوحة تحكم pmp. على سبيل المثال، إذا كانت معرفات مستوييك المدفوعين هي 1 و 2، يمكنك استخدام الشرط التالي:
if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))
عند استبدالها في الكود، سيكون ذلك:
add_action( 'wpdc_sso_provider_before_sso_redirect', 'wpdc_custom_check_user_membership', 10, 2 );
function wpdc_custom_check_user_membership( $user_id, $user ) {
if (! pmpro_hasMembershipLevel( array( 1, 2 ), $user_id ) ) {
wp_safe_redirect( home_url() );
exit;
}
}
السطر الآخر الذي ستحتاج إلى تغييره هو:
wp_safe_redirect( home_url() );
وهو حاليًا مضبوط لإعادة توجيه المستخدمين إلى الصفحة الرئيسية للموقع. ستحتاج إلى تغييره لإعادة التوجيه إلى المسار أو عنوان URL الكامل لصفحة الاشتراك في موقعك:
wp_safe_redirect( /* path_to_your_signup_page */ );
لاحظ أنني لم أختبر هذا الكود. إذا كنت تجري تغييرات مباشرة على ملف functions.php في موقعك المباشر، فتأكد من أن لديك إمكانية الوصول إلى ملف functions.php الخاص بالموقع من لوحة تحكم الموقع، فقط في حالة وجود أي أخطاء أو أخطاء إملائية في الكود.
تركت لنفسي ملاحظة هنا تتعلق بـ https://meta.discourse.org/t/manage-group-membership-in-discourse-with-wp-discourse-sso/74724#restricting-access-to-discourse-when-a-membership-doesnt-exist-4. إذا تم تمكين خيار WP Discourse إنشاء أو مزامنة مستخدمي Discourse عند تسجيل الدخول، فسيتم إنشاء حسابات Discourse تلقائيًا لجميع المستخدمين في موقع WordPress، حتى لو تم منعهم من تسجيل الدخول إلى Discourse عبر الطريقة الموضحة في المنشور الأصلي. التفاصيل حول كيفية منع إنشاء الحسابات تلقائيًا للمستخدمين الذين ليس لديهم مستوى العضوية المناسب موجودة في الجزء الثاني من هذا المنشور: How to prevent some WP users from being able to login to Discourse - #2 by simon.
بشكل أساسي:
add_filter( 'wpdc_bypass_sync_sso', 'wpdc_custom_bypass_sync_sso', 10, 3 );
function wpdc_custom_bypass_sync_sso( $bypass_sync, $user_id, $user ) {
if ( /* شرط يعيد true إذا كان المستخدم لا يفي بمتطلبات العضوية */ ) {
$bypass_sync = true;
}
return $bypass_sync;
}
أقوم بتعيين تذكير لنفسي لتحديث المنشور الأصلي بهذه التفاصيل.
شكراً لك يا سيمون. تمكنت من إعداد هذا لموقعي باستخدام تعليماتك.
توضيح.
لا يوجد مستوى (ليس مستخدمًا): 0
مستوى مجاني = 1
لدي مستويان مدفوعان: 2، 3
لقد قلت
ما تحتاج إلى القيام به هو استبدال التعليق
/* some condition */في الكود بشرط يعيدtrueللمستخدمين الذين ليس لديهم عضويات مدفوعة. يمكن بعد ذلك إعادة توجيه هؤلاء المستخدمين إلى صفحة الاشتراك في عضويتك.
و
لاستخدام الدالة
pmpro_hasMembershipLevel، تحتاج إلى معرفة معرفات (أو أسماء) مستويي العضوية المدفوعة لديك. يمكنك الحصول على هذه المعرفات من صفحة “مستويات العضوية” في لوحة تحكم pmp. على سبيل المثال، إذا كانت معرفات مستويي العضوية المدفوعة لديك هي 1 و 2، يمكنك استخدام الشرط التالي:
if (! pmpro_hasMembershipLevel(array(1, 2), $user_id))
هل هذه العبارات متناقضة؟
حسب فهمي:
يجب أن أستخدم ما يلي:
if (! pmpro_hasMembershipLevel(array(0,1), $user_id))
لإعادة توجيه المستخدمين الذين ليس لديهم عضوية مدفوعة إلى صفحة تسجيل الأعضاء.
يرجى تصحيحي إذا كنت مخطئًا.
شكرا.
إذا أعادت الشرط القيمة true، فسيتم إعادة توجيه المستخدمين إلى صفحة التسجيل الخاصة بك.
أعتقد أن أكثر الأشياء أمانًا للقيام به في حالتك هو استخدام شرط يعيد القيمة true إذا لم يكن لدى المستخدم أي من المستويين 2 أو 3:
if (! pmpro_hasMembershipLevel(array(2, 3), $user_id))
شكراً لك. لقد فاتني علامة “!” في المقتطف الثاني الخاص بك.


