Quel est le problème avec ma requête cURL ?

Bonjour ! J’essaie d’écrire une requête cURL pour mon site Wordpress afin d’intégrer Discourse avec les abonnements woo. Voici ma fonction, qui ne semble pas fonctionner. Est-ce que quelque chose me manque ?

function execute_discourse_curl_request($subscription) {

    $subscription_status = $subscription->get_status();

    $user_id = $subscription->get_user_id();
    $user = get_user_by('ID', $user_id);
    $username = $user->user_login;

    $request = "";

    if ($subscription_status == 'active') {
        $request = "PUT";
    }

    if ($subscription_status == 'cancelled' || $subscription_status == 'on-hold') {
        $request = "DELETE";
    }

    $api_key = get_option( 'discourse_custom_api_key' );

    $group_id = 41;
    $api_url = 'https://forum.example.com/groups/' . $group_id . '/members.json';
    
    $data = [
        'usernames' => [$username],
    ];
    
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $request,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => [
            "Api-Key: " . $api_key,
            "Api-Username: system",
            "Content-Type: application/json"
        ],
    ]);
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);

    if ($err) {
        $to = 'hello@example.com';
        $subject = 'Error in Discourse User Update cURL Request';
        $message = 'There was an error';
        wp_mail($to, $subject, $message);
    }
}
1 « J'aime »

Bonjour,

Quelle erreur recevez-vous ? Que renvoie la réponse ?
Cela devrait aider à comprendre le problème.

Le problème est que je ne reçois aucune erreur ni confirmation. Il semble que le cURL ne fonctionne tout simplement pas. Je peux voir que la clé API Discourse a été utilisée lors de l’exécution du cURL, donc il y a eu un certain succès, mais l’utilisateur n’est ni ajouté ni supprimé du groupe comme prévu. Je peux confirmer que les variables sont toutes correctes cependant.

Il devrait retourner une charge utile en cas de succès ou d’échec.

Avez-vous vérifié le contenu de $response ?

De plus, je pense que le format du paramètre usernames devrait être une chaîne de caractères “username1,username2,...” à la place.

1 « J'aime »

Sauf si je fais quelque chose de mal, la requête à /groups/${group_id}/members.json est un peu peu intuitive. Elle ne semble pas non plus être documentée et ne peut pas être vue dans l’onglet réseau du navigateur lors de la soumission du formulaire “Ajouter un utilisateur” de Discourse sur la page d’un groupe. Encore une fois, je pourrais faire quelque chose de mal.

Dans tous les cas, le chemin de la requête est /groups/${group_id}/members.json, avec l’ID numérique du groupe substitué à group_id. Le corps de la requête nécessite un paramètre group_id, mais ce paramètre doit être défini sur le name du groupe. Les arguments deviennent donc quelque chose comme ceci :

$group_id = 45;
$group_name = 'publishers';
$args     = array(
    'method' => 'DELETE', // ou 'PUT'
	'body'   => array(
		// 'group_id'  => $group_name, edit: ce paramètre n'est pas nécessaire, je ne sais pas ce qui se passait quand je le testais.
		'usernames' => 'sally,Ben',
	)
);

// chemin :
/groups/${group_id}/members.json

Si vous avez le plugin WP Discourse configuré sur votre site WordPress, vous pouvez utiliser sa fonction d’aide statique discourse_request pour éviter d’avoir à utiliser curl. Notez que j’ai lié la fonction statique qui se trouve dans le fichier plugin-utilities, mais l’espace de noms que vous devez utiliser pour les requêtes externes provient de https://github.com/discourse/wp-discourse/blob/main/lib/utilities.php.

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;

function zalg_add_users_to_group() {
	$group_id = 45;
    $group_name = 'publishers';
    $method = 'PUT'; // 'PUT' pour ajouter des utilisateurs ; 'DELETE' pour supprimer des utilisateurs
	$args     = array(
		'method' => $method,
		'body'   => array(
			// 'group_id'  => $group_name, edit: ce paramètre n'est pas nécessaire
			'usernames' => 'sally,Ben',
		)
	);
	$response = DiscourseUtilities::discourse_request( "/groups/${group_id}/members.json", $args );
    // retourner, enregistrer ou gérer la réponse
}

Si vous utilisez WordPress comme fournisseur SSO pour Discourse, il existe une fonction d’aide qui vous permet d’ajouter un utilisateur à un ou plusieurs groupes :

function zalg_sso_add_users_to_group() {
    $user_id = 1; // l'ID utilisateur WordPress
    $group_names = 'foo,bar,baz'; // un ou plusieurs noms de groupe séparés par des virgules, sans espaces après les virgules !
    DiscourseUtilities::add_user_to_discourse_group($user_id, $group_names);
}

Pour ajouter plusieurs utilisateurs à un seul groupe, vous devrez toujours utiliser la méthode discourse_request qui se trouve dans le premier exemple de code.

3 « J'aime »

La réponse n’est qu’une erreur 500 :frowning:

C’est une aide héroïque, merci Simon ! Ce serait beaucoup plus facile si je pouvais utiliser les fonctions d’aide existantes dans le plugin WP Discourse. J’utilise mon site Wordpress pour l’authentification unique (SSO).

Cependant, j’obtiens toujours une erreur critique dans mon cas lorsque la fonction est déclenchée. Je ne sais pas pourquoi. Ce que vous dites est un peu au-dessus de mes compétences, mais voici ce que j’utilise dans mon functions.php :

<?php

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;

add_action('woocommerce_subscription_status_cancelled', 'zalg_sso_add_users_to_group', 10, 3);

function zalg_sso_add_users_to_group($subscription) {
    $user_id = $subscription->get_user_id();
    $group_names = 'premium';
    DiscourseUtilities::remove_user_to_discourse_group($user_id, $group_names);
}

Je ne sais pas ce qui me manque ?

La fonction pour supprimer un utilisateur d’un ou plusieurs groupes s’appelle remove_user_from_discourse_group, vous l’avez appelée remove_user_to_discourse_group.

Les fonctions pour ajouter et supprimer un utilisateur d’un ou plusieurs groupes se trouvent ici : wp-discourse/lib/utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub.

3 « J'aime »

Vous avez raison ! Grosse erreur stupide. Merci pour votre aide Simon. J’aimerais qu’il y ait une tirelire. Faites-moi savoir s’il y a quoi que ce soit que je puisse faire pour vous. Santé !

1 « J'aime »

Pour approfondir, savez-vous où je pourrais trouver des fonctions d’aide pour modifier davantage le profil utilisateur ? Ce serait formidable si je pouvais définir la photo de profil et la biographie de l’utilisateur si possible.

Il existe une fonction d’aide dans le fichier Utilities pour cela :

DiscourseUtilities::sync_sso_record( $sso_params );

Hier, j’ai posté un exemple sur la façon de l’utiliser : I cannot add user to the discouse forum from a wordpress website when user added in a membership - #10 by simon. La partie délicate est de créer le tableau pour l’argument sso_params. Ce tableau doit contenir le champ external_id. Il est défini sur l’ID WordPress de l’utilisateur :

	$sso_params = array(
		'external_id' => $user_id,
	);

Vous pouvez inclure n’importe quel champ de cette liste dans la charge utile : discourse/lib/discourse_connect_base.rb at 8f52fd1051e20fdff41321c5cff99fda05af86c1 · discourse/discourse · GitHub. Notez le tableau BOOLS qui est affiché juste sous la liste ACCESSORS que j’ai liée. Il indique quelles options possibles sont des booléens (vrai/faux). Lors de la création de requêtes depuis WordPress, tous les champs booléens doivent être définis avec les chaînes 'true' ou 'false', et non avec les valeurs PHP true ou false.

Pour mettre à jour l’avatar, définissez le champ avatar_url dans le tableau $sso_params et définissez également le champ avatar_force_update sur 'true'.

Il existe un champ bio qui peut être utilisé pour définir la biographie.

Le plugin WP Discourse définit déjà les champs bio et avatar_url. Il dispose également d’un paramètre « Forcer la mise à jour de l’avatar » dans ses paramètres SSO. Le problème pourrait être que ces paramètres ne sont mis à jour que lorsqu’un utilisateur se connecte à Discourse via le site WordPress. La fonction sync_sso_record met à jour les champs immédiatement, sans obliger l’utilisateur à se connecter à Discourse.

De plus, si vous constatez que les biographies des utilisateurs ne sont pas définies sur Discourse, il se pourrait qu’elles ne soient pas définies sur votre site WordPress où le plugin s’attend à les trouver : wp-discourse/lib/plugin-utilities.php at 99325e15190f3a705284dbf582f1c4b2c0b21492 · discourse/wp-discourse · GitHub. Si Woocommerce a un champ différent pour les biographies, vous pourriez accéder à ce champ et l’utiliser dans un appel à sync_sso_record.

3 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.