Автоматическое создание пользователя Discourse при регистрации в WordPress

Мой сайт использует DiscourseConnect Provider, поэтому WordPress управляет входом в Discourse.

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

Я проверил настройку «Синхронизировать данные пользователя» в настройках WordPress.

Кажется, что в описании сказано, что пользователь Discourse будет создан при входе в WordPress. Но я не вижу этого. Пользователь Discourse создаётся только тогда, когда он посещает сайт Discourse.

Неправильно ли работает моя интеграция? Или я неправильно понимаю это описание?

Спасибо!

Привет, @37Rb, вот что происходит.

Дай знать, если после просмотра видео у тебя возникнут дополнительные вопросы.

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

Если они выходят из WP и снова входят в WP, то создаётся учётная запись в Discourse. Я только что это проверил.

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

Проблемные пользователи — это те, кто:

  • Зарегистрировался в WP, но не выходил и не входил снова
  • Никогда не посещал Discourse (который является нашей службой поддержки для интернет-магазина)

WordPress/WooCommerce рассматривает самостоятельную регистрацию как вход в систему — пользователи считаются авторизованными сразу после регистрации. Есть ли способ сделать так, чтобы учётная запись в Discourse создавалась при самостоятельной регистрации, а не только при выходе и повторном входе?

Привет, Райан, вы правы: плагин создаёт пользователя после входа. В частности, плагин использует хук wp_login. В WordPress также есть хук user_register, однако плагин не использует его, потому что он срабатывает сразу после вставки записи в базу данных WordPress, независимо от того, подтверждены ли данные пользователя (в частности, его адрес электронной почты).

С небольшой долей иронии можно спросить: почему же WooCommerce не срабатывает хук wp_login, если это действительно так :slight_smile: Но если говорить более полезно, то, скорее всего, существует другой хук или фильтр, который WooCommerce срабатывает сразу после регистрации и входа, если это действительно происходит.

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

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

Я подозреваю, что именно WooCommerce вызывает путаницу. Похоже, что автоматический вход после регистрации — это функция WooCommerce, а не WordPress. И они намеренно не запускают действия входа.

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

Да, как только вы найдёте подходящий хук, вы можете создать пользователя в Discourse следующим образом:

$user = get_user_by( 'id', $user_id );
$params = WPDiscourse\Utilities\Utilities::get_sso_params( $user );
WPDiscourse\Utilities\Utilities::sync_sso_record( $params, $wp_user_id )

Предполагаю, что в данном контексте у вас будет доступен user_id нового пользователя.

Действие woocommerce_created_customer, похоже, работает корректно.

В дополнение к коду выше, полезно также отметить адрес электронной почты как подтверждённый.

delete_user_meta( $user_id, 'discourse_email_not_verified' );

Пока всё работает. Спасибо за помощь!!!