إليك كود أنغوس، المحدث لاستخدام المصادقة القائمة على الترويسة. لم أقم بإجراء أي تغييرات أخرى عليه. كما أنني لم أختبر الكود. لن أقوم بتحديث المنشور الأصلي (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، لكن من غير المرجح أن يحمل نفس الاسم ونفس المعاملات.