أقوم بصيانة Discourse و MemberMouse على موقعين. آمل أن يكون هذا الدليل مفيدًا للناس. قد تختلف مواصفاتك الدقيقة عن النتائج التي كنت أرغب فيها. يفترض هذا الدليل أنك على دراية بـ hooks و filters في MemberMouse، و واجهة PHP الخاصة بـ MemberMouse. كما يفترض أيضًا أنك قادر على إضافة كود مخصص إلى WordPress بسهولة عبر ملف functions.php أو إضافة مخصصة من صنعك.
إليك ما أضفناه في هذا الدليل لتحقيق ما يلي:
- تفعيل/تعطيل المستخدم في Discourse بناءً على حالة عضويته في MemberMouse
- تعيين مجموعات في Discourse تمثل مستويات العضوية في MemberMouse
- مزامنة تغييرات اسم المستخدم/البريد الإلكتروني بشكل فوري
- بالإضافة إلى تعديلات صغيرة أخرى مفيدة
الخطوة 1: تثبيت Discourse و WordPress وإضافة wp-discourse لـ WordPress
قم بتثبيت WordPress و Discourse وإضافة wp-discourse لـ WordPress وتشغيلها وتكوينها بشكل صحيح بحيث يعمل WordPress كمزود SSO. هناك العديد من المواضيع حول هذا الأمر هنا.
الخطوة 2: تحديد المربع للسماح لإضافة wp-discourse بإنشاء مستخدم جديد في Discourse عند إنشاء مستخدم في WordPress
وجدت أنه لكي تقوم إضافة wp-discourse فعليًا بإنشاء مستخدم في Discourse عند إنشاء مستخدم في WordPress، كنت بحاجة إلى إجراء تغيير في الكود داخل الإضافة. والسبب في ذلك هو أن الإضافة تعتمد على إجراء “wp_login”، ولكنها تتصرف بشكل مختلف في MemberMouse مقارنة بسلوك WordPress العادي. لذا، يجب عليك إضافة هذا السطر إلى الملف /lib/discourse-sso.php داخل الدالة العامة __construct( $wordpress_email_verifier ):
add_action( 'my_mm_account_added', array( $this, 'create_discourse_user' ), 10, 2 );
وفي ملف functions.php أو في إضافة خاصة بك، أضف الكود التالي:
function add_user_to_discourse($data) {
do_action( 'my_mm_account_added', $data["username"], get_user_by('ID',$data["member_id"]) );
}
add_action('mm_member_add', 'add_user_to_discourse');
الخطوة 3: إذا رغبت، اجعل المستخدمين الجدد غير مضطرين للنقر على رابط تفعيل البريد الإلكتروني الخاص بـ Discourse
بشكل افتراضي، سيرسل Discourse بريدًا إلكترونيًا للتفعيل إلى المستخدم الجديد، لكنني اخترت إيقاف ذلك لأن المستخدم قد تجاوز بالفعل عددًا مرضيًا من العقبات في WordPress للانضمام. إذا كان موقع WordPress الخاص بك يتميز بحاجز منخفض للانضمام، فقد لا ترغب في تخطي بريد التفعيل. في حالتنا، يجب عليك الدفع للانضمام. أضف الكود التالي إلى ملف functions.php أو إلى إضافة خاصة تنشئها:
add_filter( 'wpdc_auto_create_user_require_activation', 'my_wpdc_auto_create_user_require_activation' );
function my_wpdc_auto_create_user_require_activation( $require_activation ) {
return false;
}
الخطوة 4: كلما حدث تغيير في حساب مستخدم MemberMouse:
قم بربط مستويات عضوية MemberMouse بمجموعات Discourse
قم بمزامنة عنوان البريد الإلكتروني واسم المستخدم
قم بتفعيل/تعطيل المستخدم في Discourse حسب الاقتضاء
يمكنك إضافة هذا الكود إلى ملف functions.php أو إلى إضافة خاصة بك.
add_action('mm_member_membership_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_status_change', 'run_discourse_sync_based_on_mm_acct_change');
add_action('mm_member_account_update', 'run_discourse_sync_based_on_mm_acct_change');
في الدالة run_discourse_sync_based_on_mm_acct_change، يجب عليك:
(1) استخدام واجهة برمجة تطبيقات (API) الخاصة بـ Discourse للحصول على اسم المستخدم في Discourse لهذا المستخدم (قد يختلف قليلاً عن اسمه في WordPress بسبب قواعد التسمية الخاصة بـ Discourse) ورقم معرف المستخدم في Discourse. (التوثيق)
(2) ربط معرف مستوى العضوية في MemberMouse بمعرف المجموعة المكافئ في Discourse، ثم تعيين المجموعة في Discourse. أولاً، يجب عليك حذف معرف المجموعة القديم. (التوثيق). بعد ذلك، يمكنك تعيين المجموعة الجديدة. (التوثيق)
(3) مزامنة اسم المستخدم والبريد الإلكتروني إذا تم تغييرهما في WordPress. نحن نسمح بتغيير هذين العنصرين فقط في WordPress. حصلت على مساعدة في هذا الجزء هنا.
(4) تفعيل/تعطيل المستخدم في Discourse بناءً على حالته في MemberMouse. التفعيل (التوثيق). يبدو أن التعطيل مفقود من وثائق الـ API. $url = $url_base.‘admin/users/’.$discourse_userid.‘/deactivate.json?’.$api_auth;
الخطوة 5: إعادة التوجيه التلقائي إلى Discourse عند الاقتضاء
(أوصي بشدة بتأجيل هذا الجزء حتى تتعرف جيدًا على كيفية عمل WordPress و Discourse معًا.)
إذا لم يكن المستخدم مسجلًا في Discourse ولم يكن مسجلًا في WordPress. وجاء إلى عنوان URL في Discourse ونقر على زر تسجيل الدخول الأزرق، فسيتم نقله إلى WordPress لتسجيل الدخول، لكن MemberMouse سيقوم بتوجيه المستخدم إلى أي صفحة قمت بتعيينها لإعادة التوجيه إليها في إعدادات MemberMouse. للأسف، لا يتم إعادة توجيه المستخدم مرة أخرى إلى Discourse. لذا، إليك كيف قمت بحل هذه المشكلة. يمكنك إضافة هذا الكود إلى ملف functions.php أو إلى إضافة خاصة بك. (موضوع للمزيد من المعلومات.)
// إذا جاء الشخص من منتدى discourse، قم بإعادته بالضبط إلى المكان الذي كان فيه بعد تسجيل الدخول
function my_mm_login_redirect( $infoObj ) {
if ( @$_COOKIE['detected_forum_referal'] != '' ) { // يجب عليك العناية بتعيين ملف تعريف الارتباط المؤقت هذا إذا وصل المستخدم حديثًا عبر discourse
$current_user = $infoObj->user;
$user_id = $current_user->ID;
// الحمولة والتوقيع.
$payload = @$_COOKIE['mm_cookie_sso'];
$sig = @$_COOKIE['mm_cookie_sig'];
// تحويل %0B مرة أخرى إلى %0A.
$payload = rawurldecode( str_replace( '%0B', '%0A', rawurlencode( $payload ) ) );
// التحقق من صحة التوقيع.
$sso_secret = 'YOUR-SSO-SECRET';
$sso = new \WPDiscourse\SSO\SSO( $sso_secret );
if ( ! ( $sso->validate( $payload, $sig ) ) ) {
return '';
}
$nonce = $sso->get_nonce( $payload );
$params = array(
'nonce' => $nonce,
'username' => $current_user->user_login,
'email' => $current_user->user_email,
'external_id' => $user_id,
);
$params = apply_filters( 'wpdc_sso_params', $params, $current_user );
$q = $sso->build_login_string( $params );
do_action( 'wpdc_sso_provider_before_sso_redirect', $user_id, $current_user );
// إعادة التوجيه إلى Discourse.
return('YOUR-FORUM-BASE-URL' . '/session/sso_login?' . $q);
}
return('');
}
add_filter( 'mm_login_redirect', 'my_mm_login_redirect', 10, 1 );
