Je cherchais une fonctionnalité d’API permettant, pour une adresse e-mail donnée, d’ajouter un utilisateur à un ou deux groupes et de l’inviter au forum s’il ne possédait pas encore de compte. Je n’ai pas trouvé cette fonctionnalité, mais j’ai remarqué que c’est exactement ce que fait la fonction d’invitation par « téléchargement en masse ». Cela n’est pas documenté dans l’API, mais c’est ce que fait le navigateur.
J’ai donc fait de même, en utilisant le code PHP suivant pour envoyer un fichier CSV via POST :
Cela a très bien fonctionné pendant quelques mois, mais cela a récemment cessé de fonctionner, avec l’erreur suivante dans les journaux de Discourse : Impossible de vérifier l'authenticité du jeton CSRF.
S’agit-il d’un bug, alors que je devrais être authentifié via la clé API ? Ou suis-je en train de chercher une solution perdue en tentant d’utiliser des parties non documentées de l’API ?
Je me demandais juste si quelqu’un pouvait confirmer s’il s’agit d’un bug susceptible d’être corrigé ou non ? Je vais de toute façon commencer à chercher une solution de rechange.
Salut, merci d’avoir regardé. J’ai réussi à bricoler quelque chose avec l’API documentée (en insistant sur le mot « bricoler », mais peut-être que cela sera utile à quelqu’un d’autre) :
function tidal_process_order( $order_id ){
$order = new WC_Order($order_id);
$order_email = $order->get_billing_email();
$group_names_arr = [];
// récupérer les SKU en tant que noms de groupes
foreach ( $order->get_items() as $item ) {
if ( $item['product_id'] > 0 ) {
$_product = $item->get_product();
$sku = $_product->get_sku();
array_push($group_names_arr, $sku);
}
}
$group_names = join(",",$group_names_arr);
// vérifier si l'utilisateur Discourse existe déjà avec l'email
$r=wp_remote_get( "https://club.tidalcycles.org/admin/users/list/all.json?email=$order_email", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted')
)
);
$matches = json_decode($r['body']);
if (count($matches) > 0) {
// l'utilisateur existe, l'ajouter aux groupes
$user_id = $matches[0]->id;
foreach($group_names_arr as $group) {
// récupérer l'ID du groupe à partir du nom
$r=wp_remote_get( "https://club.tidalcycles.org/groups/$group.json", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted')
)
);
$group = json_decode($r['body']);
$body = json_encode(array('group_id' => $group->group->id));
// ajouter l'utilisateur au groupe
$r=wp_remote_post( "https://club.tidalcycles.org/admin/users/$user_id/groups", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted',
'Content-Type' => 'application/json',
),
'body' => $body
));
}
}
else {
// l'utilisateur n'existe pas, l'inviter avec les noms de groupes
$body = json_encode(array('email' => $order_email, 'group_names' => $group_names, "custom_message" => "Bienvenue !"));
$r=wp_remote_post( "https://club.tidalcycles.org/invites", array(
'headers' => array('Api-key' => 'redacted',
'Api-Username' => 'redacted',
'Content-Type' => 'application/json',
),
'body' => $body
));
};
}
add_action( 'woocommerce_order_status_processing', 'tidal_process_order' );