ما مشكلة طلب cURL الخاص بي؟

مرحباً! أحاول كتابة طلب cURL لموقع ووردبريس الخاص بي لدمج Discourse مع اشتراكات woo. إليك دالتي، والتي لا تبدو أنها تعمل. هل فاتني شيء؟

function execute_discourse_curl_request($subscription) {

    $subscription_status = $subscription->get_status();

    $user_id = $subscription->get_user_id();
    $user = get_user_by('ID', $user_id);
    $username = $user->user_login;

    $request = "";

    if ($subscription_status == 'active') {
        $request = "PUT";
    }

    if ($subscription_status == 'cancelled' || $subscription_status == 'on-hold') {
        $request = "DELETE";
    }

    $api_key = get_option( 'discourse_custom_api_key' );

    $group_id = 41;
    $api_url = 'https://forum.example.com/groups/' . $group_id . '/members.json';
    
    $data = [
        'usernames' => [$username],
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $request,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            "Api-Key: " . $api_key,
            "Api-Username: system",
            "Content-Type: application/json"
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);

    if ($err) {
        $to = 'hello@example.com';
        $subject = 'Error in Discourse User Update cURL Request';
        $message = 'There was an error';
        wp_mail($to, $subject, $message);
    }
}
إعجاب واحد (1)

مرحباً،
ما هو الخطأ الذي تحصل عليه؟ ماذا تُرجع الاستجابة؟
هذا يجب أن يساعد في فهم المشكلة.

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

يجب أن يُرجع حمولة عند النجاح أو الفشل.

هل تحققت من محتوى $response؟

أيضًا، أعتقد أن تنسيق المعلمة usernames يجب أن يكون سلسلة نصية “username1,username2,...” بدلاً من ذلك.

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

ما لم أكن أفعل شيئًا خاطئًا، فإن الطلب إلى " / groups / ${group_id} / members.json " غير بديهي إلى حد ما. ولا يبدو أنه موثق _ ولا يمكن عرضه في علامة تبويب الشبكة في المتصفح عند إرسال نموذج “إضافة مستخدم” في Discourse في صفحة المجموعة. مرة أخرى، قد أكون أفعل شيئًا خاطئًا.

على أي حال، المسار للطلب هو /groups/${group_id}/members.json، مع استبدال المعرف الرقمي للمجموعة بـ group_id. يتطلب جسم الطلب معلمة group_id، ولكن يجب تعيين هذه المعلمة إلى name المجموعة. لذا تصبح الوسائط شيئًا كهذا:

$group_id = 45;
$group_name = 'publishers';
$args     = array(
    'method' => 'DELETE', // أو 'PUT'
	'body'   => array(
		// 'group_id'  => $group_name, التعديل: هذه المعلمة ليست ضرورية، لست متأكدًا مما كان يحدث عندما كنت أختبرها.
		'usernames' => 'sally,Ben',
	)
);

// المسار:
/groups/${group_id}/members.json

إذا كان لديك المكون الإضافي WP Discourse مهيأً على موقع WordPress الخاص بك، يمكنك استخدام دالة المساعدة الثابتة discourse_request لتجنب الحاجة إلى استخدام curl. لاحظ أنني ربطت بالدالة الثابتة الموجودة في ملف plugin-utilities، ولكن النطاق الذي تحتاج إلى استخدامه للطلبات الخارجية هو من https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

function zalg_add_users_to_group() {
	$group_id = 45;
    $group_name = 'publishers';
    $method = 'PUT'; // 'PUT' لإضافة المستخدمين؛ 'DELETE' لإزالة المستخدمين
	$args     = array(
		'method' => $method,
		'body'   => array(
			// 'group_id'  => $group_name, التعديل: هذه المعلمة ليست ضرورية
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // إرجاع الاستجابة أو تسجيلها أو معالجتها
}

إذا كنت تستخدم WordPress كموفر SSO لـ Discourse، فهناك دالة مساعدة تسمح لك بإضافة مستخدم واحد إلى مجموعة واحدة أو أكثر:

function zalg_sso_add_users_to_group() {
    $user_id = 1; // معرف مستخدم WordPress
    $group_names = 'foo,bar,baz'; // اسم مجموعة واحدة أو أكثر مفصولة بفواصل، بدون مسافات بعد الفواصل!
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

لإضافة مستخدمين متعددين إلى مجموعة واحدة، ستحتاج إلى استخدام طريقة discourse_request الموجودة في المثال الأول من التعليمات البرمجية.

3 إعجابات

الاستجابة هي مجرد خطأ 500 :frowning:

هذه مساعدة بطولية، شكراً سيمون! سيكون هذا أسهل بكثير إذا كان بإمكاني استخدام دوال مساعدة موجودة في إضافة WP Discourse. أنا أستخدم موقع ووردبريس الخاص بي لتسجيل الدخول الأحادي (SSO).

ومع ذلك، ما زلت أواجه خطأً فادحًا في حالتي عند تشغيل الدالة. لست متأكدًا من السبب. ما تقوله أعلى من فهمي قليلاً، ولكن إليك ما أستخدمه في ملف functions.php الخاص بي:

<?php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

add_action('woocommerce_subscription_status_cancelled', 'zalg_sso_add_users_to_group', 10, 3);

function zalg_sso_add_users_to_group($subscription) {
    $user_id = $subscription->get_user_id();
    $group_names = 'premium';
    DiscourseUtilities::remove_user_to_discourse_group($user_id, $group_names);
}

لست متأكدًا مما أفتقده؟

الوظيفة لإزالة مستخدم من مجموعة واحدة أو أكثر تسمى remove_user_from_discourse_group، لقد استدعيتها remove_user_to_discourse_group.

الوظائف لإضافة وإزالة مستخدم من مجموعة واحدة أو أكثر موجودة هنا: wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub.

3 إعجابات

أنت على حق! خطأ سخيف. شكراً لمساعدتك يا سيمون. أتمنى لو كان هناك صندوق إكراميات. أخبرني إذا كان هناك أي شيء يمكنني القيام به من أجلك. تحياتي!

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

للتوسع في هذا، هل أنت على علم أين يمكنني العثور على دوال مساعدة لتعديل ملف تعريف المستخدم بشكل أكبر؟ سيكون من الرائع إذا كان بإمكاني تعيين صورة ملف تعريف المستخدم والسيرة الذاتية إذا كان ذلك ممكنًا.

هناك دالة مساعدة في ملف Utilities لهذا الغرض:

DiscourseUtilities::sync_sso_record( $sso_params );

بالأمس نشرت مثالاً لكيفية استخدامه: I cannot add user to the discouse forum from a wordpress website when user added in a membership - #10 by simon. الجزء الصعب هو إنشاء المصفوفة لحجة sso_params. يجب أن تحتوي تلك المصفوفة على حقل external_id. يتم تعيينه إلى معرف WordPress الخاص بالمستخدم:

	$sso_params = array(
		'external_id' => $user_id,
	);

يمكنك تضمين أي حقول من هذه القائمة في الحمولة: discourse/lib/discourse_connect_base.rb at 8f52fd1051e20fdff41321c5cff99fda05af86c1 · discourse/discourse · GitHub. لاحظ مصفوفة BOOLS التي تظهر أسفل قائمة ACCESSORS التي ربطتها. تشير إلى أي من الخيارات الممكنة هي booleans (true/false). عند إجراء طلبات من WordPress، يجب تعيين أي حقول منطقية باستخدام السلاسل النصية 'true' أو 'false'، وليس باستخدام قيم PHP true أو false.

لتحديث الصورة الرمزية، قم بتعيين حقل avatar_url في مصفوفة $sso_params وقم أيضًا بتعيين حقل avatar_force_update إلى 'true'.

هناك حقل bio يمكن استخدامه لتعيين السيرة الذاتية.

يقوم المكون الإضافي WP Discourse بالفعل بتعيين حقلي bio و avatar_url. كما أن لديه إعداد “Force Avatar Update” في إعدادات SSO الخاصة به. قد تكون المشكلة هي أن هذه الإعدادات يتم تحديثها فقط عندما يقوم المستخدم بتسجيل الدخول إلى Discourse عبر موقع WordPress. تقوم الدالة sync_sso_record بتحديث الحقول على الفور، دون الحاجة إلى قيام المستخدم بتسجيل الدخول إلى Discourse.

أيضًا، إذا وجدت أن السير الذاتية للمستخدمين لا يتم تعيينها كما هو الحال في Discourse، فقد يكون ذلك بسبب عدم تعيينها في موقع WordPress الخاص بك حيث يتوقع المكون الإضافي تعيينها: wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub. إذا كان لدى Woocommerce حقل مختلف للسير الذاتية، فيمكنك الوصول إلى هذا الحقل واستخدامه في استدعاء لـ sync_sso_record.

3 إعجابات

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