Adicionar Grupos e Categorias (com segurança) com WP-Discourse ou a API?

Executamos uma assinatura através do nosso sistema Wordpress/Woocommerce. Temos usado o Discourse em um subdomínio com o SSO há alguns anos e tem funcionado muito bem. Tenho código no meu arquivo de funções que adiciona/remove acesso a Grupos quando a pessoa entra/cancela, respectivamente.

Adicionamos um recurso em nossa assinatura onde as pessoas podem entrar em um pequeno grupo de 6-8 pessoas para chamadas semanais no Zoom.

Para gerenciar isso, criamos um Tipo de Postagem do WordPress chamado “Cohorts” que contém as informações das chamadas semanais e, em seguida, atribuímos esses Cohorts a um Usuário usando campos de usuário personalizados.

É isso que eu gostaria de fazer:

  1. Criar um Grupo para cada um dos Cohorts
  2. Criar uma Subcategoria para cada um dos Cohorts que apenas o Grupo do item #1 tenha acesso.
  3. Colocar cada um dos Membros em seu respectivo Grupo, o que lhes dará acesso à sua subcategoria para seu Cohort.

Eu sei como fazer o #3, mas existe uma maneira de adicionar programaticamente Grupos e Subcategorias (com as configurações de segurança)?

Não consigo encontrar essa funcionalidade nas utilidades do WP-Discourse. Além disso, olhando a API, vejo onde adicionar categorias, mas não as funções de segurança.

É possível fazer o que eu quero?

Sim, é possível. Você pode fazer qualquer solicitação de API para o Discourse a partir do WordPress usando o método de utilidade discourse_request, ou seja,

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

Isso formatará a solicitação corretamente e usará a chave de API e o usuário que você forneceu nas configurações do WP Discourse. Você precisará de uma chave global para as ações a que se refere (se você também estiver usando a mesma chave para a funcionalidade normal do wp discourse).

Criando um grupo

O endpoint que você deseja é este: Discourse API Docs. Não há uma lista completa dos parâmetros na documentação da API, mas você os encontrará aqui: discourse/app/controllers/admin/groups_controller.rb at main · discourse/discourse · GitHub

Criando uma categoria

O endpoint que você deseja é este: Discourse API Docs. Da mesma forma, a lista completa de parâmetros está aqui: discourse/app/controllers/categories_controller.rb at main · discourse/discourse · GitHub

Observe que as “configurações de segurança” são tratadas através do parâmetro permissions. Você só precisa fornecer um objeto com nomes de grupos como chaves e inteiros de nível de permissão como valores, por exemplo,

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

Você encontrará a lista de inteiros de nível de permissão aqui: discourse/app/models/category_group.rb at main · discourse/discourse · GitHub

2 curtidas

@Angus, muito obrigado! Era exatamente o que eu precisava!

Consegui criar meus grupos, atribuir usuários aos grupos e criar as categorias com a segurança adequada.

Agradeço muito sua ajuda.

Mais uma pergunta… quando tentei executar um PUT para atualizar uma Categoria ou Grupo, recebi este erro:

Erro fatal: Chamada indefinida para a função wp_remote_put() em […]/public/wp-content/plugins/wp-discourse/lib/plugin-utilities.php:393

Aqui está meu código de teste tentando atualizar a categoria ID 61 com um novo nome:

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

O que estou fazendo de errado?

Alguma ideia aqui? Muito obrigado!

Desculpe Tim, estive fora nos últimos dias. Parece que o método discourse_request precisa de ajustes para dar suporte a isso. Farei um PR para isso na próxima semana e provavelmente levará mais uma semana para ser mesclado.

Se você quiser antes disso, pode usar os métodos WP subjacentes assim:

$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 para o endpoint que você está usando */ );
$url = /* A URL absoluta para o endpoint que você está usando */ ;

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

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

Olá @timgrahl, você seria capaz de compartilhar uma função funcional para Wordpress com Woocommerce para adicionar/remover usuários a grupos?

Estou usando Woocommerce com assinaturas e tentando fazer isso funcionar… se o usuário do Wordpress tiver uma assinatura ativa do Woocommerce, o usuário será adicionado ao grupo X… quando a assinatura for cancelada ou expirar, o usuário será removido do grupo X

Olá Tom, para sincronizar grupos do Discourse com associações do WooCommerce, você vai querer usar a abordagem descrita aqui:

Sim, eu vi isso… mas ainda muito burro para criar um trecho de código para isso :confused: