Aquí está el código de Angus, actualizado para usar autenticación basada en encabezados. No he realizado ningún otro cambio en él. Tampoco he probado el código. No actualizaré la publicación original hasta que alguien tenga la oportunidad de probarlo.
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', 'El plugin WP Discourse no se ha configurado correctamente.' );
}
$user_info = get_userdata( $user_id );
$user_email = $user_info->user_email;
$logger = wc_get_logger();
$logger->info( sprintf( 'La membresía de %s de %s ha cambiado a %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( 'Enviando solicitud %s a %s con %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( 'Respuesta de 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', 'Ha ocurrido un error al recuperar los datos del usuario de Discourse.' );
}
}
function handle_wc_membership_saved( $membership_plan, $args ) {
$logger = wc_get_logger();
$logger->info( sprintf( 'Ejecutando 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 );
El código está definiendo una variable $discourse_user_id, pero esa variable no se utiliza en ningún lugar. Probablemente podría eliminarse del código.
No estoy tan seguro de eso. El código se conecta al hook de acción wc_memberships_user_membership_saved. Parece probable que ese hook sea añadido por el plugin WooCommerce Memberships. Probablemente haya un hook similar disponible en el plugin WooCommerce Groups, pero es poco probable que tenga el mismo nombre y parámetros.