مزامنة عضويات WooCommerce مع مجموعات Discourse

يسمح لك هذا الإضافة بمزامنة عضويات WooCommerce مع مجموعات Discourse.

المتطلبات المسبقة

لكي يعمل هذا، يجب أن يكون DiscourseConnect مفعّلًا، مع استخدام إما WordPress أو Discourse كمزوّد لـ DiscourseConnect.

الخطوات

  1. قم بتثبيت إضافة WordPress هذه: GitHub - paviliondev/discourse-woocommerce · GitHub.

  2. استخدم محرر سمة WordPress لتحديث هذه الأرقام إلى plan_id الخاص بخطة WooCommerce ومعرف المجموعة في Discourse واسم المجموعة الذي تريد مزامنته:

    $member_group_map[] = (object) array('plan_id' => 51, 'group_id' => 43, 'group_name' => 'group1');
    $member_group_map[] = (object) array('plan_id' => 62, 'group_id' => 44, 'group_name' => 'group2');
    

    يمكنك إضافة عدد غير محدود من الإدخالات (أو حذف الإدخالات الموجودة).

خطوة اختيارية

  1. قم بتثبيت WP Crontrol – إضافة WordPress | WordPress.org وقم بجدولة مهمة run_full_wc_membership_sync لتعمل كل 24 ساعة. سيؤدي ذلك إلى مزامنة كاملة لضمان الاتساق.

ملاحظات تقنية

الطريقة الوحيدة الموثوقة لالتقاط كل من إنشاء العضوية وتغيير حالتها في WooCommerce هي استخدام خطاف الإدارة wc_memberships_user_membership_saved. يمكنك استخدام هذا الخطاف بالاقتران مع خطاف wc_memberships_user_membership_status_changed، لكن لا ينبغي أن يكون ذلك ضروريًا.

يستخدم هذا الكود سجل WooCommerce لتسجيل المعلومات في /wp-content/uploads/wc-logs/{log_file}. إذا لم يعمل، تحقق من المخرجات هناك. سترى سجلات تبدو كالتالي، تُظهر مراحل المنطق:

2019-05-23T07:01:57+00:00 INFO Running handle_wc_membership_saved 1, 92, 1
2019-05-23T07:01:57+00:00 INFO angus@email.com membership of VIP Membership changed to wcm-active
2019-05-23T07:01:57+00:00 INFO Sending PUT request to http://localhost:3000/groups/41/members with angus@email.com
2019-05-23T07:01:57+00:00 INFO Response from Discourse: 200 OK

ملاحظات الاستخدام

:point_right: لن تعمل المزامنة إذا قمت بالنقر فوق “حذف عضوية المستخدم” في لوحة تحكم WordPress. لا يوجد خطاف في WooCommerce يتم تشغيله عند النقر فوق ذلك. بدلاً من ذلك، غيّر حالة العضوية.

19 إعجابًا

Thanks, @angus. Funny that it seems we were both doing this at the same time.

You managed to figure out what was in those $args. I couldn’t find the user_id in it, I think.

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

It looks correct to me. Since the site is using WordPress as the SSO provider, you could use the static add_user_to_discourse_group and remove_user_from_discourse_group functions to handle changing the group status on Discourse. That would let you do something like:

	if ( in_array( $status, ACTIVE_STATUSES ) ) {
		DiscourseUtilities::add_user_to_discourse_group( $user_id, 'your_discourse_group_name' );
	} else {
		DiscourseUtilities::remove_user_from_discourse_group( $user_id, 'your_discourse_group_name' );
	}

Both of those functions take the user’s WordPress ID as the first argument, and a comma separated list of group names (with no spaces between the names) as the second argument. Those functions will take care of all the API credentials for you, so using them would simplify the code a bit. There are more details about those functions here: Manage group membership in Discourse with WP Discourse SSO.

4 إعجابات

In this case Discourse is the SSO Provider :slight_smile:

إعجابَين (2)

Just an update here.

The updated version of this integration has the following structure:

  1. Sync on every WooCommerce Membership status change

  2. Batch sync every relevant WooCommerce Member every 24 hours to ensure consistency.

  3. In terms of matching wordpress users with discourse users, the code first checks if the wordpress user has a discourse account associated with it. If so, it uses the discourse user id. If not it attempts the sync using the wordpress user’s email. The sync can fail if

    3.1 the user has never associated their wordpress and discourse accounts; and
    3.2 they have used different emails on wordpress and discourse.

We’re successfully running this in production on a client’s site. So far we’ve had only 2 users who have failed to sync, i.e. where both 3.1 and 3.2 were true.

Implementation

The updated implementation is

  1. Functions.php methods (update MEMBERSHIP_PLAN_ID and DISCOURSE_GROUP_ID)
Functions.php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

const MEMBERSHIP_PLAN_ID = 61128;
const DISCOURSE_GROUP_ID = 62;
const ACTIVE_STATUSES = array(‘wcm-active’);

function update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status) {
$options = DiscourseUtilities::get_options();
$base_url = $options[‘url’];
$api_key = $options[‘api-key’];
$api_username = $options[‘publish-username’];

if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
  return new \WP_Error( 'discourse_configuration_error', 'The WP Discourse plugin has not been properly configured.' );
}

$discourse_user_id = get_user_meta($user_id, 'discourse_sso_user_id', true);
$user_info = get_userdata($user_id);
$user_email = $user_info->user_email;
$logger = wc_get_logger();

$logger->info( sprintf('%s membership of %s is %s' , $user_email, $membership_plan_name, $status ) );

if (in_array($status, ACTIVE_STATUSES)) {
	$action = 'PUT';
} else {
	$action = 'DELETE';
}

$external_url = esc_url_raw( $base_url . "/groups/". DISCOURSE_GROUP_ID ."/members" );

$args = array(
‘api_key’ => $api_key,
‘api_username’ => $api_username
);

if ($discourse_user_id) {
$args[‘user_id’] = $discourse_user_id;
} else {
$args[‘user_emails’] = $user_email;
}

$logger->info( sprintf(‘Sending %s request to %s with %s’, $action, $external_url, http_build_query($args)) );

$external_url = add_query_arg($args, $external_url);

$response = wp_remote_request($external_url,
 array(
	 'method' => $action
 )
);

$logger->info( sprintf( 'Response from Discourse: %s %s' ,
    wp_remote_retrieve_response_code($response),
    wp_remote_retrieve_response_message($response) ) );

if ( ! DiscourseUtilities::validate( $response ) ) {

	return new \WP_Error( 'discourse_response_error', 'There has been an error in retrieving the user data from Discourse.' );
}

};

function handle_wc_membership_saved($membership_plan, $args) {
$logger = wc_get_logger();

$logger->info( sprintf('Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );

$user_id = $args['user_id'];
$membership = wc_memberships_get_user_membership($args['user_membership_id']);
$membership_plan_id = $membership->plan->id;

if ($membership && $membership_plan_id == MEMBERSHIP_PLAN_ID) {
	$membership_plan_name = $membership_plan->name;
	$status = $membership->status;
	update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);
}

};

add_action(‘wc_memberships_user_membership_saved’, ‘handle_wc_membership_saved’, 10, 2);

function full_wc_membership_sync() {
$allusers = get_users();
$logger = wc_get_logger();

$logger->info( sprintf('Running full_wc_membership_sync') );

foreach ( $allusers as $user ) {
	$user_id = $user->id;
	$membership = wc_memberships_get_user_membership($user_id, MEMBERSHIP_PLAN_ID);
	$membership_plan_id = $membership->plan->id;

	$logger->info( sprintf('Checking membership of %s', $user->user_login) );

	if ($membership && $membership_plan_id === MEMBERSHIP_PLAN_ID) {
		$membership_plan_name = $membership->plan->name;
		$status = $membership->status;
		$logger->info( sprintf('Updating group access of %s', $user->user_login) );

		update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);

		$logger->info( sprintf('Sleeping for 5 seconds') );
		sleep(5);
	}
}

}

add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);

  1. Install WP Crontrol – WordPress plugin | WordPress.org and schedule “run_full_wc_membership_sync” to run every 24 hours.

You can review the logs of the sync in WooCommerce > Status > Logs.

@DNSTARS @pfaffman

8 إعجابات

What a baller, sending some magical internet money your way in thanks. :+1:

6 إعجابات

Much appreciated! Thank you @DNSTARS

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

ما التغييرات التي يجب أن أجريها في حالتي؟ لدي وضع مختلف قليلاً. إليك الاختلافات:

  1. لدي ووردبريس كعميل لتسجيل الدخول الموحد (SSO)، حيث يسجل المستخدمون الدخول عبر ديسكورش.
  2. قمت بتثبيت إضافة ووردبريس ‘WooCommerce Groups’: Groups WooCommerce Documentation - WooCommerce. تشبه إضافة عضويات ووكومرس ولكن مع وظائف أقل. أعتقد أن جميع الوظائف الأساسية متشابهة.
  3. لدي مجموعات متعددة في ديسكورش (أكثر من 3)، ولذلك أحتاج إلى 3 مجموعات وصول في ووردبريس.

هل يمكنك تزويدي بتصحيحات لهذا الكود أو تقديم بعض النصائح؟ شكرًا لك!
ربما يمكنك المساعدة؟ @pfaffman @simon

آه، لم أكتب سؤالًا هناك…
لذا أحتاج إلى تفعيل هذه التكامل بين ووردبريس وديسكورش.

ما يعمل حاليًا:

  1. ووردبريس يعمل كعميل لتسجيل الدخول الموحد (SSO).
  2. تُباع العضويات عبر إضافة WP Groups وتنتهي صلاحيتها، مما يؤدي إلى إضافة المستخدمين إلى المجموعات المطلوبة.
  3. يتم حذف المستخدمين من المجموعات عند انتهاء الصلاحية.

أحتاج إلى:

  • عند إضافة مستخدم إلى مجموعة في ووردبريس، أحتاج إلى إضافة هذا المستخدم إلى مجموعة محددة في ديسكورش.
  • عند حذف المستخدم من تلك المجموعة في ووردبريس، يجب حذفه من ديسكورش.
    مجموعات متعددة في ووردبريس وديسكورش

لاحظت أن دالة update_discourse_group_access تقوم بإضافة بيانات مصادقة واجهة برمجة التطبيقات (API) إلى عنوان URL. لن يعمل هذا على أي إصدار حديث من Discourse. هل لديك إصدار محدّث من الكود يستخدم المصادقة المعتمدة على الرؤوس (headers)؟ إذا لم يكن كذلك، فيمكنني تعديل الكود، لكنني لن أتمكن من اختبار تعديلاتي، لذا فإن الأمر يحمل بعض المخاطر.

لديك مواقع Discourse و WordPress نظيفة، ويمكنك تجربة الكود دون أي مخاطر.

إعجابَين (2)

إليك كود أنغوس، المحدث لاستخدام المصادقة القائمة على الترويسة. لم أقم بإجراء أي تغييرات أخرى عليه. كما أنني لم أختبر الكود. لن أقوم بتحديث المنشور الأصلي (OP) حتى يتاح لأحد فرصة اختبار الكود.

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

const MEMBERSHIP_PLAN_ID = 35;
const DISCOURSE_GROUP_ID = 41;
const ACTIVE_STATUSES    = array( 'wcm-active' );

function update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status ) {
	$options      = DiscourseUtilities::get_options();
	$base_url     = $options['url'];
	$api_key      = $options['api-key'];
	$api_username = $options['publish-username'];

	if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
		return new \WP_Error( 'discourse_configuration_error', 'لم يتم تكوين إضافة WP Discourse بشكل صحيح.' );
	}

	$user_info         = get_userdata( $user_id );
	$user_email        = $user_info->user_email;
	$logger            = wc_get_logger();

	$logger->info( sprintf( '%s membership of %s changed to %s', $user_email, $membership_plan_name, $status ) );

	if ( in_array( $status, ACTIVE_STATUSES ) ) {
		$action = 'PUT';
	} else {
		$action = 'DELETE';
	}

	$external_url = esc_url_raw( $base_url . "/groups/" . DISCOURSE_GROUP_ID . "/members" );

	$logger->info( sprintf( 'Sending %s request to %s with %s', $action, $external_url, $user_email ) );

	$response = wp_remote_request( $external_url,
		array(
			'method'  => $action,
			'headers' => array(
				'Api-Key'      => sanitize_key( $api_key ),
				'Api-Username' => sanitize_text_field( $api_username ),
			),
			'body'    => array( 'user_emails' => $user_email ),
		)
	);

	$logger->info( sprintf( 'Response from Discourse: %s %s',
		wp_remote_retrieve_response_code( $response ),
		wp_remote_retrieve_response_message( $response ) ) );

	if ( ! DiscourseUtilities::validate( $response ) ) {

		return new \WP_Error( 'discourse_response_error', 'حدث خطأ في استرداد بيانات المستخدم من Discourse.' );
	}
}

function handle_wc_membership_saved( $membership_plan, $args ) {
	$logger = wc_get_logger();

	$logger->info( sprintf( 'Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );

	$user_id            = $args['user_id'];
	$membership         = wc_memberships_get_user_membership( $args['user_membership_id'] );
	$membership_plan_id = $membership->plan->id;

	if ( $membership && $membership_plan_id == MEMBERSHIP_PLAN_ID ) {
		$membership_plan_name = $membership_plan->name;
		$status               = $membership->status;
		update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );
	}
}
add_action( 'wc_memberships_user_membership_saved', 'handle_wc_membership_saved', 10, 2 );

الكود يقوم بتعيين متغير $discourse_user_id، لكن هذا المتغير غير مستخدم في أي مكان. يمكن على الأرجح إزالته من الكود.

لست متأكدًا تمامًا من ذلك. الكود يرتبط بـ wc_memberships_user_membership_saved (خطاف الإجراء). يبدو من المرجح أن هذا الخطاف تمت إضافته بواسطة إضافة WooCommerce Memberships. على الأرجح يوجد خطاف مشابه متاح في إضافة WooCommerce Groups، لكن من غير المرجح أن يحمل نفس الاسم ونفس المعاملات.

3 إعجابات

تستخدم إضافة ‘Groups for Woocommerce’ إضافة ‘WP Group’ لتشغيل وظائف المجموعات، وإليك واجهة برمجة تطبيقاتها: Actions | Itthinx Documentation

أما بخصوص Groups WooCommerce

إجراءات

لا تستدعي الإضافة أي إجراءات محددة في الوقت الحالي.

لتبسيط الأمر، قمت بالتبديل إلى WooCommerce Memberships واستخدمت الكود الأصلي مع التعديلات التي أجراها @simon.

لقد قمت بتغيير المعرفات (IDs) لتتوافق مع بياناتي:

const MEMBERSHIP_PLAN_ID = 347;
const DISCOURSE_GROUP_ID = 42;

في هذه المرحلة، لا يمكنني المزامنة (sync) لكنني أحصل على بعض المعلومات في السجل:

> 2020-05-14T13:12:34+00:00 INFO test@gmail.com membership of PAID1 changed to wcm-active
> 2020-05-14T13:12:34+00:00 INFO Sending PUT request to https://site/groups/42/members with test@gmail.com
> 2020-05-14T13:12:34+00:00 INFO Response from Discourse: 400 Bad Request

تم العثور على معرف مجموعة Discourse هنا:
site/groups/PAID1.json

> {"group":{"id":42,"automatic":false,"name":"PAID1","user_count":0,"mentionable_level":0,"messageable_level":0,"visibility_level":0,"automatic_membership_email_domains":"","primary_group":false,"title":"","grant_trust_level":null,"incoming_email":null,"has_messages":false,"flair_url":"","flair_bg_color":"","flair_color":"","bio_raw":"","bio_cooked":null,"bio_excerpt":null,"public_admission":false,"public_exit":false,"allow_membership_requests":false,"full_name":"France-PAID1","default_notification_level":3,"membership_request_template":"","is_group_user":false,"is_group_owner":true,"members_visibility_level":0,"can_see_members":true,"publish_read_state":false,"is_group_owner_display":false,"mentionable":true,"messageable":false},"extras":{"visible_group_names":["admins","moderators","PAID1","PAID2","PAID3","staff","trust_level_0","trust_level_1","trust_level_2","trust_level_3","trust_level_4"]}}
إعجابَين (2)

إذن، هناك سؤالان مفتوحان:

  1. كيف يمكن المزامنة دون حدوث أخطاء؟
  2. ماذا يحدث إذا كان لدي أكثر من 3 أنواع عضوية في WordPress ومجموعات في Discourse؟ هذا الكود مخصص لنوع واحد فقط.

يبدو أن هذا ناتج عن خطأ في تحديثي للكود. سأقوم بمراجعته لاحقًا اليوم.

إعجابَين (2)

لقد قمت بتحديث مثال الكود هنا: Sync WooCommerce Memberships with Discourse groups - #11 by simon. كان هناك خطأ في الترميز في الكود الذي نشرته أمس. لقد اختبرت أن استدعاء واجهة برمجة التطبيقات (API) في الكود يعمل بشكل صحيح، لكنني لم أختبر الكود مع إضافة عضويات ووكومرس.

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

إعجابَين (2)

@سيمون، نجحنا في ذلك! شكرًا لكم يا فريق! :vulcan_salute:

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

@simon، في الكود الخاص بك لم أجد جزءًا يُستخدم للمزامنة الدفعية الذي استخدمه @angus.

/*run_full_wc_membership_sync*/
function full_wc_membership_sync() {
$allusers = get_users();
$logger = wc_get_logger();

$logger->info( sprintf('Running full_wc_membership_sync') );

foreach ( $allusers as $user ) {
	$user_id = $user->id;
	$membership = wc_memberships_get_user_membership($user_id, MEMBERSHIP_PLAN_ID);
	$membership_plan_id = $membership->plan->id;

	$logger->info( sprintf('Checking membership of %s', $user->user_login) );

	if ($membership && $membership_plan_id === MEMBERSHIP_PLAN_ID) {
		$membership_plan_name = $membership->plan->name;
		$status = $membership->status;
		$logger->info( sprintf('Updating group access of %s', $user->user_login) );

		update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);

		$logger->info( sprintf('Sleeping for 5 seconds') );
		sleep(5);
	}
}

}

add_action('run_full_wc_membership_sync', 'full_wc_membership_sync');  

هل يجب أن أضيف هذا الكود إلى نهاية كودك إذا أردت تفعيل المزامنة اليومية؟

عندما أحاول إضافة حدث cron هذا في WP عبر إضافة WordPress Crontrol باسم الخطاف:

run_full_wc_membership_sync

حصلت على خطأ:

ما الذي قد يسبب ذلك؟

تم الحل. قد يفيد شخصًا ما. كنت بحاجة إلى اختيار ‘At’ في حقل ‘Next Run’ ووضع تاريخ مثل 2020-05-10 10:00:00 هناك.

تم اختبار المزامنة - الآن تعمل بشكل صحيح.

إليك حل عملي إذا كان لديك خطط عضوية متعددة في WooCommerce ومجموعات في Discourse. تحتاج إلى تغيير معرفات عضويتك ومعرفات مجموعات Discourse لتطابق yours.

  1. يمكن العثور على معرفات خطط عضوية WooCommerce من الرابط أثناء تعديل الخطة في WordPress: https://site/wp-admin/post.php?post=**441**&action=edit
  2. يمكن العثور على معرفات مجموعات Discourse هنا: https://site/groups/group_name.json

الكود العملي للإدراج في functions.php:

ملخص

//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“347” => “42”,
“357” => “43”,
“441” => “44”
];

//const ACTIVE_STATUSES = array( ‘wcm-active’ );
const ACTIVE_STATUSES = array( ‘wcm-active’, ‘wcm-free_trial’ );

function update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status ) {
$options = DiscourseUtilities::get_options();
$base_url = $options[‘url’];
$api_key = $options[‘api-key’];
$api_username = $options[‘publish-username’];

if ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {
	return new \WP_Error( 'discourse_configuration_error', 'لم يتم تكوين إضافة WP Discourse بشكل صحيح.' );
}

$user_info         = get_userdata( $user_id );
$user_email        = $user_info->user_email;
$logger            = wc_get_logger();

$logger->info( sprintf( '%s membership of %s changed to %s', $user_email, $membership_plan_name, $status ) );

if ( in_array( $status, ACTIVE_STATUSES ) ) {
	$action = 'PUT';
} else {
	$action = 'DELETE';
}

$external_url = esc_url_raw( $base_url . "/groups/" . MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id] . "/members" );

$logger->info( sprintf( 'Sending %s request to %s with %s', $action, $external_url, $user_email ) );

$response = wp_remote_request( $external_url,
	array(
		'method'  => $action,
		'headers' => array(
			'Api-Key'      => sanitize_key( $api_key ),
			'Api-Username' => sanitize_text_field( $api_username ),
		),
		'body'    => array( 'user_emails' => $user_email ),
	)
);

$logger->info( sprintf( 'Response from Discourse: %s %s',
	wp_remote_retrieve_response_code( $response ),
	wp_remote_retrieve_response_message( $response ) ) );

if ( ! DiscourseUtilities::validate( $response ) ) {

	return new \WP_Error( 'discourse_response_error', 'حدث خطأ في استرجاع بيانات المستخدم من Discourse.' );
}

}

function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();

$logger->info( sprintf( 'Running handle_wc_membership_saved %s, %s, %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );

$user_id            = $args['user_id'];

$membership         = wc_memberships_get_user_membership( $args['user_membership_id'] );

$membership_plan_id = $membership->plan->id;

if ( $membership && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
	$membership_plan_name = $membership_plan->name;
	$status               = $membership->status;
	update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );
}

}
add_action( ‘wc_memberships_user_membership_saved’, ‘handle_wc_membership_saved’, 10, 2 );

/run_full_wc_membership_sync/
function full_wc_membership_sync() {
$allusers = get_users();
$logger = wc_get_logger();

$logger->info( sprintf('Running full_wc_membership_sync') );

foreach ( $allusers as $user ) {

   $user_id = $user->id;

   $membership = wc_memberships_get_user_membership($user_id);

   $membership_plan_id = $membership->plan->id;

   $logger->info( sprintf('Checking membership of %s', $user->user_login) );

   if ($membership  && isset(MEMBERSHIP_PLAN_DISCOURSE_GROUP[$membership_plan_id])) {
       
	  $membership_plan_name = $membership->plan->name;
      
	  $status = $membership->status;
      
	  $logger->info( sprintf('Updating group access of %s', $user->user_login) );

	  update_discourse_group_access($user_id, $membership_plan_id, $membership_plan_name, $status);

	  $logger->info( sprintf('Sleeping for 5 seconds') );
      
	  sleep(5);
   }
}

}

add_action(‘run_full_wc_membership_sync’, ‘full_wc_membership_sync’);

يجب عليك تغيير الأعمدة الأولى - معرفات خطط العضوية، والأعمدة الثانية - معرفات مجموعات Discourse.

ملخص
                                    "347"  => "42",
                                    "357"  => "43",
                                    "441"  => "44"
7 إعجابات

مرحبًا @Ed_Bobkov، كنت آمل أن تتمكن من مساعدتي في هذا الأمر. إليك بعض العبارات حول وضعي الحالي…

  1. لدي ووردبريس كعميل SSO، حيث يسجل المستخدمون الدخول عبر ديسكورش أو ووردبريس.
  2. حاليًا لا أستخدم إضافة “عضويات” في ووردبريس.
  3. سأكون لدي عشرات المجموعات في ديسكورش لكل نوع من أنواع الأعضاء.
  4. كنت أخطط لإنشاء مجموعة عضوية جديدة يدويًا في ووردبريس، ومجموعة مقابلة في ديسكورش، كلما توفرت مجموعة عضوية جديدة لمستخدمينا.
  5. كما ذكرت، “أحتاج إلى تفعيل هذا التكامل بين ووردبريس وديسكورش.”
  6. أعتقد أنني بحاجة إلى الحصول على إضافة “WooCommerce Memberships”؟

ما هي خطواتي التالية؟