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

Недавно моя команда и я работали над функцией, позволяющей редактировать имя пользователя Discourse из WordPress при установленном плагине WP Discourse и настройке нашего сайта WordPress в качестве провайдера SSO для Discourse. На данный момент нам удалось частично решить задачу с помощью API Discourse: мы добавили пользовательское мета-поле в WordPress, которое при обновлении отправляет PUT-запрос к нашему экземпляру Discourse для изменения имени пользователя (похожее решение было предложено здесь: How does one change a username via the API?).

Однако в плагине WP Discourse уже существует опция, показанная здесь:

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

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

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

@angus @simon, поскольку вы оба активно участвуете в разработке WP Discourse и помогали нам с нашими проблемами SSO, я считаю, что должен задать этот вопрос именно вам!

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

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

При использовании DiscourseConnect между WordPress и Discourse логин пользователя в Discourse изначально берётся из его логина в WordPress. Если на сайте Discourse включена настройка auth_overrides_username, то логин в Discourse может быть изменён только через WordPress. Если настройка auth_overrides_username на Discourse не включена, пользователи могут изменить свой логин в Discourse, из-за чего логины в двух системах могут рассинхронизироваться.

Что касается поля «Discourse Username», в идеале оно должно всегда автоматически заполняться на основе логина в Discourse. Прошло уже довольно много времени с тех пор, как я в последний раз смотрел соответствующий код, но, насколько я помню, поле «Discourse Username» автоматически заполняется, если сайт WordPress используется как провайдер SSO для Discourse и включена опция «Create or Sync Discourse Users on Login» на вкладке параметров провайдера DiscourseConnect в WordPress. Поле «Discourse Username» также автоматически заполняется, если Discourse используется как провайдер SSO для WordPress (с настройкой DiscourseConnect Client).

В идеале поле «Discourse Username» должно всегда автоматически заполняться, когда WordPress является провайдером SSO для Discourse, независимо от того, включена ли опция «Create or Sync Discourse Users on Login» в Discourse. Я не думаю, что что-то можно сделать в случае, когда DiscourseConnect не используется между двумя сайтами, но у @angus, возможно, есть идеи по этому поводу.

По умолчанию WordPress не позволяет пользователям изменять свои логины, поэтому у нас не было много вопросов по этому поводу. Если вы хотите, чтобы логины оставались синхронизированными между WordPress и Discourse, обязательно включите настройку auth_overrides_username в Discourse. Также рекомендуется включить опцию «Create or Sync Discourse Users on Login» в WordPress. При включении этой опции пользователи будут обновляться в Discourse каждый раз при входе на ваш сайт WordPress. Если эта опция не включена, пользователи будут обновляться в Discourse только при выходе из Discourse и последующем входе через DiscourseConnect.

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

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

Однако, поскольку имена пользователей в Discourse можно редактировать, я думаю, что логично расширить эту функциональность до WordPress через плагин WP Discourse. Это поле кажется идеальным местом для этого, но я понимаю, что это может конфликтовать с именем пользователя WP, так как оно по умолчанию никогда не меняется. Получается, это не то, что вы хотели бы, чтобы мы внесли в плагин?

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

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

Однако при новых регистрациях они будут совпадать, поскольку вы используете DiscourseConnect. Я предполагаю, что вас это устраивает, и вас беспокоит только сама синхронизация (т. е. после создания аккаунта)?

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

Обратите внимание, что вебхук «Обновить данные пользователя» (см. раздел «Вебхуки» в настройках WP Discourse) будет обновлять имя пользователя Discourse в WordPress, когда оно изменено в Discourse. Это одна из сторон двусторонней синхронизации, которую вы имеете в виду.

Таким образом, конкретно то, что вам нужно, — это чтобы плагин WP Discourse обновлял имя пользователя в Discourse при его изменении, верно?

Теперь о том, что это поле используется разными людьми для разных целей. Некоторые хотят иметь возможность редактировать это поле без изменения имени пользователя в Discourse, связанного с аккаунтом, который они используют через DiscourseConnect.

Однако существует относительно простое решение. Мы могли бы просто добавить action где-то здесь здесь, чтобы вы могли использовать PUT-запрос к Discourse для обновления имени пользователя в Discourse, то есть так, как вы делаете сейчас. Я бы просто добавил, что самый простой способ сделать это — использовать абстрагированный метод discourse_request из утилит плагина WP, то есть:

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

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

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

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

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

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

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