كيفية معرفة أن مستخدم Discourse غير معتمد في Wordpress؟

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

أستطيع استخدام إعدادات المزامنة عند تسجيل الدخول ويجب الموافقة على المستخدمين لتحقيق معظم هذا، لكنني لا أعرف كيفية استرجاع حالة الموافقة على المستخدم في Discourse؟

هل هناك حقل بيانات مستخدم في WP يستخدمه Discourse لتخزين حالة موافقة المستخدم في Discourse؟ إذا لم يكن كذلك، هل يجب أن أستخدم واجهة برمجة التطبيقات (API) للحصول على المعلومات من Discourse؟

هدفي - أرغب في إظهار زر في لوحة التحكم الخاصة بي في WP برابط ديناميكي يتغير بناءً على حالة الموافقة أو عدم الموافقة.
مستخدم غير معتمد - يوجه الرابط الديناميكي إلى نموذج الطلب في WP.
مستخدم معتمد - يوجه الرابط الديناميكي إلى مجتمع Discourse.

لقد بحثت في بعض المنشورات لكنني لم أجد حلاً. المساعدة مُقدَّرة!

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

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

إذا كان تحميل الصفحة بطيئًا، فسأستخدم خطافًا (hook) لتخزين بيانات الموافقة في حقل مخصص للمستخدم بنفسي. قبل المضي قدمًا، سيكون من الجيد معرفة ما إذا كان إضافة WP-Discourse تقوم بذلك بالفعل.

مرحبًا @Himanshu_Singh، الإجابة المختصرة هي أن إضافة WP Discourse لا تخزن حالة اعتماد مستخدم Discourse.

أنصحك بالنظر في إجراء wpdc_after_sync_sso، الذي يُنفَّذ بعد مزامنة سجل المستخدم عقب تسجيل دخوله إلى WordPress.

إذا أضفت سجلًا هناك، على سبيل المثال:

function wpdc_after_sync_sso_callback($discourse_user, $user_id) {
    error_log(print_r($discourse_user, true));
}
add_action( 'wpdc_after_sync_sso', 'wpdc_after_sync_sso_callback', 10, 2 );

سترى أن كائن discourse_user يحتوي على حالة اعتماد المستخدم، على سبيل المثال:

stdClass Object
(
    [id] => 43
    [username] => angus4
    [name] => angus4
    ...
    [approved] =>
)

يمكنك بعد ذلك تخزين هذه القيمة بنفسك في حقل مخصص للمستخدم واستخدامها لإنشاء الرابط الديناميكي الخاص بك.

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

شكرًا لك، أنغوس. حلك أنيق. لقد سلكُتُ مسارًا أطول قليلًا:

  1. استخدمتُ واجهة برمجة تطبيقات مستكشف البيانات للحصول على حالة الموافقة.
  2. ربطتُها بخطاف template_redirect للتحقق من حالة الموافقة عند تسجيل الدخول.
  3. حدّثتُ الحقل المخصص في ووردبريس عند تسجيل الدخول.
  4. منعتُ الواجهة من التشغيل مجددًا إذا كان المستخدم معتمدًا.
add_action('template_redirect', 'update_discourse_approval_status',1);
function update_discourse_approval_status () {
  
  global $post;
  $post_slug = $post->post_name;
  if ($post_slug == 'page-slug'){
    $current_user_id = get_current_user_id();
	$approval_status_stored_in_wp = get_user_meta($current_user_id, 'custom-field', true);
    if( $approval_status_stored_in_wp != 1) {
      $user_discourse_id = (int)get_user_meta($current_user_id,'discourse_sso_user_id')[0];
	//بيانات اعتماد الواجهة،
	$api_key = 'api-key';
	$api_username = 'name';

	$discourse_user_param_string = 'params={"user_param":';
	$discourse_user_param_string .= '"';
	$discourse_user_param_string .= $user_discourse_id;
	$discourse_user_param_string .= '"}';

	//العنوان إلزامي لواجهة برمجة تطبيقات Discourse.
	$headers = array("Content-Type: multipart/form-data;","Api-Key:$api_key","Api-Username:$api_username",);

	$url = 'https://community.showprowess.com/admin/plugins/explorer/queries/<query-number>/run';
	$ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $discourse_user_param_string);
    $result = curl_exec( $ch );

	if ( curl_errno( $ch ) !== 0 ) {
    // معالجة الخطأ، استدعاء curl_close( $ch ) ثم العودة.
	echo 'error';
	curl_close ($ch);
	return;
	}

	curl_close( $ch );

	$decoded_result = json_decode( $result, true );

	$user_approved = $decoded_result['rows'][0][0];
	$updated = update_user_meta( $current_user_id, 'custom-field', $user_approved);
    } 
  } // إغلاق جملة الشرط للتحقق من البيانات المخزنة في الحقل المخصص
} // إغلاق جملة الشرط للتحقق من الصفحة الصحيحة 
          
?>
إعجاب واحد (1)