Aggiungere gruppi e categorie (con sicurezza) con WP-Discourse o l'API?

Gestiamo un’iscrizione tramite il nostro sistema Wordpress/Woocommerce. Utilizziamo Discourse su un sottodominio con SSO da un paio d’anni e ha funzionato benissimo. Ho del codice nel mio file functions che aggiunge/rimuove l’accesso ai Gruppi quando una persona si iscrive/cancella rispettivamente.

Abbiamo aggiunto una funzionalità alla nostra iscrizione in cui le persone possono unirsi a un piccolo gruppo di 6-8 persone per chiamate Zoom settimanali.

Per gestire questo, abbiamo creato un Tipo di Post di WordPress chiamato “Cohorts” che contiene le informazioni sulle chiamate settimanali e quindi abbiamo assegnato tali Cohorts a un Utente utilizzando campi utente personalizzati.

Ecco cosa vorrei fare:

  1. Creare un Gruppo per ciascuna delle Cohorts
  2. Creare una Sottocategoria per ciascuna delle Cohorts a cui solo il Gruppo del punto n. 1 ha accesso.
  3. Inserire ciascuno dei Membri nel rispettivo Gruppo, il che darà loro accesso alla loro sottocategoria per la loro Cohort.

So come fare il punto 3, ma c’è un modo per aggiungere programmaticamente Gruppi e Sottocategorie (con le impostazioni di sicurezza)?

Non riesco a trovare questa funzionalità nelle utility di WP-Discourse. Inoltre, guardando l’API, vedo dove aggiungere categorie, ma non le funzioni di sicurezza.

È possibile fare quello che voglio?

Sì, è possibile. Puoi effettuare qualsiasi richiesta API a Discourse da WordPress utilizzando il metodo di utilità discourse_request, ad esempio:

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

Questo formatterà correttamente la richiesta e utilizzerà la chiave API e l’utente che hai fornito nelle impostazioni di WP Discourse. Avrai bisogno di una chiave globale per le azioni a cui ti riferisci (se stai usando la stessa chiave anche per la normale funzionalità di wp discourse).

Creazione di un gruppo

L’endpoint che desideri è questo: Discourse API Docs. Non c’è un elenco completo dei parametri nella documentazione API, ma li troverai qui: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Creazione di una categoria

L’endpoint che desideri è questo: Discourse API Docs. Allo stesso modo, l’elenco completo dei parametri è qui: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Nota che le “impostazioni di sicurezza” sono gestite tramite il parametro permissions. Devi solo fornirgli un oggetto con i nomi dei gruppi come chiavi e interi dei livelli di permesso come valori, ad esempio:

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

L’elenco degli interi dei livelli di permesso si trova qui: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 Mi Piace

@Angus, grazie mille! Era esattamente quello di cui avevo bisogno!

Sono stato in grado di creare i miei gruppi, assegnare utenti ai gruppi e creare le categorie con la sicurezza appropriata.

Apprezzo molto il tuo aiuto.

Un’altra domanda però… quando ho provato a eseguire una PUT per aggiornare una Categoria o un Gruppo, ricevo questo errore:

Errore fatale: Uncaught Error: Call to undefined function wp_remote_put() in […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

Ecco il mio codice di test che tenta di aggiornare la categoria ID 61 con un nuovo nome:

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

Cosa sto sbagliando?

Qualche idea? Grazie mille!

Mi dispiace Tim, sono stato via negli ultimi giorni. Sembra che il metodo discourse_request debba essere modificato per supportare questo. Farò una PR la prossima settimana e probabilmente ci vorrà un’altra settimana per l’unione.

Se lo vuoi prima, puoi usare i metodi WP sottostanti in questo modo:

$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( /* specifico per l'endpoint che stai usando */ );
$url = /* L'URL assoluto per l'endpoint che stai usando */ ;

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

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

Ciao @timgrahl, saresti in grado di condividere una funzione funzionante per WordPress con WooCommerce per aggiungere/rimuovere utenti ai gruppi?

Sto usando WooCommerce con gli abbonamenti e sto cercando di far funzionare questo… se l’utente WordPress ha un abbonamento WooCommerce attivo, allora l’utente verrà aggiunto al gruppo X… quando l’abbonamento viene annullato o scade, l’utente viene rimosso dal gruppo X

Ciao Tom, per sincronizzare i gruppi di Discourse con le membership di WooCommerce, dovrai utilizzare l’approccio descritto qui:

Sì, l’ho visto… ma ancora troppo stupido per creare uno snippet di codice per quello :confused: