لا يمكنني إضافة مستخدم إلى منتدى Discourse من موقع WordPress عند إضافة المستخدم في نظام الاشتراك

مرحباً، لدي مشكلة في منتدى Discourse وهو https://community.over40connect.com/ والمتصل بموقعي https://over40connect.com/staging/ باستخدام إضافة wp discourse، وقد قمت بإنشاء دالة لإضافة المستخدم إلى مجموعة Discourse عند تغيير دور المستخدم ولكنها لا تضيف هذا المستخدم إلى مجموعة Discourse، إليك الكود

function add_user_to_discourse_group_on_role_change($user_id, $role) {
    // تحقق مما إذا كان تغيير الدور ذا صلة بحالتك
    // على سبيل المثال، قد ترغب في تشغيل هذا فقط إذا كان الدور الجديد هو 's2member_level1'
    //if ($role === 's2member_level1') {
    // قم بإعداد نقطة نهاية Discourse API
    $discourse_endpoint = 'https://community.over40connect.com/groups/2/members.json';

    // قم بإعداد البيانات المراد إرسالها
    $data = array(
        'usernames' => array('haseebdeveloper'), // اسم مستخدم مستخدم WordPress المراد إضافته
    );

    // قم بإجراء طلب API
    $response = wp_remote_post($discourse_endpoint, array(
        'method' => 'POST',
        'timeout' => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'blocking' => true,
        'headers' => array(
            'Content-Type' => 'application/json',
            'Api-Key' => 'REDACTED', // أضف مفتاح Discourse API الخاص بك هنا
        ),
        'body' => json_encode($data),
        'cookies' => array(),
    ));

    // تحقق من الأخطاء وتعامل مع الاستجابة
    if (!is_wp_error($response)) {
        $response_code = wp_remote_retrieve_response_code($response);

        if ($response_code === 200) {
            $response_body = wp_remote_retrieve_body($response);
            error_log('Discourse API Response: ' . $response_body); // سجل الاستجابة
            // تعامل مع الاستجابة حسب الحاجة
        } else {
            error_log('Discourse API Error: Unexpected response code - ' . $response_code); // سجل الخطأ
            // تعامل مع الخطأ
        }
    } else {
        $error_message = $response->get_error_message();
        error_log('Discourse API Error: ' . $error_message); // سجل الخطأ
        // تعامل مع الخطأ
    }
    //}
}
إعجاب واحد (1)

لقد قمت بإزالة ما بدا وكأنه مفتاح API فعلي من مقتطف التعليمات البرمجية الخاص بك يا @Haseeb_Ahmed. قد ترغب في إبطال هذا المفتاح وإنشاء مفتاح جديد. :+1:

4 إعجابات

من خلال زيارة موقعك، أعتقد أن موقع WordPress الخاص بك يعمل كموفر مصادقة DiscourseConnect لموقع Discourse الخاص بك. إذا كان هذا صحيحًا، يمكنك استخدام الدالة المساعدة add_user_to_discourse_group لإضافة مستخدمي WordPress إلى مجموعات Discourse: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L278-L326. التفاصيل حول استخدام الدالة موجودة هنا:

لاحظ عبارة use في أعلى مثال الكود:

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

وكيف يتم استخدام ذلك بعد ذلك لاستدعاء الدالة (الثابتة):

$result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_name );
3 إعجابات

مرحباً @simon، لقد استخدمت هذا الكود فقط الآن

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {


   $group_names = array("volunteers", "moderators");
   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names );


}

لكنه لا يزال لا يضيف المستخدم إلى مجموعة discourse عند تغيير دور المستخدم.

أعتقد أنه من المفترض أن يكون هذا سلسلة مفصولة بفواصل، وليس مصفوفة:

إعجابَين (2)

@Firepup650 على حق. يجب تعيين المعلمة group_names إلى سلسلة نصية. إذا كنت تضيف مستخدمين إلى مجموعات متعددة، فافصل أسماء المجموعات بفاصلة (بدون مسافة بعد الفاصلة).

$group_names = "volunteers,moderators";

إذا لم يكن يعمل، أو حتى لو كان يعمل، حاول تسجيل قيمة $result لمعرفة ما يتم إرجاعه.

3 إعجابات

مرحباً @Firepup650 شكراً لك على مساعدتك، إليك الكود الخاص بي الآن

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {

  
   $group_names = array("volunteers", "moderators");
	$group_names_string = implode(",", $group_names);

   $result = DiscourseUtilities::add_user_to_discourse_group( $user_id, $group_names_string );

    
}

يقوم بإضافة المستخدم إلى مجموعة المتطوعين ولكن ليس إلى مجموعة المشرفين، هل يمكنك إخباري ما هي المشكلة؟

إعجاب واحد (1)

لا يمكنك إضافة مستخدمين إلى مجموعات “المشرفين” أو “المسؤولين” أو “الموظفين” باستخدام استدعاء الوظيفة هذا. من الناحية الفنية، لا يمكنك إضافة مستخدمين إلى أي مجموعات “تلقائية” بهذا النهج. يمكنك فقط إضافة مستخدمين إلى مجموعات مخصصة قمت بإنشائها.

تعديل: إذا كنت بحاجة إلى إضافة مستخدمين إلى مجموعة المشرفين، فراجع الوظيفة sync_sso_record: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L70-L81. الوظيفة add_user_to_discourse_group هي مجرد غلاف ملائم حول sync_sso_record.

moderator (boolean) هو وسيط مقبول لمعلمات SSO: discourse/lib/discourse_connect_base.rb at 5098338a9649ee8830c8a0781e0eb538e8206eac · discourse/discourse · GitHub. يمكنك أيضًا إضافة أي مجموعات مخصصة تريد إضافة مستخدمين إليها باستخدام المعلمة add_groups. سيسمح لك ذلك بإضافة مستخدم إلى مجموعة “المشرفين” ومجموعة “أعضاء المتطوعين” باستدعاء API واحد.

تعديل 2: إذا جربت نهج الوظيفة sync_sso_record، فقد تحتاج إلى استخدام السلسلة النصية "true" بدلاً من القيمة المنطقية true للمعلمة moderator. يفسر PHP true على أنها 1. أعتقد أن Discourse يقبل السلسلة النصية "true" للتعامل مع هذه الحالة. لاحظ أنه يمكنك استخدام الوظيفة get_sso_params لتعيين معلمات SSO: https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php#L129. يوجد مثال لكيفية القيام بذلك في رمز الوظيفة add_user_to_discourse_group.

3 إعجابات

مرحباً @simon، هل يمكنك من فضلك أن تعطيني مثالاً مع رمز لكيفية إضافة مستخدم إلى مجموعة المشرفين؟

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

function add_user_to_discourse_group_on_role_change( $user_id, $role ) {
	$sso_params = array(
		'external_id'   => $user_id,
		'moderator'     => 'true', // يجب تعيين القيم المنطقية 'true' و 'false' كسلاسل نصية!
		'add_groups'    => 'volunteers' // قائمة مفصولة بفواصل، بدون مسافات بعد الفواصل
	);
    DiscourseUtilities::sync_sso_record( $sso_params );
}
إعجاب واحد (1)

مرحباً @simon، أواجه مشكلة. هذا هو الكود الذي أستخدمه عند تغيير دور المستخدم.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

// Hook to execute when a user role changes
add_action('set_user_role', 'add_user_to_discourse_group_on_role_change', 10, 2);

function add_user_to_discourse_group_on_role_change($user_id, $role) {
// 	var_dump($role);
// 	die();
	  if ($role == 's2member_level1') {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
// 		  	$group_names = array("haseeb-group", "moderators");
// 			$s2member_level_1_groups = implode(",", $group_names);
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
// 		  var_dump($result);
// 		  die();
		  	
// 			var_dump($result);
		}
		else if($role == 's2member_level2'){
			   $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
		}
		
		else if($role == 's2member_level3'){
			   $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
		}
	
		
		else if($role == 's2member_level4'){
			   $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
			  $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
		}
		
		else {
    // Collect all level groups
    $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
    $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
    $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
    $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

    // Combine all groups into one array
    $s2member_level_groups = array_merge(
        explode(',', $s2member_level_1_groups),
        explode(',', $s2member_level_2_groups),
        explode(',', $s2member_level_3_groups),
        explode(',', $s2member_level_4_groups)
    );

    // Remove duplicates
    $s2member_level_groups = array_unique($s2member_level_groups);

    // Remove user from all collected groups
    foreach ($s2member_level_groups as $group) {
        $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
        // You may handle $result as needed
    }
}


    
}

الغرض من الكود هو إضافة أو إزالة مستخدم بناءً على شرط، ولكن في أي حالة أو أي شرط، فإنه يرسل إشعارًا إلى مسؤولي المنتدى بأنه يجب الموافقة على المستخدم أو رفضه أو حذفه. لماذا يحدث هذا في أي حالة؟ في حالة الـ else، أريد فقط إزالة المستخدم من مجموعة معينة، ولكن في تلك الحالة، لا يزال يتم إرسال إشعار المراجعة للمستخدم الجديد إلى المسؤول.

شيء آخر: عندما يسجل المستخدم في موقع ووردبريس، يتم إضافته تلقائيًا إلى هذه المجموعات trust_level_0 و trust_level_1، ولا أعرف السبب.

من فضلك ساعدني، يمكنني أيضًا مشاركة خطاف تسجيل المستخدم معك.

هذا بسبب أن هذه مجموعات Discourse أساسية، تُستخدم لإدارة الأذونات وما شابه.

هذا بسبب أن لديك الإعداد الذي يتطلب موافقة جميع المستخدمين الجدد من قبل الموظفين، كما ذكرت لقطة الشاشة الخاصة بك:

image

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

إعجاب واحد (1)

لإضافة ما كتبه @Firepup650، عندما يستدعي الكود الخاص بك

DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);

فإنه يستدعي دالة مساعدة تقوم بطلب إلى مسار Discourse sync_sso: Sync DiscourseConnect user data with the sync_sso route. يُستخدم هذا الطلب لتحديث مستخدم موجود، أو لإنشاء مستخدمين جدد. إذا لم يسجل المستخدم الذي يحمل $user_id الدخول إلى موقع Discourse الخاص بك مطلقًا، فسيتم إنشاء مستخدم جديد. يجب إضافته إلى المجموعات دون أي مشكلة، ولكنه سيؤدي إلى إنشاء إشعار للمشرفين لأن موقعك قد قام بتمكين إعداد الموقع must approve users (يجب الموافقة على المستخدمين):

إعجاب واحد (1)

مرحباً @simon، أواجه مشكلة مرة أخرى

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

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // تم التعديل لقبول وسيط واحد فقط

function user_registered_callback($user_id) {
    // الحصول على بيانات المستخدم بناءً على معرف المستخدم
    $user_data = get_userdata($user_id);

    // التحقق مما إذا كانت بيانات المستخدم موجودة
    if ($user_data) {
        // الحصول على أدوار المستخدم
        $roles = $user_data->roles;

        // التحقق مما إذا كان المستخدم لديه دور s2Member
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);

            // الحصول على الحقول المخصصة
            $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
            // إعداد مصفوفة معلمات SSO
            $sso_params_array = [];
            $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

            $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array, $user_id);
			var_dump($fields_updated);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // جمع كل مجموعات المستويات
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // دمج جميع المجموعات في مصفوفة واحدة
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // إزالة التكرارات
            $s2member_level_groups = array_unique($s2member_level_groups);

            // إزالة المستخدم من جميع المجموعات المجمعة
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // يمكنك التعامل مع $result حسب الحاجة
            }
        }
    } else {
        // التعامل مع الحالات التي لا تتوفر فيها بيانات المستخدم
        // تسجيل رسالة أو التعامل بشكل مختلف بناءً على متطلباتك
        error_log("User data not available in user_registered_callback.");
    }
}

الآن يمكنك التحقق من هذا الكود

  $sso_params_array = [
				'external_id' => $user_id,
                'custom.user_interests' => $custom_fields['user_interests'],
                'custom.user_age' => $custom_fields['user_age'],
                'custom.user_gender' => $custom_fields['user_gender'],
                'custom.user_sexual' => $custom_fields['user_sexual'],
                'custom.user_facebook' => $custom_fields['user_facebook'],
                'custom.user_linkedin' => $custom_fields['user_linkedin'],
                'custom.users_reasons' => $custom_fields['users_reasons']
            ];

عندما أقوم بتشغيل var_dump($fields_updated)، فإنه يعطي “true” ولكنه لا يضيف البيانات إلى ملف تعريف المستخدم على Discourse، ما هي المشكلة؟

ما لم يتغير شيء ما، تحتاج إلى استخدام النهج الموضح هنا: Map custom User Fields - #7 by simon.

أولاً، تأكد من أن الحقول المخصصة موجودة بالفعل في Discourse. بعد ذلك، في صفحة /admin/customize/user_fields الخاصة بموقع Discourse الخاص بك، أضف .json إلى عنوان URL حتى تتمكن من رؤية JSON الخاص بالحقل. على سبيل المثال http://localhost:4200/admin/customize/user_fields.json.

استخدم قيم id من JSON لتعيين مفاتيح SSO التي تبدو كالتالي: custom.user_field_<field_id>. على سبيل المثال custom.user_field_1

لا يمكنني اختبار هذا الآن. أخبرني إذا نجح هذا. إذا لم يتم القيام به بالفعل، فيجب توثيقه في موضوع خاص به.

مرحباً @simon لقد استخدمت نهجك الذي ذكرته وهنا الكود الخاص بي الآن

add_action( 'user_register', 'user_registered_callback', 10, 1 ); // تم التعديل لقبول وسيط واحد فقط

function user_registered_callback($user_id) {
    // الحصول على بيانات المستخدم بناءً على معرف المستخدم
    $user_data = get_userdata($user_id);
// 	$user = get_user_by( 'ID', $user_id );
    // التحقق مما إذا كانت بيانات المستخدم موجودة
    if ($user_data) {
        // الحصول على أدوار المستخدم
        $roles = $user_data->roles;

        // التحقق مما إذا كان المستخدم لديه دور s2Member
        if (in_array('s2member_level1', $roles)) {
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_1_groups);
			 $sso_params = array();
//             // الحصول على الحقول المخصصة
//             $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user_id);
//             // إعداد مصفوفة معلمات SSO
//             $sso_params_array = [];
//             $sso_params_array = [
// 				'external_id' => $user_id,
//                 'custom.user_field_1' => $custom_fields['user_interests'],
//                 'custom.user_field_2' => $custom_fields['user_age'],
//                 'custom.user_field_3' => $custom_fields['user_gender'],
//                 'custom.user_field_4' => $custom_fields['user_sexual'],
//                 'custom.user_field_5' => $custom_fields['users_reasons']
//             ];

//             $fields_updated = DiscourseUtilities::sync_sso_record($sso_params_array);
			 $sso_params = apply_filters( 'wpdc_sso_params', $sso_params, $user_data );
			var_dump($sso_params);
			die();
        } elseif (in_array('s2member_level2', $roles)) {
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_2_groups);
        } elseif (in_array('s2member_level3', $roles)) {
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_3_groups);
        } elseif (in_array('s2member_level4', $roles)) {
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');
            $result = DiscourseUtilities::add_user_to_discourse_group($user_id, $s2member_level_4_groups);
        } else {
            // جمع كل مجموعات المستويات
            $s2member_level_1_groups = get_option('s2member_level_1_groups', '');
            $s2member_level_2_groups = get_option('s2member_level_2_groups', '');
            $s2member_level_3_groups = get_option('s2member_level_3_groups', '');
            $s2member_level_4_groups = get_option('s2member_level_4_groups', '');

            // دمج جميع المجموعات في مصفوفة واحدة
            $s2member_level_groups = array_merge(
                explode(',', $s2member_level_1_groups),
                explode(',', $s2member_level_2_groups),
                explode(',', $s2member_level_3_groups),
                explode(',', $s2member_level_4_groups)
            );

            // إزالة التكرارات
            $s2member_level_groups = array_unique($s2member_level_groups);

            // إزالة المستخدم من جميع المجموعات المجمعة
            foreach ($s2member_level_groups as $group) {
                $result = DiscourseUtilities::remove_user_from_discourse_group($user_id, $group);
                // يمكنك التعامل مع $result حسب الحاجة
            }
        }
    } else {
        // معالجة الحالات التي لا تتوفر فيها بيانات المستخدم
        // تسجيل رسالة أو معالجتها بشكل مختلف بناءً على متطلباتك
        error_log("بيانات المستخدم غير متوفرة في user_registered_callback.");
    }
}




add_filter( 'wpdc_sso_params', 'my_namespace_set_discourse_custom_field', 10, 2 );

function my_namespace_set_discourse_custom_field( $sso_params, $user ) {
    $custom_fields = get_user_option('1709753088_wp_s2member_custom_fields', $user->ID);
	
    // التحقق مما إذا كانت $custom_fields مصفوفة وليست فارغة
    if (is_array($custom_fields) && !empty($custom_fields)) {
        // تعيين الحقول المخصصة للمفاتيح المقابلة في معلمات SSO
        $sso_params['custom.user_field_1'] = $custom_fields['user_interests'];
        $sso_params['custom.user_field_2'] = $custom_fields['user_age'];
        $sso_params['custom.user_field_3'] = $custom_fields['user_gender'];
        $sso_params['custom.user_field_4'] = $custom_fields['user_sexual'];
        $sso_params['custom.user_field_5'] = $custom_fields['users_reasons'];
    } else {
        // تسجيل رسالة خطأ أو عرضها إذا لم تكن بيانات الحقول المخصصة بالتنسيق المتوقع
        error_log('بيانات الحقول المخصصة ليست بالتنسيق المتوقع.');
    }

    // إرجاع معلمات SSO المعدلة
    return $sso_params;
}

المشكلة الوحيدة الآن هي أنه لا يضيف users_reasons إلى custom.user_field_5 ويضيف بيانات أخرى إلى ملف تعريف المستخدم على سبيل المثال إذا علقت هذا السطر $sso_params['custom.user_field_5'] = $custom_fields['users_reasons']; فإنه يضيف بيانات الحقول الأخرى إلى مستخدم Discourse وإذا لم أعلق هذا السطر فلن تتم إضافة أي بيانات إلى ملف تعريف المستخدم على Discourse الآن أحتاج إلى القول إن حقل users_reasons على كل من موقع Discourse وموقع WordPress هو حقل اختيار متعدد فهل يمكن أن يكون هذا هو السبب؟ يرجى إخباري.

نعم، المشكلة هي أنه حقل متعدد الاختيارات. لست متأكدًا مما إذا كان هذا مدعومًا بعد: Add support for multi-select fields in DiscourseConnect protocol.

ربما هناك طريقة لجعله يعمل الآن، لكنني لا أرى كيف أفعل ذلك. الكود الخاص بـ Discourse الذي يتم استدعاؤه موجود هنا: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub

مرحباً @simon، هل يمكنك من فضلك كتابة مثال برمجي وفقًا لرمزي مع المرجع الذي قدمته؟

لا أعتقد أن هذا ممكن. على حد علمي، تم تغيير الكود الخاص بتعيين الحقول المخصصة من حمولة SSO قليلاً منذ وقت كتابة المنشور الذي أشرت إليه، ولكنه لم يتغير بطريقة تسمح بتحديث الحقول متعددة الاختيارات من حمولة SSO.

من الناحية المثالية، سيتعامل Discourse مع الحالة بطريقة مشابهة لكيفية تعامله مع حقل SSO add_groups: discourse/app/models/discourse_connect.rb at main · discourse/discourse · GitHub. لكي يعمل ذلك، سيحتاج كود Discourse SSO إلى معرفة ما إذا كان حقل مخصص معين هو حقل متعدد الاختيارات. لا أعتقد أن الكود لديه تلك المعلومات الآن.

مرة أخرى، قد تكون هناك طريقة للقيام بذلك الآن، ولكنها تتجاوز قدراتي.

مرحباً @simon، أرغب في مزامنة صور المستخدمين بين ووردبريس و discourse، حيث أنني أستخدم بالفعل إضافة wp discourse لـ sso، وأريد الآن عندما يغير المستخدم صورته على موقع discourse، أن تتغير أيضاً على موقع ووردبريس. كيف يمكن تحقيق ذلك، وأنا أرغب في استخدام إضافة واحدة لصور المستخدمين على موقع ووردبريس، وهذا هو الكود الذي أستخدمه:

function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
		$avatar_url = $query['avatar_url'];
		$user_id = $updated_user->ID;
		// يسمح لنا باستخدام وظائف download_url() و wp_handle_sideload()
	require_once( ABSPATH . 'wp-admin/includes/file.php' );

	// تنزيل إلى مجلد مؤقت
	$temp_file = download_url( $avatar_url );

	if( is_wp_error( $temp_file ) ) {
		return false;
	}

	// نقل الملف المؤقت إلى مجلد التحميلات
	$file = array(
		'name'     => basename( $image_url ),
		'type'     => mime_content_type( $temp_file ),
		'tmp_name' => $temp_file,
		'size'     => filesize( $temp_file ),
	);
	$sideload = wp_handle_sideload(
		$file,
		array(
			'test_form'   => false // لا حاجة للتحقق من المعلمة 'action'
		)
	);

	if( ! empty( $sideload[ 'error' ] ) ) {
		// يمكنك إرجاع رسالة خطأ إذا أردت
		return false;
	}

	// حان الوقت لإضافة صورتنا المحملة إلى مكتبة وسائط ووردبريس
	$attachment_id = wp_insert_attachment(
		array(
			'guid'           => $sideload[ 'url' ],
			'post_mime_type' => $sideload[ 'type' ],
			'post_title'     => basename( $sideload[ 'file' ] ),
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sideload[ 'file' ]
	);

	if( is_wp_error( $attachment_id ) || ! $attachment_id ) {
		return false;
	}

	// تحديث البيانات الوصفية، وإعادة إنشاء أحجام الصور
	require_once( ABSPATH . 'wp-admin/includes/image.php' );

	wp_update_attachment_metadata(
		$attachment_id,
		wp_generate_attachment_metadata( $attachment_id, $sideload[ 'file' ] )
	);

	// إرجاع معرف المرفق
	update_user_meta($user_id, '1709753088_wp_user_avatar', $attachment_id);
	update_user_meta($user_id, 'wp_user_avatar', $attachment_id);
}

كما ترى، أرغب في تحديث مفاتيح بيانات المستخدم باستخدام معرف المرفق، ولكن معرف المرفق لا يتم إنشاؤه.

أتطلع إلى ردك.

شكراً لك.