مؤخرًا، كنت أنا وفريقي نعمل على ميزة تسمح بتعديل اسم مستخدم Discourse الخاص بالمستخدم من WordPress مع تثبيت إضافة WP Discourse وتعيين موقع WordPress الخاص بنا كموفر SSO لـ Discourse. حاليًا، حققنا بعض النجاح باستخدام واجهة برمجة تطبيقات Discourse، حيث لدينا حقل بيانات تعريف مخصص في WordPress يقوم، عند تحديثه، باستدعاء مثيل Discourse الخاص بموقعنا بطلب PUT لتحديث اسم المستخدم الخاص بالمستخدم (على غرار الحل المقترح هنا: How does one change a username via the API?)
ومع ذلك، هناك خيار موجود ضمن WP Discourse كما هو موضح هنا:
ولكن هذا الحقل يُستخدم فقط لنشر المشاركات (من WP إلى Discourse) ولا يقوم فعليًا بتحديث اسم مستخدم المستخدم في Discourse. تتم المزامنة عندما يغير المستخدم اسم المستخدم الخاص به في Discourse، ولكنه لا تتم المزامنة من WordPress إلى Discourse عند تغييره.
سؤالي هو، هل سيتم تنفيذ هذا النوع من المزامنة ثنائية الاتجاه في وقت ما؟ لماذا يوجد خيار للسماح للمستخدمين بتغيير حقل اسم المستخدم هذا إذا لم تتم مزامنته من WordPress إلى Discourse؟ سيكون فريقنا مهتمًا أيضًا بالمساهمة في هذه الميزة إذا لم تكن شيئًا قيد العمل بالفعل. يحتاج موقعنا إلى هذه الوظيفة، ونتخيل أنها ستكون مفيدة لجميع مواقع WP Discourse أيضًا. يرجى إعلامي بهذا!
@angus@simon نظرًا لأنكما تشاركان بشكل كبير في WP Discourse وساعدتمانا في مشكلات SSO الخاصة بنا، أعتقد أنه يجب توجيه هذا السؤال إليكما!
لقد نقلت هذا إلى فئة #support:wordpress، لأن فئة Feature مخصصة لميزات Discourse.
قد يكون حقل Discourse Username Editable في إضافة WordPress مسمى بشكل غير صحيح. بالتأكيد يحتاج نص الإعداد إلى التحديث لتوضيح الغرض من الإعداد. عندما يتم تمكين إعداد Discourse Username Editable، يمكن للمستخدمين في موقع WordPress تعيين اسم مستخدم Discourse الخاص بهم في صفحة ملفهم الشخصي على WordPress. إذا لم يتم تمكين هذا الإعداد، يمكن للمسؤول فقط في موقع WordPress تعيين اسم مستخدم Discourse للمستخدم. يستخدم اسم مستخدم Discourse فقط بواسطة الإضافة لنشر المشاركات من WordPress إلى Discourse.
عند استخدام DiscourseConnect بين WordPress و Discourse، يتم تعيين اسم مستخدم Discourse للمستخدم مبدئيًا من اسم مستخدم WordPress الخاص به. إذا تم تمكين إعداد auth_overrides_username في موقع Discourse، فلا يمكن تعيين اسم المستخدم في Discourse إلا من WordPress. إذا لم يتم تمكين إعداد auth overrides username في Discourse، فيمكن للمستخدمين تعديل اسم المستخدم الخاص بهم في Discourse بحيث يمكن أن تكون أسماء المستخدمين غير متزامنة بين النظامين.
فيما يتعلق بحقل Discourse Username، من الناحية المثالية، سيتم تعيين هذا الحقل دائمًا في الخلفية بناءً على اسم مستخدم Discourse. لقد مر وقت طويل منذ أن نظرت في الكود المتعلق، لكنني أعتقد أن حقل Discourse Username يتم ملؤه تلقائيًا إذا تم استخدام موقع WordPress كموفر SSO لـ Discourse وتم تمكين خيار “إنشاء أو مزامنة مستخدمي Discourse عند تسجيل الدخول” في علامة تبويب خيارات موفر DiscourseConnect على WordPress. يتم أيضًا تعيين حقل Discourse Username تلقائيًا إذا تم استخدام Discourse كموفر SSO لـ WordPress (مع إعداد عميل DiscourseConnect).
من الناحية المثالية، سيتم تعيين حقل Discourse Username دائمًا تلقائيًا عندما يكون WordPress هو موفر SSO لـ Discourse، سواء تم تمكين خيار “إنشاء أو مزامنة مستخدمي Discourse عند تسجيل الدخول” على Discourse أم لا. لا أعتقد أنه يمكن فعل أي شيء للحالة التي لا يتم فيها استخدام DiscourseConnect بين الموقعين، ولكن قد يكون لدى @angus أفكار حول ذلك.
بشكل افتراضي، لا يسمح WordPress للمستخدمين بتغيير أسماء المستخدمين الخاصة بهم، لذلك لم يكن هذا شيئًا تلقينا الكثير من الأسئلة حوله. إذا كنت ترغب في التأكد من مزامنة أسماء المستخدمين بين WordPress و Discourse، فتأكد من تمكين إعداد auth_overrides_username في Discourse. قد ترغب أيضًا في تمكين خيار “إنشاء أو مزامنة مستخدمي Discourse عند تسجيل الدخول” على WordPress. مع تمكين هذا الخيار، سيتم تحديث المستخدمين في Discourse في كل مرة يقومون فيها بتسجيل الدخول إلى موقع WordPress الخاص بك. إذا لم يتم تمكين هذا الخيار، فسيتم تحديث المستخدمين في Discourse فقط عند تسجيل خروجهم من Discourse، ثم تسجيل الدخول مرة أخرى باستخدام DiscourseConnect.
قد يكون موقعنا حالة خاصة بعض الشيء، لأننا لا نريد مزامنة اسم مستخدم ووردبريس مع ديسكورس تحديداً لأن ووردبريس لا يسمح للمستخدمين بتغيير أسماء المستخدمين افتراضياً. ولا نريد تثبيت إضافة تضيف وظيفة تعديل اسم مستخدم ووردبريس هذه بسبب عدم الاستقرار الذي قد تحدثه.
ولكن بما أن أسماء المستخدمين قابلة للتعديل في ديسكورس، أعتقد أنه سيكون من المنطقي توسيع هذه الوظيفة إلى ووردبريس عبر إضافة WP Discourse. يبدو هذا الحقل هو المكان المثالي لذلك، ولكني أتفهم أنه قد يتعارض مع اسم مستخدم ووردبريس نظراً لأنه لن يتغير أبداً افتراضياً. لذا أفترض أن هذا ليس شيئاً تريد منا المساهمة به في الإضافة؟
بالإضافة إلى ذلك، فإن السماح للمستخدمين بتعديل اسم المستخدم الخاص بهم في المنتدى هو مطلب رئيسي بالنسبة لنا. لدينا بالفعل Discourse مُعد للسماح بذلك، ولكن معظم مستخدمينا لا يغيرون اسم مستخدم Discourse الخاص بهم لأنه مخفي ضمن إعدادات Discourse. نريد أن يكون في مكان واضح في صفحة ملفهم الشخصي على موقع Wordpress الخاص بنا، جنبًا إلى جنب مع معلوماتهم الأخرى مثل الاسم والصورة الرمزية وما إلى ذلك.
ولكنها ستكون متطابقة عند التسجيلات الجديدة، حيث أنك تستخدم DiscourseConnect. أفترض أنك موافق على ذلك، وأنك قلق بشأن المزامنة بحد ذاتها (أي بعد إنشاء الحساب)؟
كيف تتصور الحالة التي ينشئ فيها المستخدم حساب ووردبريس ولم يسجل الدخول إلى Discourse بعد؟ لن يكون هناك حساب Discourse موجود. في هذه الحالة، لن يكون حقل اسم مستخدم Discourse قابلاً للتحرير؟
لاحظ أن خطاف الويب “تحديث بيانات المستخدم” (انظر “خطافات الويب” في إعدادات WP Discourse) سيقوم بتحديث اسم مستخدم Discourse في ووردبريس عند تغييره في Discourse. هذا هو أحد أجزاء المزامنة ثنائية الاتجاه التي تتصورها.
إذًا، هل ما تريده تحديدًا هو أن يقوم المكون الإضافي WP Discourse بتحديث اسم مستخدم Discourse للمستخدم عند تغييره، نعم؟
الآن، يستخدم هذا الحقل من قبل أشخاص مختلفين لأغراض مختلفة. يرغب بعض الأشخاص في أن يكونوا قادرين على تحرير هذا الحقل دون تحديث اسم مستخدم مستخدم Discourse المرتبط بالحساب الذي يستخدمونه مع DiscourseConnect.
ومع ذلك، هناك حل بسيط نسبيًا. يمكننا فقط إضافة action في مكان ما حول هنا حتى تتمكن من استخدام طلب PUT إلى Discourse لتحديث اسم المستخدم على Discourse، أي كما تفعل الآن. سأضيف فقط أن الطريقة السهلة للقيام بذلك هي استخدام طريقة discourse_request المجردة في أدوات المكون الإضافي WP، أي
use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;
$path = ''
$args = array(
);
$response = DiscourseUtilities::discourse_request( $path, $args );
باستخدام كل من خطاف الويب ودالة رد النداء للإجراء، سيكون لديك مزامنة ثنائية الاتجاه بالطريقة التي تتصورها، بافتراض أنك قد أخذت في الاعتبار السؤالين اللذين طرحتهما أعلاه.
يسعدني مراجعة ودمج طلب سحب (PR) مع إجراء إضافي في هذا الاتجاه.
نحن في الواقع نتجاوز هذا السلوك باستخدام خطاف التصفية wpdc_sso_params لأن نظام تسجيل الدخول الأحادي الخاص بنا يدمج Firebase واسم مستخدم WP الافتراضي للجميع هو معرف Firebase الخاص بهم، لذلك نقوم بتغيير افتراضي Discourse إلى memberXXX (مع XXX كرقم). نريد في الواقع تغيير هذا الافتراضي إلى Firstname_Lastname الخاص بالمستخدم في وقت ما أيضًا. ولكن نعم، قلقنا الأساسي هو قدرة المستخدمين على تغيير اسم المستخدم الخاص بهم بسهولة عبر صفحة ملفهم الشخصي داخل موقع Wordpress الخاص بنا.
في هذه الحالة، أعتقد أنه يمكننا إما تخزين حقل اسم المستخدم وجعله يتزامن عند إنشاء الحساب (عبر خطاف التصفية wpdc_sso_params عند أول تسجيل دخول أحادي)، أو يمكننا فرض إنشاء حساب Discourse لكل عضو عند التسجيل في موقع Wordpress الخاص بنا عبر واجهة برمجة تطبيقات Discourse. الخيار الثاني سيكون على الأرجح أكثر فائدة لأننا سنعرف أن الجميع لديهم حساب Discourse وبالتالي سيكون هناك حالات خاصة أقل لبعض المستخدمين الذين لديهم حسابات والبعض الآخر لا. لكننا نسعى حقًا لتجربة سلسة، لذا نريد أن يكون هذا الاسم هو ما يفكر فيه المستخدم كاسم مستخدم لمنصتنا بأكملها. نريد أن يكون قابلاً للتحرير دائمًا، وفي المستقبل ربما نستخدمه لأكثر من مجرد Discourse (أي في لوحات الصدارة، وما إلى ذلك).
نعم، هذا بالضبط ما نحتاجه!
مفهوم! شكراً على هذا التوجيه، سأعمل أنا وفريقي على اختبار هذا مع تطبيقنا أولاً وسنقدم طلب سحب (PR) قريبًا!