¿Añadir grupos y categorías (con seguridad) con WP-Discourse o la API?

Ejecutamos una membresía a través de nuestro sistema Wordpress/Woocommerce. Hemos estado usando Discourse en un subdominio con el SSO durante un par de años y ha estado funcionando muy bien. Tengo código en mi archivo de funciones que agrega/elimina el acceso al Grupo cuando la persona se une/cancela respectivamente.

Hemos agregado una función en nuestra membresía donde las personas pueden unirse a un pequeño grupo de 6-8 personas para llamadas semanales de Zoom.

Para administrar esto, hemos creado un Tipo de Publicación de Wordpress llamado “Cohortes” que contiene la información de la llamada semanal y luego hemos asignado esas Cohortes a un Usuario utilizando campos de usuario personalizados.

Esto es lo que me gustaría hacer:

  1. Crear un Grupo para cada una de las Cohortes.
  2. Crear una Subcategoría para cada una de las Cohortes a la que solo el Grupo del punto #1 tenga acceso.
  3. Poner a cada uno de los Miembros en su Grupo respectivo, lo que les dará acceso a su subcategoría para su Co horte.

Sé cómo hacer el punto #3, pero ¿hay alguna forma de agregar programáticamente Grupos y Subcategorías (con la configuración de seguridad)?

No puedo encontrar esta funcionalidad en las utilidades de WP-Discourse. Además, al observar la API, puedo ver dónde agregar categorías, pero no las funciones de seguridad.

¿Es posible lo que quiero hacer?

Sí, es posible. Puedes hacer cualquier solicitud de API a Discourse desde WordPress usando el método de utilidad discourse_request, es decir:

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

Esto formateará la solicitud correctamente y utilizará la clave API y el usuario que has proporcionado en la configuración de WP Discourse. Necesitarás una clave global para las acciones a las que te refieres (si también estás usando la misma clave para la funcionalidad normal de WP Discourse).

Creación de un grupo

El endpoint que deseas es este: Discourse API Docs. No hay una lista completa de los parámetros en la documentación de la API, pero los encontrarás aquí: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Creación de una categoría

El endpoint que deseas es este: Discourse API Docs. Del mismo modo, la lista completa de parámetros está aquí: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Ten en cuenta que la “configuración de seguridad” se maneja a través del parámetro permissions. Solo necesitas darle un objeto con los nombres de los grupos como claves y enteros de nivel de permiso como valores, por ejemplo:

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

Encontrarás la lista de enteros de nivel de permiso aquí: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 Me gusta

@Angus, ¡muchas gracias! ¡Esto era exactamente lo que necesitaba!

Pude crear mis grupos, asignar usuarios a grupos y crear las categorías con la seguridad adecuada.

Realmente aprecio tu ayuda.

Sin embargo, tengo otra pregunta… cuando intenté ejecutar un PUT para actualizar una categoría o grupo, recibo este error:

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

Aquí está mi código de prueba intentando actualizar la categoría ID 61 con un nuevo nombre:

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

¿Qué estoy haciendo mal?

¿Alguna idea aquí? ¡Muchas gracias!

Lo siento Tim, he estado ausente los últimos días. Parece que el método discourse_request necesita ser ajustado para soportar esto. Haré un PR para eso la próxima semana y probablemente tardará otra semana en fusionarse.

Si lo quieres antes, puedes usar los métodos WP subyacentes de esta manera:

$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( /* específico del endpoint que estás usando */ );
$url = /* La URL absoluta para el endpoint que estás usando */;

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

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

Hola @timgrahl, ¿podrías compartir una función que funcione para WordPress con WooCommerce para agregar/eliminar usuarios a grupos?

Estoy usando WooCommerce con membresías y tratando de hacer que esto funcione… si el usuario de WordPress tiene una membresía activa de WooCommerce, entonces el usuario se agregará al grupo X… cuando la membresía se cancele o expire, el usuario se eliminará del grupo X.

Hola Tom, para sincronizar grupos de Discourse con membresías de WooCommerce, querrás usar el enfoque descrito aquí:

Sí, lo vi… pero todavía demasiado tonto para crear un fragmento de código para eso :confused: