Двусторонняя синхронизация между именем пользователя 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, так как категория Contribute > Feature предназначена для функций Discourse.

Поле «Discourse Username Editable» (Редактируемое имя пользователя Discourse) в плагине WordPress, возможно, названо неудачно. Описание этой настройки определенно нуждается в обновлении, чтобы стало ясно, для чего она предназначена. Когда настройка Discourse Username Editable включена, пользователи на сайте WordPress могут указать свое имя пользователя Discourse на странице профиля WordPress. Если эта настройка отключена, имя пользователя Discourse может установить только администратор сайта WordPress. Имя пользователя 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 и на вкладке параметров провайдера DiscourseConnect в WordPress включена опция «Create or Sync Discourse Users on Login» (Создавать или синхронизировать пользователей Discourse при входе). Поле «Discourse Username» также автоматически устанавливается, если Discourse используется в качестве поставщика SSO для WordPress (с помощью настройки клиента DiscourseConnect).

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

По умолчанию WordPress не позволяет пользователям изменять свои имена, поэтому вопросов по этому поводу у нас было немного. Если вы хотите убедиться, что имена пользователей синхронизируются между WordPress и Discourse, убедитесь, что на Discourse включена настройка auth_overrides_username. Возможно, вам также стоит включить опцию «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!