إذا لم تكن بحاجة إلى إزالة الأشخاص من المجموعة بعد فترة زمنية معينة، أي أنهم يشترون وصولاً مدى الحياة إلى المجموعة بدلاً من الوصول المؤقت أو الدوري إليها، فيمكنك ربط العملية بـ woocommerce_payment_complete وإضافتهم إلى المجموعة عند إتمام الشراء. كما يمكنك أيضًا ربط العملية بـ SSO وتحديث مجموعات المستخدمين عند تسجيل الدخول.
شكرًا لك يا جاي!
منذ البداية، لن نقدم خيارًا للوصول مدى الحياة لأي من مجموعات العضوية لدينا. طبيعة “سوق المرشدين” لدينا هي أن المستخدمين سيكون لديهم مدرب/مرشد تنضم مجموعته إلى مجموعتهم. قد يجربونه لمدة بضعة أشهر ثم يلغون الاشتراك، ويختارون التسجيل مع مرشد آخر قد يناسب احتياجاتهم أو توقعاتهم بشكل أفضل.
لذلك، سنحتاج إلى مزامنة نشطة (SYNC) بحيث عندما يشترك عضو في مجموعة مخصصة في ووردبريس، يتم إضافته تلقائيًا إلى المجموعة المقابلة في ديسكورش، وإذا ألغى أي شخص عضويته في ووردبريس، سيتم إزالته تلقائيًا من المجموعة في ديسكورش.
إذا كنت ترغب في الحصول على أحدث إصدار من هذا الكود، يمكنك العثور عليه في هذا المستودع: GitHub - paviliondev/discourse-woocommerce · GitHub.
يُستخدم هذا الإصدار في بيئة الإنتاج ولا يزال يعمل كما هو موصوف.
الخطوات
- قم بتثبيت الكود كإضافة في ووردبريس.
- حدّث معرفات المجموعة وخطة العضوية.
- سيتم مزامنة البيانات عند كل تغيير في حالة العضوية.
إذا تمكن أحدكم من توثيق الموضوع الأصلي (OP)، فسأقوم بتحديثه بتعليمات أفضل.
مرحبًا! اشتريت إضافة عضويات ووكومرس. فهي تقوم بكل ما تحتاجه. ثم تحققت لي كل شيء بنجاح. لقد نشرت هنا دليلًا للتكامل الكامل الذي قمت بإعداده ويعمل بشكل كامل.
إذن، هل تقوم بتثبيت الإضافة في المنشور الأصلي أولاً؟
أنا مثلك في أنني أستخدم ووردبريس كمزود لتسجيل الدخول الموحد (SSO)… وليس ديسكورش (كما هو موضح في عنوان هذا الموضوع والمنشور الأصلي)
أعلم أن المنشور الأصلي يتعلق بمزامنة المجموعات عندما يكون Discourse مزوّد SSO، لكن هل من المنطقي تحديث عنوان الموضوع وإدراج تعليمات حول كيفية إجراء هذه المزامنة عندما يكون Wordpress هو مزوّد SSO؟
قدم @Ed_Bobkov بعض التفاصيل حول كيفية إجراء المزامنة مع عكس دور مزوّد SSO…
لذا، للتوضيح فقط…
سيكون من الرائع حقًا ومفيدًا للآخرين على المدى الطويل إذا وُجدت مجموعتان مختلفتان من التعليمات في المنشور الأصلي…
مزامنة عضويات WooCommerce مع مجموعات Discourse عندما:
- يكون Discourse هو مزوّد SSO
- يكون Wordpress هو مزوّد SSO
أنت مخطئ. فأنا أستخدم Discourse كمزوّد لـ SSO. لكن هذا لا يغيّر المعنى.
يمكنك العثور هنا على مواضيع تحتوي على تعليمات عندما يكون WP مزوّدًا لـ SSO.
والأمر الرئيسي هو:
- يمكنك إدارة عضويات المجموعات والاشتراكات والشروط في WordPress باستخدام إضافة “WooCommerce Memberships” في جميع الحالات - سواء كان WP مزوّدًا لـ SSO أو كان Discourse مزوّدًا لـ SSO.
- لمزامنة أعضاء Discourse ومجموعاته مع WordPress، يجب عليك في جميع الحالات استخدام هذه الإضافة: GitHub - discourse/wp-discourse: WordPress plugin that lets you use Discourse as the community engine for a WordPress blog · GitHub. في إعداداتها، يمكنك اختيار نوع التكامل - سواء كان WP أو Discourse هو مزوّد SSO.
كما قد تكون هذه الإضافة مفيدة: GitHub - paviliondev/discourse-woocommerce · GitHub - لتنفيذ المزامنة الدفعية عبر cron، يجب عليك استخدام هذه الإضافة: WP Crontrol – WordPress plugin | WordPress.org
يمكنك العثور على تعليمات مفصلة في هذا الموضوع (أعلى).
هذا الرابط يعطي الآن خطأ 404. هل تم نقله؟
أصبح المنشور الأصلي الآن ويكيًا.
لقد قمت بتحديث المنشور الأصلي برابط لأحدث إصدار من الكود والتعليمات.
آه، لقد نسيت أن أجعله عامًا. شكرًا لك.
@jord8on كما ذكر إد، يجب عليك استخدام إضافة WordPress الرسمية لـ Discourse إذا كان WordPress هو مزود SSO.
أواجه مشكلة فيما يتعلق بتكامل WooCommerce مع Discourse.
إذا اشترى المستخدم عضوية معينة، فسيتم تعيينه تلقائيًا إلى المجموعة المعنية في Discourse.
هذا يعمل بشكل جيد في معظم الحالات.
ولكن في بعض الأحيان، لا يتم ذلك تلقائيًا. على سبيل المثال، تم تعيين 8 من أصل 10 مستخدمين إلى مجموعة Discourse محددة عند شراء العضوية، ولكن لم يتم تعيين المستخدمين الآخرين. لذلك أريد جعله تلقائيًا لجميع المستخدمين.
هل هناك أي اقتراح حول كيفية جعله تلقائيًا بالكامل؟
أهلاً ![]()
هل يمكنك تأكيد كل هذه الأمور لي:
- هل تستخدم Discourse كمزود Discourse Connect الخاص بك (يسجل الأشخاص الدخول باستخدام نموذج تسجيل الدخول الخاص بـ Discourse لتسجيل الدخول إلى Wordpress)
- هل تستخدم إضافة WP Discourse في Wordpress
- هل تستخدم الكود الذي نشرته في المنشور الأول لهذا الموضوع في Wordpress
هل هذا صحيح؟
الخيار الثاني الخاص بك صحيح، أنا أستخدم إضافة discourse، وكما ذكرت، يتم تعيين المستخدمين تلقائيًا إلى مجموعة معينة إذا اشتروا عضوية محددة.
كل شيء يعمل بشكل جيد. فقط أنه بعد بضعة أشهر أو أكثر (بشكل متقطع) تحدث هذه المشكلة وهي أن أحد المستخدمين العشوائيين لا يتم تعيينه إلى مجموعة معينة بعد شراء العضوية.
أريد التخلص من هذه المشكلة التي تحدث بشكل متقطع أيضًا.
إذا كان الخيار الثاني فقط هو الصحيح، فلن تعمل هذه التعليمات معك للأسف. يجب أن تكون جميع الخيارات الثلاثة صحيحة. يبدو أن لديك مزامنة تعمل. فقط حتى أفهم، لديك:
-
المكون الإضافي WP Discourse مثبت؛ و
-
رمز لمزامنة مجموعات WooCommerce الخاصة بك (على سبيل المثال، مثل هذا) ← هل أضفت هذا؟ هل يمكنك مشاركة ما أضفته؟
لا، أعتقد أن المكون الإضافي قام بكل الأتمتة، لا أتذكر وضع أي نوع من التعليمات البرمجية للتكامل
ربما يكون المكون الإضافي الخاص بي بالإصدار 2.2.3، وهو قديم لأن التحديث المتاح هو 2.4.1.
ربما يحدث هذا بسبب هذا الإصدار. لكنني فضولي بعض الشيء بشأن ما إذا كان التحديث سيضر بوظائفي الحالية أم لا.
لكي تتم مزامنة المجموعات بين WooCommerce و Discourse، تحتاج إلى بعض التعليمات البرمجية المخصصة. لن يقوم المكون الإضافي WP Discourse بذلك بنفسه. من المحتمل جدًا أن يكون لديك تطبيق للوظائف الموضحة هنا.
ستحتاج أولاً إلى تحديد كيفية حدوث المزامنة (لا يقتصر الأمر على المكون الإضافي WP Discourse) قبل أن أتمكن من مساعدتك بشكل أكبر.
لقد أضفت رمزًا إلى ووردبريس الخاص بي - الرمز الذي نشره @Ed_Bobkov:
//wp+discourse
use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
const MEMBERSHIP_PLAN_DISCOURSE_GROUP = [
“112” => “41”
];
//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', 'The WP Discourse plugin has not been properly configured.' );
}
$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', '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 && 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’);
لقد أضفت وقمت بتشغيل run_full_wc_membership_sync عبر WP Crontrol أيضًا.
للأسف… لم تتم إضافة مستخدم ووردبريس لديه عضوية نشطة (معرف 112) إلى مجموعة discourse (معرف 41). ماذا فاتني هنا؟
نظرًا لأن هذا الأمر يربك الناس باستمرار، سأنشر دليلًا كاملاً حول كيفية مزامنة عضوية WooCommerce (سواء كان Wordpress أو Discourse هو موفر DiscourseConnect)
. يرجى التحقق هنا في بداية الأسبوع المقبل إذا لم أكن قد قمت بتنبيهك بشأنه بالفعل.
شكرا لك! حاولت فقط معرفة ذلك… لقد استخدمت حتى إضافة GitHub - paviliondev/discourse-woocommerce ولكن لم أنجح أيضًا