WP Discourse SSO لا يزامن الصور الرمزية المحلية المقدمة من Advanced Site Enhancements

مرحباً،

أستخدم:

  • ووردبريس (WordPress)
  • WP Discourse (أحدث إصدار)
  • Advanced Site Enhancements (ASE)، باستخدام ميزة “Local User Avatar” (بدون Gravatar)

يتم عرض الصورة الرمزية بشكل صحيح في كل مكان في ووردبريس.

تخزن ASE معرف المرفق في حقل بيانات المستخدم:

local_user_avatar_attachment_id

ومع ذلك، أثناء تسجيل الدخول عبر SSO في ووردبريس، يستورد Discourse دائماً الصورة الرمزية الافتراضية بدلاً من الصورة الرمزية المحلية.

لقد حاولت بالفعل استخدام فلتر wpdc_sso_avatar_url لإرجاع عنوان URL من مكتبة الوسائط، لكنه لم يحدث أي فرق.

لذلك لدي سؤالان:

  1. هل لا يزال WP Discourse يستخدم wpdc_sso_avatar_url لمزامنة الصور الرمزية؟
  2. أي دالة أو فلتر مسؤول حالياً عن تحديد عنوان URL للصورة الرمزية المرسل إلى Discourse؟

أي توجيه سيكون موضع تقدير.

مرحباً @miednr، نعم، لا يزال wpdc_sso_avatar_url مستخدماً لمزامنة الصورة الرمزية. دعنا نرى إذا كان بإمكاننا جعله يعمل لك.

  1. هل قمت بتمكين خيار “إجبار تحديث الصورة الرمزية” في إعدادات مزود DiscourseConnect؟
  2. يرجى مشاركة الدالة التي تستخدمها مع wpdc_sso_avatar_url

مرحباً @angus !

شكراً لك على انتباهك لهذه المسألة. نعم، لقد قمت بتمكين خيار “إجبار تحديث الأفاتار”.

دالتي في الوقت الحالي هي:



<?php
add_filter( 'get_avatar_url', function( $url, $id_or_email, $args ) {
    $user = false;
    if ( is_numeric( $id_or_email ) ) {
        $user = get_user_by( 'id', (int) $id_or_email );
    } elseif ( $id_or_email instanceof WP_User ) {
        $user = $id_or_email;
    }
    if ( ! $user ) {
        return $url;
    }
    $avatar_id = get_user_meta( $user->ID, 'local_user_avatar_attachment_id', true );
    if ( ! $avatar_id ) {
        return $url;
    }
    $local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );
    return $local_avatar_url ?: $url;
}, 10, 3 );

لقد قمت بتغييرها عدة مرات لجعلها تعمل. لكن، أعتقد أنني كان لدي نسخة أفضل من قبل. :wink:

سيكون رائعاً إذا تمكنا من العثور على نسخة تعمل.

هل ربما شاركت المقطع الخاطئ؟ هذا الكود يستخدم فلتر get_avatar_url. كما لاحظت، الفلتر هو wpdc_sso_avatar_url.

مرحباً @angus

أعربت عن نهج مختلف، حاولت تجربته. آسف. هذا هو أفضل مقتطف يمكنني مشاركته:

add_filter( 'wpdc_sso_avatar_url', function( $avatar_url, $user_id ) {

$avatar_id = get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );

if ( ! $avatar_id ) {
    return $avatar_url;
}

$local_avatar_url = wp_get_attachment_image_url( (int) $avatar_id, 'full' );

if ( ! $local_avatar_url ) {
    return $avatar_url;
}

return esc_url_raw( $local_avatar_url );

}, 10, 2 );

جربت هذا المقتطف. يقوم ASE بتخزين معرف مرفق الصورة الرمزية المحلي في حقل بيانات المستخدم local_user_avatar_attachment_id. يوجد معرف المرفق ويشير إلى صورة في مكتبة الوسائط. ومع ذلك، يستورد Discourse الصورة الرمزية الافتراضية بعد تسجيل الدخول إلى WordPress/مزامنة SSO.

حاولت أيضاً اتباع النهج نفسه باستخدام حجم الصورة thumbnail بدلاً من full، لكن النتيجة كانت نفسها.

شكراً لك على الاطلاع!

مرحباً @angus،

لقد تلقيت ردًا من مطور إضافة ASE (Advanced Site Enhancements) قد يساعد في تحديد المشكلة.

وفقًا لهم:

  • تربط ASE نفسها بواجهات برمجة التطبيقات (APIs) القياسية لصور الرموز (Avatars) في ووردبريس:

  • get_avatar (الأولوية 5)

  • get_avatar_url (الأولوية 10)

  • get_avatar_data (الأولوية 10)

  • لا توجد حاليًا مشاكل توافق معروفة مع الإضافات الأخرى.

  • يتم تخزين صورة الرمز المحلية في مكتبة الوسائط، ويتم حفظ معرف المرفق (Attachment ID) في حقل بيانات المستخدم:

local_user_avatar_attachment_id

كما اقترحوا استرداد رابط صورة الرمز يدويًا على النحو التالي:

$attachment_id = (int) get_user_meta( $user_id, 'local_user_avatar_attachment_id', true );

if ( $attachment_id ) {

$avatar_url = wp_get_attachment_image_url( $attachment_id, array( 128, 128 ) );

}

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

نظرًا لأن ASE تدعي أنها تربط نفسها بـ get_avatar_url()، كنت أتساءل:

  • هل يقوم WP Discourse باستدعاء get_avatar_url() قبل أو بعد تطبيق فلتر wpdc_sso_avatar_url؟

  • هل هناك أي شيء محدد يتعلق برابط صورة الرمز (الحجم، إمكانية الوصول، التوقيت، إلخ) الذي تتوقعه Discourse أثناء مزامنة صورة الرمز؟

سأكون سعيدًا بإجراء أي اختبارات إضافية أو إضافة تصحيح مؤقت (Debugging) إذا كان ذلك سيساعد.

شكرًا مجددًا على مساعدتك!

هل قمت بتفعيل إعداد الموقع discourse_connect_overrides_avatar في Discourse؟

نعم، لقد تم تفعيله.

حسنًا، دعنا نتحقق مما هو موجود في معاملات SSO النهائية. يرجى إضافة هذا الفلتر والتحقق مما يسجله

add_filter( 'wpdc_sso_params', function ( $params ) {
   error_log( "avatar_url: {$params['avatar_url']} force: {$params['avatar_force_update']}" );
   return $params;
});

يتم تحميل المقطع في كل تحميل للصفحة، لكن wpdc_sso_params لا يتم تشغيله أبدًا أثناء تسجيل الخروج/تسجيل الدخول أو أثناء عملية تسجيل الدخول في Discourse.

إذا لم يتم تشغيل هذا الفلتر، فمن المرجح أنك لم تقم بإعداد DiscourseConnect بشكل صحيح، أو أنك لا تستخدم WordPress كموفر لتسجيل الدخول إلى Discourse. يرجى مشاركة ملف meta من WP Discourse > السجلات.

مرحباً @angus

بالطبع، يرجى الاطلاع:

### الخادم ###

WordPress - 7.0

PHP - 8.3.6

MySQL - 8.4.9

### إعدادات WP Discourse (باستثناء المعلومات السرية) ###

connection-logs - 0

display-subcategories - 1

allow-tags - 1

max-tags - 15

publish-as-unlisted - 0

full-post-content - 0

custom-excerpt-length - 100

add-featured-link - 1

auto-publish - 1

force-publish - 1

force-publish-max-age - 0

publish-failure-notice - 1

auto-track - 1

allowed_post_types - post

exclude_tags -

hide-discourse-name-field - 0

discourse-username-editable - 0

direct-db-publication-flags - 0

verbose-publication-logs - 0

enable-discourse-comments - 1

comment-type - display-public-comments-only

ajax-load - 1

load-comment-css - 1

discourse-new-tab - 1

hide-wordpress-comments - 1

show-existing-comments - 0

max-comments - 10

min-replies - 0

min-score - 0

min-trust-level - 0

bypass-trust-level-score - 0

only-show-moderator-liked - 0

custom-datetime-format -

cache-html - 0

clear-cached-comment-html - 0

verbose-comment-logs - 0

use-discourse-webhook - 1

use-discourse-user-webhook - 1

webhook-match-user-email - 0

verbose-webhook-logs - 0

verbose-sso-logs - 1

enable-sso - 1

auto-create-sso-user - 1

real-name-as-discourse-name - 0

force-avatar-update - 1

redirect-without-login - 0

sso-client-enabled - 0

sso-client-login-form-change - 0

sso-client-sync-by-email - 0

sso-client-disable-create-user - 0

sso-client-sync-logout - 0

logs-enabled - 1

تم بالفعل إعداد WordPress كموفر، ولكن يبدو أن كود DiscourseConnect لا يتم تنفيذه. هذا يوحي لي بأنك لا تقوم فعلياً بتسجيل الدخول باستخدام DiscourseConnect، أو أنك لا تقوم بتحميل الشيفرات أو السجلات بشكل صحيح. هل ربما يكون لديك طريقة تسجيل دخول أخرى مُعدّة، مثل OAuth؟ ربما قم بتسجيل ما تقوم به بالضبط لاختبار هذا. حاول التقاط عناوين URLs في التسجيل و/أو عن طريق تفعيل “حفظ السجل” في علامة تبويب الشبكة في أدوات المطور.

ولكن wpdc_sso_params لا يتم تنفيذه أبداً أثناء تسجيل الخروج/الدخول أو أثناء تدفق تسجيل الدخول في Discourse

أيضاً، يرجى مشاركة كيفية وصولك إلى هذا الاستنتاج.

أضفت “error_log( ‘[WPDC avatar debug] snippet loaded’ );”

  1. أنا أستخدم DiscourseConnect لتسجيل الدخول، عبر تسجيل الدخول القياسي في ووردبريس.
  2. أنا أستخدم أداة إدارة مقتطفات الكود في إضافة Advanced Site Enhancements (ASE) لإضافة مقتطفاتي. وقد سمح مقتطفك الخاص بالتصحيح (المعدّل كما هو موصوف) بوجود بعض الإدخالات في ملف debug.log

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

شكرًا لك @angus على جهودك. سأبذل قصارى جهدي الآن لمعرفة المزيد عن هذه المشكلة وسأخبرك بنتائج بحثي.