إضافة مجموعات وفئات (مع الأمان) باستخدام WP-Discourse أو API؟

نحن ندير عضوية من خلال نظام Wordpress/Woocommerce الخاص بنا. لقد كنا نستخدم Discourse على نطاق فرعي مع تسجيل الدخول الموحد (SSO) لبضع سنوات وكان يعمل بشكل رائع. لديّ رمز في ملف الوظائف الخاص بي يضيف/يزيل الوصول إلى المجموعة عندما ينضم الشخص/يلغي على التوالي.

لقد أضفنا ميزة في عضويتنا حيث يمكن للأشخاص الانضمام إلى مجموعة صغيرة مكونة من 6-8 أشخاص لمكالمات Zoom الأسبوعية.

لإدارة ذلك، قمنا بإنشاء نوع منشور Wordpress يسمى “Cohorts” يحتوي على معلومات المكالمة الأسبوعية ثم قمنا بتعيين تلك “Cohorts” لمستخدم باستخدام حقول مستخدم مخصصة.

إليك ما أود القيام به:

  1. إنشاء مجموعة لكل من “Cohorts”.
  2. إنشاء فئة فرعية لكل من “Cohorts” لا يمكن للمجموعة من #1 الوصول إليها.
  3. وضع كل عضو في مجموعته respective التي ستمنحه الوصول إلى الفئة الفرعية الخاصة بهم، وعليهم، لـ “Cohort” الخاص بهم.

أعرف كيفية القيام بـ #3، ولكن هل هناك طريقة لإضافة المجموعات والفئات الفرعية برمجيًا (مع إعدادات الأمان)؟

لا يمكنني العثور على هذه الوظيفة في أدوات WP-Discourse. أيضًا، بالنظر إلى واجهة برمجة التطبيقات (API)، يمكنني رؤية مكان إضافة الفئات، ولكن ليس وظائف الأمان.

هل ما أريده ممكن؟

نعم، هذا ممكن. يمكنك إجراء أي طلب API إلى Discourse من WordPress باستخدام طريقة الأداة المساعدة discourse_request، أي:

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
$args =  array(
   "body" => "",
   "type" => "post"
);
$response = DiscourseUtilities::discourse_request( $path, $args );

سيؤدي هذا إلى تنسيق الطلب بشكل صحيح واستخدام مفتاح API والمستخدم الذي قدمته في إعدادات WP Discourse. ستحتاج إلى مفتاح عام للإجراءات التي تشير إليها (إذا كنت تستخدم نفس المفتاح أيضًا لوظائف WP Discourse العادية).

إنشاء مجموعة

نقطة النهاية التي تريدها هي هذه: Discourse API Docs. لا توجد قائمة كاملة بالمعلمات في وثائق API، ولكنك ستجدها هنا: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

إنشاء فئة

نقطة النهاية التي تريدها هي هذه: Discourse API Docs. وبالمثل، فإن القائمة الكاملة للمعلمات موجودة هنا: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

لاحظ أن “إعدادات الأمان” تتم معالجتها عبر المعلمة permissions. تحتاج فقط إلى تزويدها بكائن يحتوي على أسماء المجموعات كمفاتيح ومستويات الأذونات كأعداد صحيحة كقيم، على سبيل المثال:

{
  "cohort1": 2,
  "staff": 1
}

ستجد قائمة أعداد الأذونات الصحيحة هنا: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

إعجابَين (2)

@Angus، شكراً جزيلاً لك! كان هذا بالضبط ما أحتاجه!

لقد تمكنت من إنشاء مجموعاتي، وتعيين المستخدمين للمجموعات، وإنشاء الفئات بالأمان المناسب.

أنا أقدر حقًا مساعدتك.

سؤال آخر على الرغم من ذلك… عندما حاولت تشغيل PUT لتحديث فئة أو مجموعة، أحصل على هذا الخطأ:

خطأ فادح: غير معالج خطأ: استدعاء لوظيفة غير معرفة wp_remote_put() في […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

إليك رمز الاختبار الخاص بي لمحاولة تحديث الفئة ذات المعرف 61 باسم جديد:

$path = "/categories/61.json";
$args =  array(
            "type" => "put",
            "body" => array (
                "name" => "Cohorts 1",
            )
        );
$response = DiscourseUtilities::discourse_request( $path, $args )

ما الذي أفعله بشكل خاطئ؟

أي أفكار هنا؟ شكراً جزيلاً!

عذرًا تيم، لقد كنت بعيدًا الأيام القليلة الماضية. يبدو أن طريقة discourse_request تحتاج إلى تعديل لدعم ذلك. سأقوم بإنشاء طلب سحب (PR) لذلك الأسبوع المقبل، وسيستغرق دمجه أسبوعًا آخر على الأرجح.

إذا كنت تريده في وقت أقرب من ذلك، يمكنك استخدام طرق WP الأساسية كما يلي:

$api_credentials = DiscourseUtilities::get_api_credentials();
if ( is_wp_error( $api_credentials ) ) {
    return $api_credentials;
}

$headers = array(
    'Api-Key'      => sanitize_key( $api_credentials['api_key'] ),
    'Api-Username' => sanitize_text_field( $api_credentials['api_username'] ),
    'Accept'       => 'application/json',
);
$body = array( /* specific to the endpoint you're using */ );
$url = /* The absolute url for the endpoint you're using */;

$opts = array(
   'headers' => $headers,
   'body'    => json_encode( $body ),
   'method'  => 'PUT'
);

$result =  wp_remote_request( $url, $opts );

مرحباً @timgrahl هل يمكنك مشاركة وظيفة تعمل مع Wordpress مع Woocommerce لإضافة/إزالة المستخدمين إلى المجموعات؟

أنا أستخدم Woocommerce مع العضويات وأحاول جعل هذا يعمل… إذا كان لدى مستخدم Wordpress عضوية Woocommerce نشطة، فسيتم إضافة المستخدم إلى مجموعة X… عند إلغاء العضوية أو انتهاء صلاحيتها، تتم إزالة المستخدم من مجموعة X

مرحباً توم، لمزامنة مجموعات Discourse مع عضويات WooCommerce، ستحتاج إلى استخدام النهج الموضح هنا:

نعم، رأيت ذلك… لكنني ما زلت غبيًا جدًا لإنشاء مقتطف برمجي لذلك :confused: