صور رمزية من Discourse عندما يكون Discourse هو موفر SSO

لدي ووردبريس مع إعداد Discourse حيث Discourse هو موفر DiscourseConnect لـ WP. أستخدم إضافة WP Discourse وهي تعمل بشكل رائع حتى الآن. المشكلة الوحيدة التي واجهتها حتى الآن هي أنني لا أستطيع عرض صور الأفاتار من Discourse في WP.

لقد حاولت تطبيق الحل في Could you update user avatar for wordpress plugin sso? - #2 by angus - إضافة الكود إلى ملف function.php الخاص بموقع WP الخاص بي. لكنه لا يعمل معي - لا أعرف ما هو الكود الذي يجب إضافته لتعيين الأفاتار.

أتساءل عما إذا كان أي شخص قد نجح في ذلك؟ أنا أستخدم إضافة Simple Local Avatar، ولكني على استعداد لتغييرها إذا نجح أي شخص مع إضافة أخرى.

مرحباً @uffehe

ما هو الكود الذي تضيفه وكيف تقوم إضافة Simple Local Avatar بحفظ الصور الرمزية؟

مرحباً @angus

أنا لست مطورًا لذا أنا أخمن هنا، ولكن على حد فهمي، فإن إضافة Simple Local Avatar تضيف الصورة عادةً إلى مكتبة الوسائط. لم أتمكن من العثور على الكثير من الوثائق حول كيفية عملها إذا تم توفيرها عبر عنوان URL. الكود الذي أحاول استخدامه يبدو كالتالي:

add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
    if (isset($query['avatar_url'])) {
        $new_avatar_url = $query['avatar_url'];

        $avatar_data = array(
            'full' => $new_avatar_url,  // URL للصورة الرمزية الجديدة
        );
        update_user_meta($updated_user, 'simple_local_avatar', $avatar_data);
    }
}

هذا يعطيني استثناءً غير معالج عند محاولة تسجيل الدخول باستخدام SSO.

يمكنني توظيف مطور للمساعدة، ولكن يبدو أن هذه حالة استخدام شائعة جدًا قد يكون الآخرون قد قاموا بتطبيقها بالفعل - حتى لو لم يكن ذلك مع هذه الإضافة.

أعتقد أن سبب الاستثناء هو أن الدالة my_wpdc_sso_client_updated_user الخاصة بك لا تُرجع مصفوفة $updated_user. هذه المصفوفة مطلوبة للدالة التي تضيف عامل تصفية wpdc_sso_client_updated_user للاستمرار.

تحتاج أيضًا إلى تعيين معرف مستخدم WordPress الخاص بالمستخدم في استدعاء update_user_meta.

هذا يعمل، ولكنه يعطل وظيفة تغيير حجم الصور الخاصة بمكون Simple Local Avatars الإضافي:

add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ); // منع تغيير حجم الصور الرمزية
add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
	if ( isset( $query['avatar_url'] ) ) {
		$new_avatar_url = $query['avatar_url'];
		$wp_user_id = $updated_user['ID'];

		$avatar_data = array(
			'full' => $new_avatar_url,  // عنوان URL لصورة الرمزية الجديدة
		);
		update_user_meta( $wp_user_id, 'simple_local_avatar', $avatar_data );
	}

	return $updated_user;
}

السبب وراء منع تغيير حجم الصور الرمزية هو أن تغيير الحجم يتم باستخدام كود محرر صور WordPress. لكي يعمل، يجب تنزيل الصورة إلى WordPress. لاحظ أنه إذا حذفت سطر add_filter( 'simple_local_avatars_dynamic_resize', '__return_false' ) من الكود أعلاه، فسيحاول مكون Simple Local Avatars الإضافي تغيير حجم الصور، وسيطرح تحذير PHP، ثم يستخدم الصورة بالحجم الكامل - لذلك لن يبدو أن هناك أي شيء مكسور من وجهة نظر المستخدم.

أنا غير متأكد إلى حد ما بشأن دمج استخدام صور Discourse الرمزية مع مكون Simple Local Avatars الإضافي. المشكلة التي أراها هي أن المكون يمنح المستخدمين خيار تحميل صورة رمزية مخصصة على WordPress. إذا فعلوا ذلك، ثم قاموا بتسجيل الدخول مرة أخرى إلى WordPress من Discourse، فقد يتساءلون عما حدث للصورة الرمزية التي قاموا بتحميلها. سيكون تطويره أكثر تعقيدًا، ولكنه قد يكون من الأفضل إضافة القدرة على تعيين صورة Discourse الرمزية الخاصة بك عمدًا كصورة WordPress الرمزية الخاصة بك في صفحة ملف تعريف مستخدم WordPress.

إعجابَين (2)

ربما يكون كذلك. بما أنني كنت أنظر إليه على أي حال، فقد قررت أن أجرب طريقة لا تستخدم المكون الإضافي Simple Local Avatars.
يتصل الكود أدناه بمرشح 'wpdc_sso_client_updated_user' الذي يتم استدعاؤه عند تسجيل دخول مستخدم إلى ووردبريس عبر Discourse. إذا قام المستخدم بتحميل صورة رمزية مخصصة إلى Discourse، فسيتم حفظ قالب الصورة الرمزية المخصصة الخاص بـ Discourse (custom_avatar_template) كبيانات وصفية للمستخدم على ووردبريس. ثم يتصل بمرشح ووردبريس 'get_avatar_url' ويستخدم قالب الصورة الرمزية المخصصة الخاص بـ Discourse لتعيين عنوان URL للصورة الرمزية. تعجبني هذه الطريقة لأنها تستفيد من وظيفة تغيير حجم القالب في Discourse.
لاحظ أنني اختبرت هذا محليًا فقط.

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;
add_filter( 'wpdc_sso_client_updated_user', 'my_wpdc_sso_client_updated_user', 10, 2 );
function my_wpdc_sso_client_updated_user( $updated_user, $query ) {
	$options  = DiscourseUtilities::get_options();
	$base_url = $options['url'];
	$discourse_username    = $query['username'];
	$discourse_profile_url = "{$base_url}/u/{$discourse_username}.json";
	$wp_user_id             = $updated_user['ID'];
	$profile_data           = DiscourseUtilities::discourse_request( $discourse_profile_url );
	if ( is_wp_error( $profile_data ) ) {

		return $updated_user;
	}

    // Check to see if the user has a template for an uploaded avatar on Discourse.
	$user_data = $profile_data->user;
	if ( ! property_exists( $user_data, 'custom_avatar_template' ) ) {

		return $updated_user;
	}

	$custom_avatar_template_path = $profile_data->user->custom_avatar_template;
    $custom_avatar_template = "{$base_url}{$custom_avatar_template_path}";
    // Save the avatar template. The size to display gets substituted in the `get_avatar_url` filter.
    update_user_meta( $wp_user_id, 'discourse_avatar_template', $custom_avatar_template );

    return $updated_user;
}

add_filter('get_avatar_url', 'my_get_avatar_url', 10, 3 );
function my_get_avatar_url($url, $id_or_email, $args ) {
    // Start with $user_id set to `null`. The code below may miss some cases.
    $user_id = null;
    if ( is_numeric( $id_or_email ) ) {
        $user_id = $id_or_email;
    } elseif ( $id_or_email instanceof WP_User ) {
        $user_id = $id_or_email->ID;
    } elseif ( $id_or_email instanceof WP_Post ) {
        $user_id = $id_or_email->user_id;
    } elseif ( $id_or_email instanceof WP_Comment ) {
        $user_id = $id_or_email->user_id;
    }

    // If $user_id hasn't been set, return the $url parameter.
    if ( empty( $user_id ) ) {

        return $url;
    }

    $discourse_avatar_template = get_user_meta( $user_id, 'discourse_avatar_template', true );
    // If the template metadata hasn't been set, return $url.
    if (empty( $discourse_avatar_template ) ) {

        return $url;
    }

    $size = isset( $args['size']) ? $args['size'] : 128;  // I'm not sure if 'size' could ever be empty. 128 seems like a safe fallback.

    return str_replace( '{size}', $size, $discourse_avatar_template );
}
3 إعجابات

مرحباً @simon

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

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.