Ajouter des groupes et des catégories (avec sécurité) avec WP-Discourse ou l'API ?

Nous gérons une adhésion via notre système Wordpress/Woocommerce. Nous utilisons Discourse sur un sous-domaine avec le SSO depuis quelques années et cela fonctionne très bien. J’ai du code dans mon fichier de fonctions qui ajoute/supprime l’accès aux groupes lorsque la personne adhère/annule respectivement.

Nous avons ajouté une fonctionnalité à notre adhésion où les gens peuvent rejoindre un petit groupe de 6 à 8 personnes pour des appels Zoom hebdomadaires.

Pour gérer cela, nous avons créé un type de publication Wordpress appelé « Cohortes » qui contient les informations sur les appels hebdomadaires, puis nous avons attribué ces Cohortes à un utilisateur en utilisant des champs utilisateur personnalisés.

Voici ce que j’aimerais faire :

  1. Créer un groupe pour chacune des Cohortes.
  2. Créer une sous-catégorie pour chacune des Cohortes auxquelles seul le groupe de #1 a accès.
  3. Placer chacun des membres dans son groupe respectif, ce qui leur donnera accès à leur sous-catégorie pour leur cohorte.

Je sais comment faire le #3, mais existe-t-il un moyen d’ajouter par programmation des groupes et des sous-catégories (avec les paramètres de sécurité) ?

Je n’ai pas trouvé cette fonctionnalité dans les utilitaires WP-Discourse. De plus, en examinant l’API, je peux voir où ajouter des catégories, mais pas les fonctions de sécurité.

Est-ce que ce que je veux faire est possible ?

Oui, c’est possible. Vous pouvez faire n’importe quelle requête API à Discourse depuis WordPress en utilisant la méthode utilitaire discourse_request, c’est-à-dire

use WPDiscourse\Utilities\Utilities as DiscourseUtilities;
$args =  array(
   "body" => "",
   "type" => "post"
);
$response = DiscourseUtilities::discourse_request( $path, $args );

Cela formatera correctement la requête et utilisera la clé API et l’utilisateur que vous avez fournis dans les paramètres de WP Discourse. Vous aurez besoin d’une clé globale pour les actions auxquelles vous faites référence (si vous utilisez également la même clé pour la fonctionnalité normale de wp discourse).

Créer un groupe

Le point de terminaison que vous voulez est celui-ci : Discourse API Docs. Il n’y a pas de liste complète des paramètres dans la documentation de l’API, mais vous les trouverez ici : discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Créer une catégorie

Le point de terminaison que vous voulez est celui-ci : Discourse API Docs. De même, la liste complète des paramètres se trouve ici : discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Notez que les « paramètres de sécurité » sont gérés via le paramètre permissions. Il vous suffit de lui donner un objet avec les noms de groupe comme clés et les entiers de niveau de permission comme valeurs, par exemple

{
  "cohort1": 2,
  "staff": 1
}

Vous trouverez la liste des entiers de niveau de permission ici : discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 « J'aime »

@Angus, merci beaucoup ! C’était exactement ce dont j’avais besoin !

J’ai pu créer mes groupes, attribuer des utilisateurs aux groupes et créer les catégories avec la sécurité appropriée.

J’apprécie vraiment votre aide.

Cependant, j’ai une autre question… lorsque j’ai essayé d’exécuter une commande PUT pour mettre à jour une catégorie ou un groupe, j’obtiens cette erreur :

Erreur fatale : Appel non défini de la fonction Error: Call to undefined function wp_remote_put() in […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

Voici mon code de test pour essayer de mettre à jour la catégorie ID 61 avec un nouveau nom :

$path = "/categories/61.json";
$args =  array(
            "type" => "put",
            "body" => array (
                "name" => "Cohorts 1",
            )
        );
$response = DiscourseUtilities::discourse_request( $path, $args )

Qu’est-ce que je fais de mal ?

Des idées ici ? Merci beaucoup !

Désolé Tim, je suis absent depuis quelques jours. Il semble que la méthode discourse_request doive être ajustée pour prendre en charge cela. Je ferai une PR pour cela la semaine prochaine et il faudra probablement une autre semaine pour qu’elle soit fusionnée.

Si vous le souhaitez plus tôt, vous pouvez utiliser les méthodes WP sous-jacentes comme ceci :

$api_credentials = DiscourseUtilities::get_api_credentials();
if ( is_wp_error( $api_credentials ) ) {
    return $api_credentials;
}

$headers = array(
    'Api-Key'      => sanitize_key( $api_credentials['api_key'] ),
    'Api-Username' => sanitize_text_field( $api_credentials['api_username'] ),
    'Accept'       => 'application/json',
);
$body = array( /* spécifique au point de terminaison que vous utilisez */ );
$url = /* L'URL absolue du point de terminaison que vous utilisez */ ;

$opts = array(
   'headers' => $headers,
   'body'    => json_encode( $body ),
   'method'  => 'PUT'
);

$result =  wp_remote_request( $url, $opts );

Salut @timgrahl, pourriez-vous partager une fonction fonctionnelle pour Wordpress avec Woocommerce pour ajouter/supprimer des utilisateurs aux groupes ?

J’utilise Woocommerce avec les adhésions et j’essaie de faire fonctionner ceci… si l’utilisateur Wordpress a une adhésion Woocommerce active, alors l’utilisateur sera ajouté au groupe X… lorsque l’adhésion est annulée ou expirée, l’utilisateur est retiré du groupe X.

Salut Tom, pour synchroniser les groupes Discourse avec les adhésions WooCommerce, vous voudrez utiliser l’approche décrite ici :

Ouais, j’ai vu ça… mais toujours trop bête pour créer un extrait de code pour ça :confused: