Sincronização bidirecional entre nome de usuário do WP Discourse e nome de usuário do Discourse?

Recentemente, minha equipe e eu temos trabalhado em um recurso que permite que o nome de usuário do Discourse de um usuário seja editado a partir do WordPress com o plugin WP Discourse instalado e nosso site WordPress configurado como provedor SSO para o Discourse. Atualmente, tivemos algum sucesso usando a API do Discourse, onde temos um campo meta personalizado no WordPress que, quando atualizado, chama a instância do Discourse de nosso site com uma solicitação PUT para atualizar o nome de usuário do usuário (semelhante a uma solução proposta aqui: How does one change a username via the API?)

No entanto, existe uma opção existente no WP Discourse, como mostrado aqui:

que permite aos usuários do WordPress editar seu “Nome de usuário do Discourse” através deste campo em sua página de perfil do WordPress:

mas este campo é usado apenas para publicar posts (do WP para o Discourse) e não atualiza realmente o nome de usuário do usuário no Discourse. Ele sincroniza quando um usuário muda seu nome de usuário no Discourse, mas não sincroniza do WordPress para o Discourse quando alterado.

Minha pergunta é, esse tipo de sincronização bidirecional será implementado em algum momento? Por que existe a opção de permitir que os usuários alterem este campo de nome de usuário se ele não sincroniza do WordPress para o Discourse? Minha equipe também estaria interessada em contribuir com este recurso se não for algo que já esteja em andamento. Nosso site precisa dessa funcionalidade e imaginamos que seria útil para todos os sites WP Discourse também. Por favor, me informe sobre isso!

@angus @simon como vocês dois estão fortemente envolvidos no WP Discourse e nos ajudaram com nossos problemas de SSO, acho que devo direcionar esta pergunta a vocês!

Movi isso para a categoria #suporte:wordpress, pois a categoria #contribuir:funcionalidade é destinada a recursos do Discourse.

O campo “Nome de usuário editável do Discourse” no plugin do WordPress pode ter um nome pouco claro. A descrição da configuração com certeza precisa ser atualizada para deixar claro qual é o seu propósito. Quando a configuração “Nome de usuário editável do Discourse” está ativada, os usuários do site WordPress podem definir seu nome de usuário do Discourse na página de perfil do WordPress. Se essa configuração não estiver ativada, apenas um administrador do site WordPress pode definir o nome de usuário do Discourse do usuário. O nome de usuário do Discourse é usado pelo plugin apenas para publicar posts do WordPress no Discourse.

Quando o DiscourseConnect é usado entre o WordPress e o Discourse, o nome de usuário do Discourse do usuário é inicialmente definido com base no nome de usuário do WordPress. Se a configuração auth_overrides_username estiver ativada no site Discourse, o nome de usuário no Discourse só pode ser definido a partir do WordPress. Se a configuração auth_overrides_username não estiver ativada no Discourse, os usuários poderão editar seu nome de usuário no Discourse, o que pode levar a uma dessincronização dos nomes de usuário entre os dois sistemas.

No que diz respeito ao campo “Nome de usuário do Discourse”, idealmente, esse campo sempre seria definido em segundo plano com base no nome de usuário do Discourse. Faz um tempo que não olho mais o código relacionado, mas acredito que o campo “Nome de usuário do Discourse” seja preenchido automaticamente se o site WordPress for usado como provedor de SSO para o Discourse e a opção “Criar ou sincronizar usuários do Discourse no login” estiver ativada na aba de opções do provedor DiscourseConnect no WordPress. O campo “Nome de usuário do Discourse” também é definido automaticamente se o Discourse for usado como provedor de SSO para o WordPress (com a configuração DiscourseConnect Client).

Idealmente, o campo “Nome de usuário do Discourse” sempre seria definido automaticamente quando o WordPress for o provedor de SSO para o Discourse, independentemente de a opção “Criar ou sincronizar usuários do Discourse no login” estar ativada no Discourse. Não acho que haja algo a ser feito para o caso em que o DiscourseConnect não esteja sendo usado entre os dois sites, mas @angus pode ter ideias sobre isso.

Por padrão, o WordPress não permite que os usuários alterem seus nomes de usuário, então não temos recebido muitas perguntas sobre isso. Se você quiser garantir que os nomes de usuário sejam mantidos sincronizados entre o WordPress e o Discourse, certifique-se de ativar a configuração auth_overrides_username no Discourse. Você também pode querer ativar a opção “Criar ou sincronizar usuários do Discourse no login” no WordPress. Com essa opção ativada, os usuários serão atualizados no Discourse sempre que fizerem login no seu site WordPress. Se essa opção não estiver ativada, os usuários só serão atualizados no Discourse quando fizerem logout do Discourse e entrarem novamente com o DiscourseConnect.

Obrigado pela resposta @simon e pela explicação do recurso existente.

Nosso site pode ser um caso um pouco especial, pois não queremos que o nome de usuário do WordPress do usuário seja sincronizado com o Discourse precisamente porque o WordPress não permite que os usuários alterem seus nomes de usuário por padrão. E não queremos instalar um plugin que adicione essa funcionalidade de edição de nome de usuário do WP devido à instabilidade que isso poderia criar.

Mas como os nomes de usuário são editáveis no Discourse, acho que faria sentido estender essa funcionalidade para o WordPress por meio do plugin WP Discourse. Esse campo parece o local perfeito para isso, mas entendo que isso poderia entrar em conflito com o nome de usuário do WP, já que ele nunca mudaria por padrão. Então, entendo que isso não é algo que você quer que contribuamos para o plugin?

Além disso, permitir que os usuários editem seu nome de usuário no fórum é um requisito importante para nós. Já temos o Discourse configurado para permitir isso, mas a maioria de nossos usuários não altera seu nome de usuário do Discourse porque ele fica oculto nas configurações do Discourse. Queremos que ele esteja em destaque na página de perfil deles em nosso site WordPress, ao lado de outras informações como nome, avatar, etc.

Algumas perguntas e algumas notas

No entanto, eles serão os mesmos em novos cadastros, já que você está usando o DiscourseConnect. Presumo que você esteja bem com isso e esteja apenas preocupado com a sincronização em si (ou seja, após a criação da conta)?

Como você está prevendo o caso em que um usuário cria uma conta no Wordpress e ainda não acessou o Discourse? Nenhuma conta do Discourse existirá. Nesse caso, o campo Nome de Usuário do Discourse não seria editável?

Observe que o webhook “Atualizar Dados do Usuário” (veja “Webhooks” nas configurações do WP Discourse) atualizará o Nome de Usuário do Discourse no Wordpress quando ele for alterado no Discourse. Essa é uma parte da sincronização bidirecional que você está prevendo.

Portanto, especificamente o que você deseja é apenas que o plugin WP Discourse atualize o nome de usuário do Discourse do usuário quando ele for alterado, sim?

Agora, esse campo é usado por pessoas diferentes para propósitos diferentes. Algumas pessoas querem poder editar esse campo sem atualizar o nome de usuário do usuário do Discourse associado à conta que eles usam com o DiscourseConnect.

No entanto, há uma solução relativamente simples. Poderíamos apenas adicionar uma ação em algum lugar perto de aqui para que você possa usar uma solicitação PUT para o Discourse para atualizar o nome de usuário no Discourse, ou seja, como você está fazendo agora. Eu apenas adicionaria que a maneira fácil de fazer isso é usar o método abstraído discourse_request nas Utilidades do Plugin WP, ou seja,

use WPDiscourse\\Utilities\\Utilities as DiscourseUtilities;
$path = ''
$args =  array(
);
$response = DiscourseUtilities::discourse_request( $path, $args );

Usando o Webhook e o callback de ação, você teria uma sincronização bidirecional da maneira que está prevendo, assumindo que você considerou as duas perguntas que levantei acima.

Ficarei feliz em revisar e mesclar um PR com uma ação adicional nesse sentido.

Na verdade, estamos substituindo esse comportamento com o hook de filtro wpdc_sso_params porque nosso sistema SSO integra o Firebase e o nome de usuário padrão do WP de todos é seu UID do Firebase, então estamos mudando o padrão do Discourse para ser memberXXX (com XXX sendo um número). Na verdade, queremos mudar esse padrão para ser PrimeiroNome_Sobrenome do usuário em algum momento também. Mas sim, nossa principal preocupação é que os usuários possam alterar facilmente seu nome de usuário por meio de sua página de perfil em nosso site Wordpress.

Neste caso, estou pensando que podemos armazenar o campo de nome de usuário e sincronizá-lo quando a conta for criada (via hook de filtro wpdc_sso_params no primeiro SSO), ou poderíamos forçar a criação de uma conta do Discourse para cada membro quando eles se inscreverem em nosso site Wordpress via API do Discourse. A segunda opção seria provavelmente mais vantajosa porque saberíamos que todos têm uma conta do Discourse e, portanto, haveria menos casos especiais de alguns usuários tendo contas e outros não. Mas estamos realmente buscando uma experiência perfeita, então queremos que este nome de usuário seja o que o usuário pensa como seu nome de usuário para toda a nossa plataforma. Queremos que ele seja sempre editável e, no futuro, provavelmente o usaremos para mais do que apenas o Discourse (ou seja, em leaderboards, etc.).

Sim, é exatamente isso que precisamos!

Entendido! Obrigado por essa direção, minha equipe e eu trabalharemos para testar isso com nossa implementação primeiro e em breve faremos um PR!