Новые пользователи WordPress подключаются к существующим пользователям Discourse

tl;dr — Когда новый пользователь WordPress размещает заказ или регистрируется, он каким-то образом перезаписывает или связывается с существующими пользователями в Discourse. Не уверен, как устранить неполадку.

Фон:

  • Мы используем плагин wp-discourse для SSO, где WordPress является провайдером DiscourseConnect.
  • Мы запустили наше сообщество Discourse, размещённое на сервере Digital Ocean.
  • При запуске сообщества Discourse и подключении к SSO через плагин wp-discourse WordPress был размещён на AWS Lightsail с использованием панели управления Plesk.
  • Ранее в этом году мы переехали на управляемый хостинг WordPress от Nexcess, и подключение к Discourse, похоже, осталось рабочим.
  • При переходе на новую установку WordPress мы не мигрировали наших пользователей. Они были экспортированы, и мы планируем импортировать их в ближайшее время.
  • Наш сайт WordPress некоторое время был закрыт, так как мы вносили серьёзные изменения.

За последние несколько месяцев у нас было много заказов на WordPress (WooCommerce), и мы заметили странную вещь: при просмотре учётной записи пользователя в WordPress в поле Discourse Username отображаются имена пользователей, уже существующих в Discourse. Похоже, наше подключение к Discourse нарушено. Сегодня зарегистрировался новый пользователь, и его Discourse Usernametennisdpm, что соответствует существующему пользователю, который зарегистрировался ещё в 2020 году. :thinking:

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

Будем очень признательны за помощь и рекомендации, как нам действовать!

Текущие настройки подключения wp-discourse через SSO:

Похоже, что новые пользователи WP получают идентификаторы пользователей, которые соответствуют существующим внешним идентификаторам DiscourseConnect.

О боже!! Спасибо за предупреждение @omarfilip! Можно ли это сбросить или предотвратить повторение? Или, может быть, нам стоит отключить это, пока мы не завершим миграцию всех бывших пользователей?

Я действительно не уверен, какой будет лучший подход. Сколько записей нужно исправить?

Сейчас в WP у нас около 80 пользователей, которых нужно «открепить» от текущих учётных записей Discourse, с которыми они, по-видимому, связаны. Кроме того, нам нужно импортировать около 750 пользователей из нашего старого экземпляра и убедиться, что у них не возникнет той же проблемы, с которой мы сталкиваемся сейчас.

Я надеялся, что учётные записи в WP привязываются к учётным записям Discourse по адресу электронной почты как к уникальному идентификатору, а не по внешним/пользовательским ID.

Привет, @jord8on, механизм сопоставления на стороне Discourse работает следующим образом: сначала он пытается сопоставить внешний ID (в вашем случае он теперь указывает на разных пользователей, так как вы изменили базу данных WordPress), а затем пытается сопоставить по адресу электронной почты. Использование ID в первую очередь имеет несколько веских причин. Электронная почта не является хорошим децентрализованным идентификатором.

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

./launcher enter app
rails c
SingleSignOnRecord.where("created_at < ?", 1.month.ago) // проверьте, соответствует ли это вашим ожиданиям
SingleSignOnRecord.where("created_at < ?", 1.month.ago).delete_all

Старые пользователи, импортируемые в новую базу данных, будут сопоставлены на основе адреса электронной почты с их существующими учётными записями в Discourse (так как их новый ID WordPress не будет совпадать ни с одной записью SSO).

Также рекомендую удалить все данные поля discourse_username в WordPress и позволить им автоматически синхронизироваться через веб-хук пользователя. Вам нужно будет выполнить следующую команду (возможно, используя WP CLI), которая удалит все записи для мета-поля discourse_username:

delete_metadata( 'user', 0, 'discourse_username', '', true );

Для тех, кто прочтёт это в будущем: если вы используете DiscourseConnect с одной базой данных WordPress, а затем переходите на совершенно новую базу данных WordPress без миграции, у вас возникнет именно такая проблема. Перед внесением подобных изменений рекомендуется обратиться за помощью.