Sincronizzazione bidirezionale tra nome utente WP Discourse e nome utente Discourse?

Recentemente, il mio team e io abbiamo lavorato a una funzionalità che consente di modificare il nome utente di Discourse di un utente da WordPress con il plugin WP Discourse installato e il nostro sito WordPress impostato come provider SSO per Discourse. Attualmente abbiamo avuto un certo successo utilizzando l’API di Discourse, dove abbiamo un campo meta personalizzato in WordPress che, quando aggiornato, chiama l’istanza Discourse del nostro sito con una richiesta PUT per aggiornare il nome utente dell’utente (simile a una soluzione proposta qui: How does one change a username via the API?)

Tuttavia, esiste un’opzione esistente all’interno di WP Discourse come mostrato qui:

che consente agli utenti di WordPress di modificare il loro “nome utente Discourse” tramite questo campo nella loro pagina del profilo WordPress:

ma questo campo viene utilizzato solo per la pubblicazione di post (da WP a Discourse) e non aggiorna effettivamente il nome utente dell’utente in Discourse. Si sincronizza quando un utente cambia il proprio nome utente in Discourse, ma non si sincronizza da WordPress a Discourse quando viene modificato.

La mia domanda è: questo tipo di sincronizzazione bidirezionale verrà implementato a un certo punto? Perché esiste un’opzione per consentire agli utenti di modificare questo campo del nome utente se non si sincronizza da WordPress a Discourse? Il mio team sarebbe anche interessato a contribuire con questa funzionalità se non è qualcosa già in lavorazione. Il nostro sito necessita di questa funzionalità e immaginiamo che sarebbe utile anche per tutti i siti WP Discourse. Per favore, fatemi sapere a riguardo!

@angus @simon dato che siete entrambi molto coinvolti in WP Discourse e ci avete aiutato con i nostri problemi SSO, penso che dovrei rivolgere questa domanda a voi!

Ho spostato questo argomento nella categoria Support > WordPress, poiché la categoria Contribute > Feature è destinata alle funzionalità di Discourse.

Il campo “Nome utente Discourse modificabile” nel plugin per WordPress potrebbe avere un nome poco chiaro. La descrizione delle impostazioni necessita sicuramente di un aggiornamento per rendere evidente lo scopo di tale impostazione. Quando l’impostazione “Nome utente Discourse modificabile” è abilitata, gli utenti del sito WordPress possono impostare il proprio nome utente Discourse nella pagina del profilo di WordPress. Se questa impostazione non è abilitata, solo un amministratore del sito WordPress può impostare il nome utente Discourse dell’utente. Il nome utente Discourse viene utilizzato dal plugin esclusivamente per pubblicare i post da WordPress a Discourse.

Quando viene utilizzato DiscourseConnect tra WordPress e Discourse, il nome utente Discourse dell’utente viene inizialmente impostato in base al suo nome utente WordPress. Se l’impostazione auth_overrides_username è abilitata sul sito Discourse, il nome utente su Discourse può essere impostato solo da WordPress. Se l’impostazione auth_overrides_username non è abilitata su Discourse, gli utenti potrebbero modificare il proprio nome utente su Discourse, causando una mancata corrispondenza tra i nomi utente dei due sistemi.

Per quanto riguarda il campo “Nome utente Discourse”, idealmente, questo campo dovrebbe essere sempre impostato in background in base al nome utente Discourse. È passato un po’ di tempo dall’ultima volta che ho esaminato il codice correlato, ma ritengo che il campo “Nome utente Discourse” venga compilato automaticamente se il sito WordPress viene utilizzato come provider SSO per Discourse e se l’opzione “Crea o sincronizza utenti Discourse al login” è abilitata nella scheda delle opzioni del provider DiscourseConnect su WordPress. Il campo “Nome utente Discourse” viene inoltre impostato automaticamente se Discourse viene utilizzato come provider SSO per WordPress (con l’impostazione DiscourseConnect Client).

Idealmente, il campo “Nome utente Discourse” dovrebbe essere sempre impostato automaticamente quando WordPress è il provider SSO per Discourse, indipendentemente dal fatto che l’opzione “Crea o sincronizza utenti Discourse al login” sia abilitata su Discourse. Non credo che si possa fare nulla nel caso in cui DiscourseConnect non venga utilizzato tra i due siti, ma @angus potrebbe avere delle idee al riguardo.

Per impostazione predefinita, WordPress non consente agli utenti di modificare i propri nomi utente, quindi non abbiamo ricevuto molte domande a riguardo. Se desideri garantire che i nomi utente rimangano sincronizzati tra WordPress e Discourse, assicurati di abilitare l’impostazione auth_overrides_username su Discourse. Potresti anche voler abilitare l’opzione “Crea o sincronizza utenti Discourse al login” su WordPress. Con questa opzione abilitata, gli utenti verranno aggiornati su Discourse ogni volta che accedono al tuo sito WordPress. Se questa opzione non è abilitata, gli utenti verranno aggiornati su Discourse solo quando escono da Discourse e poi accedono nuovamente con DiscourseConnect.

Grazie per la risposta @simon e per la spiegazione della funzionalità esistente.

Il nostro sito potrebbe essere un caso un po’ speciale, perché non vogliamo sincronizzare il nome utente di WordPress con Discourse proprio perché WordPress non consente agli utenti di modificare i propri nomi utente per impostazione predefinita. E non vogliamo installare un plugin che aggiunga questa funzionalità di modifica del nome utente di WP a causa dell’instabilità che potrebbe creare.

Ma poiché i nomi utente sono modificabili in Discourse, penso che avrebbe senso estendere questa funzionalità in WordPress tramite il plugin WP Discourse. Questo campo sembra il posto perfetto per farlo, ma capisco che potrebbe entrare in conflitto con il nome utente di WP poiché quest’ultimo non cambierebbe mai per impostazione predefinita. Quindi, deduco che non sia qualcosa che desideri che contribuiamo al plugin?

Inoltre, consentire agli utenti di modificare il proprio nome utente nel forum è un requisito fondamentale per noi. Abbiamo già impostato Discourse per consentirlo, ma la maggior parte dei nostri utenti non cambia il proprio nome utente Discourse perché è nascosto nelle impostazioni di Discourse. Vogliamo che sia ben visibile nella loro pagina del profilo sul nostro sito WordPress, insieme alle altre informazioni come nome, avatar, ecc.

Alcune domande e alcune note

Tuttavia, saranno uguali nelle nuove registrazioni, poiché si utilizza DiscourseConnect. Presumo che tu sia d’accordo e che ti preoccupi solo della sincronizzazione in sé (cioè, dopo la creazione dell’account)?

Come prevedi il caso in cui un utente crea un account Wordpress e non ha ancora effettuato l’accesso a Discourse? Non esisterà alcun account Discourse. In tal caso, il campo Nome utente Discourse non sarebbe modificabile?

Si noti che il webhook “Aggiorna dati utente” (vedere “Webhook” nelle impostazioni di WP Discourse) aggiornerà il nome utente Discourse in Wordpress quando viene modificato in Discourse. Questa è una parte della sincronizzazione bidirezionale che stai prevedendo.

Quindi, nello specifico, quello che ti serve è solo che il plugin WP Discourse aggiorni il nome utente dell’utente in Discourse quando cambia, giusto?

Ora, quel campo viene utilizzato da persone diverse per scopi diversi. Alcune persone vogliono poter modificare quel campo senza aggiornare il nome utente dell’utente Discourse associato all’account che utilizzano con DiscourseConnect.

Tuttavia, esiste una soluzione relativamente semplice. Potremmo semplicemente aggiungere un action da qualche parte intorno a qui in modo che tu possa utilizzare una richiesta PUT a Discourse per aggiornare il nome utente su Discourse, cioè come stai facendo ora. Aggiungerei solo che il modo più semplice per farlo è utilizzare il metodo astratto discourse_request nelle Utilità del plugin WP, cioè

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

Utilizzando sia il Webhook che la callback di azione, avresti una sincronizzazione bidirezionale nel modo in cui la stai prevedendo, supponendo che tu abbia tenuto conto delle due domande che ho sollevato sopra.

Sono felice di rivedere e unire una PR con un’azione aggiuntiva in quella direzione.

In realtà stiamo sovrascrivendo questo comportamento con l’hook del filtro wpdc_sso_params perché il nostro sistema SSO integra Firebase e il nome utente WP di tutti predefinito è il loro UID di Firebase, quindi stiamo cambiando il predefinito di Discourse in memberXXX (con XXX che è un numero). In realtà vogliamo cambiare questo predefinito in Nome_Cognome dell’utente a un certo punto. Ma sì, la nostra preoccupazione principale è che gli utenti possano cambiare facilmente il proprio nome utente dalla loro pagina del profilo sul nostro sito Wordpress.

In questo caso, penso che possiamo memorizzare il campo del nome utente e farlo sincronizzare quando l’account viene creato (tramite l’hook del filtro wpdc_sso_params al primo SSO), oppure potremmo forzare la creazione di un account Discourse per ogni membro quando si registra sul nostro sito Wordpress tramite l’API di Discourse. La seconda opzione sarebbe probabilmente più vantaggiosa perché sapremmo che tutti hanno un account Discourse e ci sarebbero quindi meno casi speciali di alcuni utenti che hanno account e altri no. Ma stiamo davvero puntando a un’esperienza senza interruzioni, quindi vogliamo che questo nome utente sia quello che l’utente pensa come suo nome utente per l’intera nostra piattaforma. Vogliamo che sia sempre modificabile e, in futuro, probabilmente lo utilizzeremo per più scopi oltre a Discourse (ad esempio, nelle classifiche, ecc.).

Sì, è esattamente ciò di cui abbiamo bisogno!

Capito! Grazie per questa indicazione, il mio team ed io lavoreremo per testare questo con la nostra implementazione prima e presto faremo una PR!