Не удается создать пользователя в Discourse из WP с новой формой регистрации

Я настроил Discourse Connect, где WordPress выступает основным узлом для регистрации и входа.

У меня есть две формы регистрации пользователей с разными сценариями:

  1. Стандартная регистрация с главной страницы (это старая форма, и она всё ещё создаёт пользователя в Discourse).
  2. Регистрация пользователя через инструментальный сценарий (эта форма создаёт пользователя в WordPress, но не создаёт пользователя в Discourse).

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

У меня два вопроса:

  1. Что я могу упускать? Требуется ли какая-либо дополнительная настройка, чтобы это работало для новой формы?
  2. Как создать пользователя в Discourse и связать его с WordPress для членов, которые уже существуют в WordPress?

Уточнение: При дальнейшем анализе выяснилось, что даже из первой формы некоторые пользователи не создаются в Discourse.

Кто-нибудь сталкивался с этой проблемой? Я действительно застрял здесь.

Привет, @Himanshu_Singh,

Могли бы вы пошагово, с точки зрения пользователя, объяснить:

  1. Что происходит с вашей формой «стандартной регистрации»;
  2. Что происходит с вашей формой «регистрации пользователя».

Например:

  1. Пользователь переходит к форме и вводит свои данные.
  2. Пользователь перенаправляется на Discourse.

Включите шаги, где происходит нежелательное поведение, и шаги, которые должны происходить вместо этого.

Привет, Ангус,

При стандартной регистрации:

  1. Пользователь переходит к форме и вводит имя, адрес электронной почты и пароль.
  2. Затем пользователь автоматически входит в систему.
  3. После этого, когда пользователь нажимает на ссылку сообщества, он автоматически входит в Discourse (поскольку плагин Discourse Connect уже выполнил свою задачу по созданию нового пользователя в Discourse).

Для второй формы:

  1. Пользователь вводит имя и адрес электронной почты.
  2. Мы предоставляем ему временный пароль.
  3. Остальной процесс такой же, то есть пользователь автоматически входит в систему при регистрации.
  4. Однако в этом случае пользователь не создается в Discourse.

Я не вижу никаких настроек в Discourse Connect, которые срабатывали бы при изменении формы регистрации. Возможно, существует хук, который должен вызываться при регистрации пользователя в WordPress, но не вызывается в случае второй формы?

Кстати, какой именно хук в WordPress используется для создания пользователя в Discourse? Должен же быть сделан вызов API для активации действий в Discourse. Не могло ли это по какой-то причине не сработать?

Что происходит с такими пользователями, когда они нажимают «Войти» в Discourse? Опишите точно, что происходит при попытке входа. Я понимаю, что пользователь не отображается в вашей панели администратора после создания в WordPress, но это немного другой вопрос.

Первый случай: пользователь зарегистрирован в WP
Пользователю не нужно нажимать кнопку «Войти» в Discourse; он автоматически авторизуется при переходе по следующей ссылке в WP:

https://community.showprowess.com/session/sso?return_path=/

Если же я просто использую ссылку https://community.showprowess.com/ для перехода из WP в Discourse, пользователь остаётся неавторизованным, и мне приходится нажимать кнопку «Войти» в Discourse, чтобы выполнить вход.

После входа пользователь остаётся авторизованным до тех пор, пока я не выйду из системы в WP.

Это создаёт проблему: если пользователь не нажмёт на ссылку /session/sso?return_path=/, он не будет авторизован. Это ограничивает возможность перенаправления пользователя из WP на страницу личных сообщений в Discourse (функциональность, необходимая для нашего продукта).

Например, если я хочу отправить личное сообщение пользователю X, я добавляю следующую ссылку в его кастомный пост в WP:
https://community.showprowess.com/new-message?username=x&title=Message%20from%20

Поскольку это первая ссылка, на которую я нажимаю, окно сообщения не открывается. Вместо этого я авторизуюсь в Discourse. Теперь мне приходится возвращаться назад и снова нажимать ту же ссылку (ссылку на сообщение), чтобы она сработала.

Выглядит это так:

Это раздражает пользователей.

Ранее всё работало отлично: пользователь автоматически авторизовывался в Discourse, и ссылка https://community.showprowess.com вела на уже авторизованную страницу Discourse. Возможно, авторизация осуществлялась через куки браузера или что-то подобное, но сейчас это больше не работает.

Когда пользователь не зарегистрирован в Discourse
Это происходит в обоих случаях: как на новой, так и на старой форме.
В данном случае я снова выполнил вход и прошёл процесс онбординга, и на этот раз пользователь был создан в Discourse. До этого пользователь в Discourse отсутствовал (я проверил список новых пользователей в панели администратора перед повторным входом).
Я выполнил те же действия, что и выше: нажал на ссылку /sessions для автоматической авторизации в Discourse. Если же нажать просто на домен сообщества, вход не выполняется.

К сожалению, мне не удалось воспроизвести ситуацию, когда пользователь не создаётся при регистрации, но появляется при первом входе. Это происходит не при каждой новой регистрации пользователя, что очень странно.

Надеюсь, это поможет.

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

Один важный момент: не существует (и никогда не существовало) способа мгновенно войти в систему сразу в двух разных сервисах на двух разных доменах. Всякий раз, когда кажется, что вы вошли в сервис A на домене A, а при переходе в сервис B на домене B вы тоже уже авторизованы, на самом деле произошло следующее: вы вошли в сервис B через сервис A только после того, как посетили домен B и был инициирован процесс входа. До этого момента входа не было.

Ещё один важный момент: за исключением конкретного сценария, который вы описываете (когда нужно перенаправить пользователя в определённое место приложения, требующее сессию), большинство пользователей не обращают внимания на то, что иногда им нужно нажать кнопку «Войти» в сервисе B. По моему опыту работы с клиентами над решениями для идентификации, администраторы сайтов обычно гораздо более чувствительны к этому, чем сами пользователи.

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

Один из способов инициировать «автоматический» вход и перенаправить пользователя в определённое место в Discourse после входа — использовать путь, который вы уже предоставили:

https://community.showprowess.com/session/sso?return_path=[любой путь в Discourse]

Если пользователь уже авторизован в WordPress, но ещё не вошёл в Discourse при использовании этого URL, произойдёт следующее:

  1. Discourse автоматически запускает процесс входа DiscourseConnect.
  2. Браузер пользователя перенаправляется в WordPress.
  3. Пользователь уже авторизован, поэтому его автоматически перенаправляют обратно в Discourse.
  4. Если в URL, использованном на шаге 1, было указано значение return_path, пользователь будет перенаправлен туда.

С точки зрения пользователя его браузер лишь ненадолго начнёт загружать страницу, но фактически он «автоматически» войдёт в Discourse и будет перенаправлен в определённую часть приложения.

Обратите внимание: параметр return_path можно установить как любой URL, даже на отдельный домен, если включить настройку сайта discourse connect allows all return paths и установить её значение в true.

Спасибо! Это помогло решить проблему автоматического входа пользователя из WordPress в Discourse. Я могу использовать return_path для перенаправления пользователя на любую страницу в Discourse. Это решает проблему перенаправления пользователя на страницу сообщений.

Однако я до сих пор не понимаю, почему в некоторых случаях пользователь не создаётся в Discourse, хотя он уже создан в WordPress. Вы знаете, когда именно пользователь создаётся в Discourse через SSO?

  1. Это происходит при создании пользователя в WP?
  2. Или это происходит, когда новый пользователь WordPress пытается получить доступ к Discourse, после чего он создаётся, входит в систему и перенаправляется в Discourse?

Какой хук мы используем в WP для создания пользователя в Discourse?

Я пытаюсь понять, какой крайний случай может привести к тому, что пользователь не будет создан в Discourse при создании его в WP.

Практический пример:
Я еженедельно приветствую новых пользователей сообщением. На прошлой неделе в WP зарегистрировались 30 пользователей, но в Discourse были созданы только 16. Когда я хочу упомянуть их в приветственном сообщении, я не могу отметить всех — это для меня очень странно.

Спасибо за помощь, Энгус. Я ценю это.

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

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

Теперь всё встало на свои места. Спасибо, Ангус.

У меня включена настройка «Создавать или синхронизировать пользователей Discourse при входе». Пользователь не создаётся в Discourse, потому что некоторые пользователи регистрируются в WordPress, но не заходят в сообщество при первом входе. Они могут вернуться, войти в систему, а затем перейти по ссылке на сообщество — и только тогда пользователь будет создан.

Текущая функция автоматического входа после регистрации в WordPress не использует действие wp_login:

add_action( 'cred_save_data', 'cred_autologin_V3', 10, 3 );
    
function cred_autologin( $post_id, $form_data ){
  if ( ID1 == $form_data['id']  ) { // Измените по необходимости
    wp_set_current_user( $post_id );
    wp_set_auth_cookie( $post_id );
//    wp_redirect( home_url( '/some-ending-page/' ) );
  //  exit(); 
  }
}

Я бы предпочел создавать пользователя в Discourse сразу при регистрации в WordPress.
У меня есть пользовательские хуки на форме регистрации пользователя, через которые можно вызывать API. Есть ли код, который я могу добавить в пользовательский хук, чтобы создать пользователя в Discourse через API?

Вот эта часть мне непонятна: как именно вызвать wp_login из пользовательского хука.

Просто добавьте триггер действия в свой код.

do_action( 'wp_login' );

Итак, я сделал именно то, что вы мне сказали.

add_action( 'cred_save_data', 'cred_autologin_V3', 10, 3 );
    
function cred_autologin( $post_id, $form_data ){
  if ( ID1 == $form_data['id']  ) { // Отредактируйте по необходимости
    wp_set_current_user( $post_id );
    wp_set_auth_cookie( $post_id );
   do_action( 'wp_login' );

//    wp_redirect( home_url( '/some-ending-page/' ) );
  //  exit(); 
  }
}

Но я получаю следующую ошибку:
Сообщение: Uncaught ArgumentCountError: Слишком мало аргументов для функции WPDiscourse\WordPressEmailVerification\WordPressEmailVerification::verify_email_after_login(), передан 1 аргумент в /home/customer/www/domain.com/public_html/wp-includes/class-wp-hook.php на строке 307, а ожидается ровно 2 в /home/customer/www/domain.com/public_html/wp-content/plugins/wp-discourse/lib/wordpress-email-verification.php:128

У меня есть другой код, который обходит проверку электронной почты.

add_filter( 'discourse_email_verification', 'disable_discourse_email_verification_prowess');
function disable_discourse_email_verification_prowess() {
  wp_mail( 'himanshu@eshowprowess.com', 'Пользователь подтвержден', 'Статус должен измениться' ); 
   
    return false;
}

Это проблема последовательности кода или мне нужно передать какой-то параметр действию wp_login?

Редактирование: Пользователь был создан в WP и вошел в систему, но пользователь не был создан в Discourse.

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

Что касается возникшей у вас проблемы, я думаю, мы выяснили её причину.