لدي ووردبريس مع إعداد Discourse حيث Discourse هو موفر DiscourseConnect لـ WP. أستخدم إضافة WP Discourse وهي تعمل بشكل رائع حتى الآن. المشكلة الوحيدة التي واجهتها حتى الآن هي أنني لا أستطيع عرض صور الأفاتار من Discourse في WP.
أنا لست مطورًا لذا أنا أخمن هنا، ولكن على حد فهمي، فإن إضافة Simple Local Avatar تضيف الصورة عادةً إلى مكتبة الوسائط. لم أتمكن من العثور على الكثير من الوثائق حول كيفية عملها إذا تم توفيرها عبر عنوان URL. الكود الذي أحاول استخدامه يبدو كالتالي:
أعتقد أن سبب الاستثناء هو أن الدالة 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.
ربما يكون كذلك. بما أنني كنت أنظر إليه على أي حال، فقد قررت أن أجرب طريقة لا تستخدم المكون الإضافي 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 );
}