Hier ist Angus’ Code, aktualisiert für die Header-basierte Authentifizierung. Ich habe keine weiteren Änderungen daran vorgenommen. Ich habe den Code auch nicht getestet. Ich werde den ursprünglichen Beitrag erst aktualisieren, wenn jemand Gelegenheit hat, ihn zu testen.
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', 'Das WP Discourse-Plugin wurde nicht ordnungsgemäß konfiguriert.' );
}
$user_info = get_userdata( $user_id );
$user_email = $user_info->user_email;
$logger = wc_get_logger();
$logger->info( sprintf( '%s Mitgliedschaft von %s geändert auf %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( 'Sende %s-Anfrage an %s mit %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( 'Antwort von 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', 'Beim Abrufen der Benutzerdaten von Discourse ist ein Fehler aufgetreten.' );
}
}
function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();
$logger->info( sprintf( 'Führe handle_wc_membership_saved aus: %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 );
Der Code setzt eine Variable $discourse_user_id, die jedoch nirgendwo verwendet wird. Sie könnte wahrscheinlich aus dem Code entfernt werden.
Da bin ich mir nicht so sicher. Der Code hookt in den wc_memberships_user_membership_saved-Action-Hook ein. Es ist wahrscheinlich, dass dieser Hook vom WooCommerce Memberships-Plugin hinzugefügt wird. Im WooCommerce Groups-Plugin gibt es wahrscheinlich einen ähnlichen Hook, aber er hat wahrscheinlich nicht denselben Namen und dieselben Parameter.