这是 Angus 的代码,已更新为使用基于头的身份验证。我没有对其做任何其他更改,也尚未测试该代码。在有人有机会测试之前,我不会更新原帖。\n\nphp\nuse WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;\n\nconst MEMBERSHIP_PLAN_ID = 35;\nconst DISCOURSE_GROUP_ID = 41;\nconst ACTIVE_STATUSES = array( 'wcm-active' );\n\nfunction update_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status ) {\n\t$options = DiscourseUtilities::get_options();\n\t$base_url = $options['url'];\n\t$api_key = $options['api-key'];\n\t$api_username = $options['publish-username'];\n\n\tif ( empty( $base_url ) || empty( $api_key ) || empty( $api_username ) ) {\n\t\treturn new \\WP_Error( 'discourse_configuration_error', 'WP Discourse 插件未正确配置。' );\n\t}\n\n\t$user_info = get_userdata( $user_id );\n\t$user_email = $user_info->user_email;\n\t$logger = wc_get_logger();\n\n\t$logger->info( sprintf( '%s 的 %s 会员资格已更改为 %s', $user_email, $membership_plan_name, $status ) );\n\n\tif ( in_array( $status, ACTIVE_STATUSES ) ) {\n\t\t$action = 'PUT';\n\t} else {\n\t\t$action = 'DELETE';\n\t}\n\n\t$external_url = esc_url_raw( $base_url . "/groups/" . DISCOURSE_GROUP_ID . "/members" );\n\n\t$logger->info( sprintf( '正在向 %s 发送 %s 请求,用户邮箱为 %s', $action, $external_url, $user_email ) );\n\n\t$response = wp_remote_request( $external_url,\n\t\tarray(\n\t\t\t'method' => $action,\n\t\t\t'headers' => array(\n\t\t\t\t'Api-Key' => sanitize_key( $api_key ),\n\t\t\t\t'Api-Username' => sanitize_text_field( $api_username ),\n\t\t\t),\n\t\t\t'body' => array( 'user_emails' => $user_email ),\n\t\t)\n\t);\n\n\t$logger->info( sprintf( 'Discourse 响应:%s %s',\n\t\twp_remote_retrieve_response_code( $response ),\n\t\twp_remote_retrieve_response_message( $response ) ) );\n\n\tif ( ! DiscourseUtilities::validate( $response ) ) {\n\n\t\treturn new \\WP_Error( 'discourse_response_error', '从 Discourse 获取用户数据时发生错误。' );\n\t}\n}\n\nfunction handle_wc_membership_saved( $membership_plan, $args ) {\n\t$logger = wc_get_logger();\n\n\t$logger->info( sprintf( '正在执行 handle_wc_membership_saved,用户 ID: %s,会员 ID: %s,是否为更新: %s', $args['user_id'], $args['user_membership_id'], $args['is_update'] ) );\n\n\t$user_id = $args['user_id'];\n\t$membership = wc_memberships_get_user_membership( $args['user_membership_id'] );\n\t$membership_plan_id = $membership->plan->id;\n\n\tif ( $membership && $membership_plan_id == MEMBERSHIP_PLAN_ID ) {\n\t\t$membership_plan_name = $membership_plan->name;\n\t\t$status = $membership->status;\n\t\tupdate_discourse_group_access( $user_id, $membership_plan_id, $membership_plan_name, $status );\n\t}\n}\nadd_action( 'wc_memberships_user_membership_saved', 'handle_wc_membership_saved', 10, 2 );\n\n\n代码中设置了 $discourse_user_id 变量,但该变量并未在任何地方使用。可能可以从代码中将其移除。\n\n[quote=“Ed_Bobkov, post:8, topic:118485”]\n我安装了一个 WP 插件“WooCommerce Groups”:Groups WooCommerce Archives - WooCommerce Docs 。它与 WooCommerce Memberships 类似,但功能较少。我认为所有核心功能都是相同的。\n[/quote]\n\n我对此不太确定。该代码挂钩到 wc_memberships_user_membership_saved 动作钩子。看起来该钩子很可能由 WooCommerce Memberships 插件添加。WooCommerce Groups 插件中可能也有类似的钩子,但不太可能具有相同的名称和参数。
3 个赞