# Двусторонняя синхронизация между именем пользователя WP Discourse и именем пользователя Discourse?

**URL:** https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018
**Category:** WordPress
**Created:** [04.Март.2022 00:53:36 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018 "2022-03-04T00:53:36Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![dbwhite](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dbwhite/32/247431_2.png) [@dbwhite](https://meta.discourse.org/u/dbwhite)
#### Post date: [04.Март.2022 00:53:36 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/1 "2022-03-04T00:53:36Z")

</div>

Недавно моя команда и я работали над функцией, позволяющей редактировать имя пользователя Discourse из WordPress при установленном плагине [WP Discourse](https://github.com/discourse/wp-discourse) и настройке нашего сайта WordPress в качестве провайдера SSO для Discourse. На данный момент нам удалось частично решить задачу с помощью API Discourse: мы добавили пользовательское мета-поле в WordPress, которое при обновлении отправляет PUT-запрос к нашему экземпляру Discourse для изменения имени пользователя (похожее решение было предложено здесь: [How does one change a username via the API?](https://meta.discourse.org/t/how-does-one-change-a-username-via-the-api/96118)).

Однако в плагине [WP Discourse](https://github.com/discourse/wp-discourse) уже существует опция, показанная здесь:

 ![Screen Shot 2022-03-03 at 4.32.35 PM](https://global.discourse-cdn.com/meta/original/3X/6/f/6fbd55ea5419e26e0c21cd549099d6d19e27e526.png)

которая позволяет пользователям WordPress редактировать своё «имя пользователя Discourse» через это поле на странице своего профиля в WordPress:

 ![Screen Shot 2022-03-03 at 4.39.58 PM](https://global.discourse-cdn.com/meta/original/3X/7/4/748430fb992cb9a484bea071e12bd475a8f31724.png)

Но это поле используется только для публикации постов (из WordPress в Discourse) и фактически не обновляет имя пользователя в самом Discourse. Синхронизация происходит, когда пользователь меняет имя в Discourse, но не наоборот — при изменении имени в WordPress синхронизация в сторону Discourse не выполняется.

Мой вопрос: будет ли когда-нибудь реализована двусторонняя синхронизация такого типа? Зачем вообще есть опция, позволяющая пользователям изменять это поле имени, если оно не синхронизируется из WordPress в Discourse? Наша команда также была бы заинтересована в разработке этой функции, если она ещё не находится в планах. Нашему сайту необходима такая функциональность, и мы считаем, что она будет полезна для всех сайтов, использующих [WP Discourse](https://github.com/discourse/wp-discourse). Пожалуйста, дайте нам знать!

@angus @simon, поскольку вы оба активно участвуете в разработке [WP Discourse](https://github.com/discourse/wp-discourse) и помогали нам с нашими проблемами SSO, я считаю, что должен задать этот вопрос именно вам!

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [04.Март.2022 01:18:19 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/2 "2022-03-04T01:18:19Z")

</div>

Я перенес это сообщение в категорию #Support > WordPress, так как категория #Contribute > Feature предназначена для функций Discourse.

Поле «Discourse Username Editable» (Редактируемое имя пользователя Discourse) в плагине WordPress, возможно, названо неудачно. Описание этой настройки определенно нуждается в обновлении, чтобы стало ясно, для чего она предназначена. Когда настройка Discourse Username Editable включена, пользователи на сайте WordPress могут указать свое имя пользователя Discourse на странице профиля WordPress. Если эта настройка отключена, имя пользователя Discourse может установить только администратор сайта WordPress. Имя пользователя Discourse используется плагином исключительно для публикации сообщений с WordPress на Discourse.

При использовании [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) между WordPress и Discourse имя пользователя Discourse изначально устанавливается на основе имени пользователя WordPress. Если на сайте Discourse включена настройка `auth_overrides_username`, имя пользователя на Discourse может быть изменено только из WordPress. Если настройка `auth_overrides_username` на Discourse _не_ включена, пользователи могут изменить свое имя пользователя на Discourse, что приведет к рассинхронизации имен пользователей между двумя системами.

Что касается поля «Discourse Username», то в идеале это поле всегда должно заполняться в фоновом режиме на основе имени пользователя Discourse. Я давно не заглядывал в соответствующий код, но полагаю, что поле «Discourse Username» заполняется автоматически, если сайт WordPress используется в качестве поставщика SSO для Discourse и на вкладке параметров провайдера [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) в WordPress включена опция «Create or Sync Discourse Users on Login» (Создавать или синхронизировать пользователей Discourse при входе). Поле «Discourse Username» также автоматически устанавливается, если Discourse используется в качестве поставщика SSO для WordPress (с помощью настройки клиента [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)).

В идеале поле «Discourse Username» должно всегда автоматически заполняться, когда WordPress является поставщиком SSO для Discourse, независимо от того, включена ли опция «Create or Sync Discourse Users on Login» на Discourse. Я не думаю, что что-то можно сделать в случае, когда [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) не используется между двумя сайтами, но, возможно, у @angus есть идеи по этому поводу.

По умолчанию WordPress не позволяет пользователям изменять свои имена, поэтому вопросов по этому поводу у нас было немного. Если вы хотите убедиться, что имена пользователей синхронизируются между WordPress и Discourse, убедитесь, что на Discourse включена настройка `auth_overrides_username`. Возможно, вам также стоит включить опцию «Create or Sync Discourse Users on Login» на WordPress. При включении этой опции пользователи будут обновляться на Discourse каждый раз при входе на ваш сайт WordPress. Если эта опция отключена, пользователи будут обновляться на Discourse только при выходе из Discourse, а затем повторном входе с использованием [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true).

---

<div class="post-metadata">

### Author: ![dbwhite](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dbwhite/32/247431_2.png) [@dbwhite](https://meta.discourse.org/u/dbwhite)
#### Post date: [04.Март.2022 01:44:11 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/3 "2022-03-04T01:44:11Z")

</div>

Спасибо за ответ, @simon, и за объяснение существующей функции.

Наш сайт может быть несколько особым случаем, так как мы не хотим синхронизировать имя пользователя WordPress с Discourse именно потому, что WordPress по умолчанию не позволяет пользователям изменять свои имена пользователей. Мы также не хотим устанавливать плагин, добавляющий возможность редактирования имени пользователя в WP, из-за нестабильности, которую это может создать.

Однако, поскольку имена пользователей в Discourse можно редактировать, я думаю, что логично расширить эту функциональность до WordPress через плагин [WP Discourse](https://github.com/discourse/wp-discourse). Это поле кажется идеальным местом для этого, но я понимаю, что это может конфликтовать с именем пользователя WP, так как оно по умолчанию никогда не меняется. Получается, это не то, что вы хотели бы, чтобы мы внесли в плагин?

---

<div class="post-metadata">

### Author: ![dbwhite](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dbwhite/32/247431_2.png) [@dbwhite](https://meta.discourse.org/u/dbwhite)
#### Post date: [04.Март.2022 01:46:40 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/4 "2022-03-04T01:46:40Z")

</div>

Кроме того, возможность для пользователей редактировать своё имя пользователя на форуме является для нас ключевым требованием. У нас уже настроен Discourse для реализации этой функции, но большинство наших пользователей не меняют своё имя в Discourse, так как оно скрыто в настройках. Мы хотим, чтобы эта опция была явно видна на странице профиля на нашем сайте WordPress, рядом с другой информацией, такой как имя, аватар и т. д.

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [04.Март.2022 12:34:04 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/5 "2022-03-04T12:34:04Z")

</div>

Несколько вопросов и некоторые заметки

> [@dbwhite](#):
>
> Наш сайт может быть несколько особым случаем, так как мы не хотим синхронизировать имя пользователя WordPress с Discourse именно потому, что по умолчанию WordPress не позволяет пользователям менять свои имена пользователей.

Однако при новых регистрациях они будут совпадать, поскольку вы используете [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true). Я предполагаю, что вас это устраивает, и вас беспокоит только сама синхронизация (т. е. после создания аккаунта)?

Как вы представляете ситуацию, когда пользователь создаёт аккаунт в WordPress, но ещё не входил в Discourse? Аккаунта в Discourse тогда не существует. В таком случае поле «Имя пользователя Discourse» не будет редактируемым?

Обратите внимание, что вебхук «Обновить данные пользователя» (см. раздел «Вебхуки» в настройках [WP Discourse](https://github.com/discourse/wp-discourse)) будет обновлять имя пользователя Discourse в WordPress, когда оно изменено в Discourse. Это одна из сторон двусторонней синхронизации, которую вы имеете в виду.

Таким образом, конкретно то, что вам нужно, — это чтобы плагин [WP Discourse](https://github.com/discourse/wp-discourse) обновлял имя пользователя в Discourse при его изменении, верно?

Теперь о том, что это поле используется разными людьми для разных целей. Некоторые хотят иметь возможность редактировать это поле без изменения имени пользователя в Discourse, связанного с аккаунтом, который они используют через [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true).

Однако существует относительно простое решение. Мы могли бы просто добавить [action](https://developer.wordpress.org/reference/functions/add_action/) где-то здесь [здесь](https://github.com/discourse/wp-discourse/blob/main/admin/user-profile.php#L131), чтобы вы могли использовать PUT-запрос к Discourse для обновления имени пользователя в Discourse, то есть так, как вы делаете сейчас. Я бы просто добавил, что самый простой способ сделать это — использовать абстрагированный метод [discourse\_request](https://github.com/discourse/wp-discourse/blob/main/lib/plugin-utilities.php#L364) из утилит плагина WP, то есть:

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

```

Используя как вебхук, так и обратный вызов action, вы получите двустороннюю синхронизацию так, как вы себе представляете, при условии, что вы учли два вопроса, которые я поднял выше.

С радостью рассмотрю и приму PR с добавлением action по такому принципу.

---

<div class="post-metadata">

### Author: ![dbwhite](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dbwhite/32/247431_2.png) [@dbwhite](https://meta.discourse.org/u/dbwhite)
#### Post date: [07.Март.2022 02:50:34 UTC](https://meta.discourse.org/t/two-way-sync-between-wp-discourse-username-and-discourse-username/220018/6 "2022-03-07T02:50:34Z")

</div>

> [@angus](#):
>
> Однако для новых регистраций они будут одинаковыми, так как вы используете [DiscourseConnect](https://meta.discourse.org/t/13045). Я предполагаю, что вас это устраивает, и вас беспокоит только синхронизация как таковая (то есть после создания учётной записи)?

На самом деле мы переопределяем это поведение с помощью хука фильтра `wpdc_sso_params`, поскольку наша система SSO интегрирована с Firebase, и имя пользователя WP по умолчанию для всех равно их Firebase UID. Поэтому мы меняем значение по умолчанию в Discourse на `memberXXX` (где XXX — это число). В будущем мы также планируем изменить значение по умолчанию на `Firstname_Lastname` (Имя\_Фамилия) пользователя. Но да, наша главная забота — чтобы пользователи могли легко изменять своё имя пользователя через страницу профиля на нашем сайте WordPress.

> [@angus](#):
>
> Как вы представляете себе ситуацию, когда пользователь создаёт учётную запись в WordPress, но ещё не входил в Discourse? Учётной записи в Discourse не существует. В таком случае поле «Имя пользователя в Discourse» не будет редактируемым?

В этом случае я думаю, что мы можем либо сохранить поле имени пользователя и синхронизировать его при создании учётной записи (через хук фильтра `wpdc_sso_params` при первом SSO), либо принудительно создать учётную запись в Discourse для каждого участника при регистрации на нашем сайте WordPress через API Discourse. Второй вариант, вероятно, будет более выгодным, так как мы будем знать, что у всех есть учётная запись в Discourse, и тем самым уменьшим количество особых случаев, когда у одних пользователей есть учётные записи, а у других нет. Однако мы стремимся к бесшовному опыту, поэтому хотим, чтобы это имя пользователя воспринималось пользователем как его имя для всей нашей платформы. Мы хотим, чтобы оно всегда было редактируемым, и в будущем, вероятно, будем использовать его не только для Discourse (например, в турнирных таблицах и т. д.).

> [@angus](#):
>
> Так что конкретно вы хотите — чтобы плагин [WP Discourse](https://github.com/discourse/wp-discourse) обновлял имя пользователя в Discourse при его изменении, верно?

Да, именно это нам и нужно!

> [@angus](#):
>
> Однако есть относительно простое решение. Мы могли бы просто добавить [action](https://developer.wordpress.org/reference/functions/add_action/) где-то здесь [здесь](https://github.com/discourse/wp-discourse/blob/main/admin/user-profile.php#L131), чтобы вы могли использовать PUT-запрос к Discourse для обновления имени пользователя в Discourse, как вы делаете сейчас. Я бы просто добавил, что самый простой способ сделать это — использовать абстрагированный метод [discourse\_request](https://github.com/discourse/wp-discourse/blob/main/lib/plugin-utilities.php#L364) в утилитах плагина WP, то есть

Понял! Спасибо за это направление, моя команда и я начнём тестировать это с нашей реализацией и скоро должны сделать PR!
