مرحبًا، أنا أبحث عن طريقة لاسترجاع المجموعة التي ينتمي إليها المستخدم. يبدو أنه يجب أن أتمكن من الحصول على هذه المعلومات عبر get_discourse_user، لكن هذه الدالة لا تبدو وكأنها ترجع أي بيانات للمجموعات. وفقًا لهذا المنشور، يجب أن تفعل ذلك؟
هل تستدعي دالة WP Discourse get_discourse_user؟ إذا كان الأمر كذلك، فيجب أن تُرجع المجموعات الخاصة بالمستخدم في مصفوفة "groups".
نعم، أنا أستدعيه بهذه الطريقة.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
والنتيجة هي
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
المُعامل true في استدعاء الدالة سيجعلها تبحث عن المستخدم في Discourse باستخدام عنوان البريد الإلكتروني إذا لم يتم العثور على مستخدم بناءً على معرف مستخدم WordPress. وهذا يعني أن المستخدم لم يسجل الدخول إلى Discourse عبر SSO بعد. عند العثور على مستخدم بناءً على عنوان بريده الإلكتروني، تُرجع معلومات أقل من Discourse مقارنةً بالعثور على مستخدم بناءً على معرف WordPress الخاص به.
ربما يمكن تحسين الدالة لجعل قيمة الإرجاع أكثر وضوحًا. حتى ذلك الحين، إذا لم يكن هناك مصفوفة groups في الاستجابة، يمكنك معرفة أن المستخدم تم العثور عليه باستخدام عنوان بريده الإلكتروني.
فهمتُ. شكرًا لك على الشرح، سيمون!
مرحبًا سيمون،
لقد سجلت الدخول إلى Discourse عبر SSO، وأواجه هذه الرسالة عند تعيين معلمة البريد الإلكتروني على false.
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "تعذر استرجاع مستخدم Discourse." } } ["error_data"]=> array(0) { } }
عند تعيينها على True، لا تزال المجموعات غير مُرجعة.
أشعر بالقليل من الارتباك لأن إعدادات SSO تسجل دخولي إلى WordPress و Discourse (كما يمكنني تسجيل الخروج من كليهما عبر WordPress)، لذا يبدو أن كل شيء يعمل كما هو متوقع، لكنني لا أزال لا أستطيع رؤية المجموعات المُرجعة.
عند تعيين المعامل الثاني لاستدعاء الدالة على false، أو تركه ببساطة (حيث يكون الافتراضي هو false)، ستحاول الدالة استرداد المستخدم من Discourse بناءً على معرف WordPress الخاص به. إذا قام المستخدم بتسجيل الدخول إلى Discourse باستخدام SSO، فيجب أن تعيد الدالة المستخدم ومجموعاته.
للتصحيح، انتقل إلى صفحة إدارة المستخدم في Discourse الذي تحاول استرداده. مرر إلى أسفل الصفحة وانظر ما إذا كان هناك قسم بعنوان “Single Sign On”. إذا وُجد، تأكد من أن “External ID” في هذا القسم يطابق معرف مستخدم WordPress الذي تستخدمه مع استدعاء get_discourse_user.
إذا لم يكن هناك قسم “Single Sign On” في صفحة إدارة المستخدم في Discourse، فهذا يعني أن المستخدم لم يسجل الدخول إلى Discourse باستخدام SSO بعد.
نعم، لم ألاحظ أن هذا القسم موجود لأي من المستخدمين الذين اختبرتهم.
يبدو حقًا أنني أقوم بتسجيل الدخول عبر SSO.
إليك سير العملية (بدون تسجيل الدخول إلى WordPress أو Discourse):
من WordPress، أضغط على رابط تسجيل الدخول باستخدام Discourse.
يتم توجيهي إلى موقع Discourse.
أقوم بتسجيل الدخول باستخدام بيانات اعتماد Discourse الخاصة بي.
يتم إعادة توجيهي بنجاح إلى موقع WordPress.
أصبح الآن مسجلًا في كلا الموقعين.
ما الذي أغفله في هذه العملية لجعلها SSO رسميًا؟
أرى المشكلة الآن. أنت تستخدم Discourse كمزود لتسجيل الدخول الموحد (SSO) لـ WordPress. هذه الوظيفة مخصصة للاستخدام عندما تكون WordPress هي مزود تسجيل الدخول الموحد لـ Discourse. اسم الوظيفة غير دقيق. يجب أن يكون الاسم واضحًا فيما يتعلق بحالة الاستخدام.
في الحالة التي يكون فيها Discourse هو مزود تسجيل الدخول الموحد لـ WordPress، ما عليك فعله هو إرسال طلب API مصادق عليه إلى /admin/users/$user_id.json. يجب تعيين $user_id إلى معرف المستخدم في Discourse. بالنسبة للمستخدمين الذين سجلوا الدخول إلى WordPress عبر Discourse، يمكنك الحصول على معرف مستخدم Discourse الخاص بهم باستخدام:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
آه، حسنًا. سأبدأ في الغوص في وثائق الـ API الخاصة بكم. شكرًا لتوجيهي في الاتجاه الصحيح!