使用新的注册表单无法在 Discourse 中从 WP 创建用户

我已将 Discourse Connect 设置为以 WP 作为主要的注册和登录实例。

我有两个具有不同流程的用户注册表单:

  1. 主页上的标准注册(这是旧的,仍然在 Discourse 中创建用户)
  2. 使用工具流程的用户注册。(这个创建了 WP 用户,但没有在 Discourse 中创建用户)。

我在 Discourse 插件中没有看到任何特定于注册表单的设置。当我查看用户时,我看不到第二个表单在 WP 中的 Discourse 用户名。链接

我有两个问题:

  1. 我可能遗漏了什么?是否需要任何额外的设置才能使新表单正常工作?
  2. 如何在 Discourse 中创建用户并将其与 WordPress 连接,以用于已存在于 WP 中的会员?

更正:经过进一步分析,似乎即使是第一个表单,有些用户也没有在 Discourse 中创建。

1 个赞

有人遇到过这个问题吗?我真的卡在这里了。

@Himanshu_Singh

你能一步一步地向我解释一下,用户会看到什么吗:

  1. 你的“标准注册”表单会发生什么;
  2. 你的“用户注册”表单会发生什么。

例如:

  1. 用户进入表单并输入他们的详细信息
  2. 用户被重定向到 discourse..

请包含不希望发生的情况的步骤以及你希望发生的替代步骤。

2 个赞

您好 Angus,

在标准注册中,

  1. 用户访问表单并添加他们的姓名、电子邮件和密码
  2. 然后用户会自动登录
  3. 然后当用户点击社区链接时,他们会自动登录 Discourse(因为此时 Discourse Connect 插件已经完成了在 Discourse 中创建新用户的任务)

对于第二个表单,

  1. 用户添加姓名和电子邮件。
  2. 我们为他们提供一个临时密码
  3. 其余过程相同,即用户在注册时自动登录
  4. 但在这种情况下,用户未在 Discourse 中创建。

我看不到 Discourse Connect 中有任何设置会因更改注册表单而被触发。是否有一个钩子需要在 WP 中触发用户注册,而在第二种情况下未触发?

事实上,WordPress 中使用哪个钩子在 Discourse 中创建用户?必须有一个 API 调用来触发 Discourse 中的活动。它是否可能因为某些原因未能触发?

1 个赞

当这些用户点击 Discourse 中的“登录”时,会发生什么?请准确描述他们尝试登录时发生的情况。我明白用户在 WordPress 中创建后不会显示在您的管理面板中,但这稍微有点不同。

1 个赞

用户在 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,并且 URL https://community.showprowess.com 会带我到一个已登录的 Discourse 页面。也许用户是使用浏览器 Cookie 或其他方式登录的,但现在不再有效了。

用户未在 Discourse 中注册时
这两种表单(新旧表单)都出现了这种情况。
在这种情况下,我重新登录并完成了入职流程,这次用户在 Discourse 中被创建了。在此之前,用户在 Discourse 中不存在(我在再次登录前检查了管理区域的新用户列表)。
我遵循了与上述相同的步骤 - 点击 /sessions URL 在 Discourse 中自动登录。如果我只点击社区域名,则不会登录。

不幸的是,我无法重现用户在注册时未创建,但在首次登录时创建的情况。这种情况并非发生在每个新用户注册时,这非常奇怪。

希望这有帮助。

1 个赞

说实话,我有点不明白你描述的这个问题与你之前描述的由两个不同的WordPress注册表单引起的问题有什么关系。但我认为我仍然可以帮助你。

有一点需要明白的是,没有办法(也从来没有办法)能够即时登录到两个不同域上的两个不同服务。当看起来你已经登录到域 A 上的服务 A,然后又去访问域 B 上的服务 B 时,你也被登录了,这实际上发生的是,只有当你访问域 B 并启动登录过程时,你才通过服务 A 登录到服务 B,而不是在此之前。

还有一点需要明白的是,除了你所描述的想要将用户重定向到应用程序中需要会话的特定位置的特定场景之外,大多数用户并不关心,或者根本不会注意到有时需要点击服务 B 上的“登录”。根据我与客户在身份解决方案方面工作的经验,网站管理员通常比他们的用户对这一点更敏感。

这种情况的工作方式没有改变。当用户看起来“自动”登录时,实际上发生的是他们被重定向回 WordPress,然后在 WordPress 会话经过身份验证后,再被重定向回 Discourse。如果用户已经在 WordPress 中登录,那么这看起来就像他们“自动”登录到 Discourse,因为这个重定向会在用户无需执行任何操作的情况下发生。

你可以通过使用你已经分享的路径来触发“自动”登录,并在登录后将他们重定向到 Discourse 中的特定位置。

https://community.showprowess.com/session/sso?return_path=[any path in Discourse]

如果用户在使用此 URL 时已登录 WordPress,但尚未登录 Discourse,则会发生以下情况:

  1. Discourse 自动启动 DiscourseConnect 登录过程
  2. 用户浏览器被重定向到 WordPress
  3. 用户已登录,因此用户会自动重定向回 Discourse
  4. 如果在 1 中使用的 URL 中存在 return_path 值,用户将被重定向到该位置

从用户的角度来看,他们会看到他们的浏览器短暂加载,但他们将有效地“自动”登录到 Discourse 并被重定向到应用程序的特定部分。

请注意,如果你将站点设置 discourse connect allows all return paths 设置为 true,你实际上可以将 return_path 设置为任何 URL,甚至是单独的域。

2 个赞

谢谢!这有助于解决将用户从 WP 自动登录到 Discourse 的问题。我可以使用 return_path 将用户重定向到 Discourse 中的任何页面。这解决了将用户重定向到消息页面的问题。

但是,我仍然不确定为什么在某些情况下,当用户在 WordPress 中创建时,用户没有在 Discourse 中创建。您知道用户何时真正从 SSO 在 Discourse 中创建吗?

  1. 是在 WP 中创建用户时吗?
  2. 是当新的 WordPress 用户尝试访问 Discourse,然后用户被创建、登录并重定向到 Discourse 时吗?

我们在 WP 中使用哪个钩子在 Discourse 中创建用户?

我试图了解什么边缘情况会在用户在 WP 中创建时不在 Discourse 中创建用户。

实际用例:
我每周都会向新用户发送一条欢迎消息。上周有 30 位用户加入了 WP,其中 16 位在 Discourse 中创建。当我想在欢迎消息中标记他们时,我无法标记所有人——这对我来说非常奇怪。

感谢 Angus 的帮助。我很感激。

1 个赞

使用默认设置,用户在首次通过 DiscourseConnect 登录 Discourse 时在 Discourse 中创建。在此之前,Discourse 中不存在任何用户。

WP Discourse 插件还有一个名为“登录时创建或同步 Discourse 用户”的设置,启用后,将在用户在 WordPress 中注册后通过 Discourse API 创建用户。此设置使用 wp_login 的 wp 操作,因此您的用户注册过程必须触发该操作才能使此功能正常工作。

2 个赞

现在一切都说得通了。谢谢你,Angus。

我勾选了“登录时创建或同步 Discourse 用户”设置。用户未在 Discourse 中创建,因为有些用户在 WP 上注册,但在首次登录时未访问社区。他们可能会回来登录,然后点击社区 URL,之后用户就会被创建。

当前的 WP 注册后自动登录不使用 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(); 
  }
}

我更希望在 WP 注册时在 Discourse 中创建用户。
我在用户注册表单上有自定义钩子,可以运行 API。我能否在自定义钩子中添加代码,通过 API 在 Discourse 中创建用户?

这是我不知道如何做的一部分,即从自定义钩子触发 wp_login。

2 个赞

只需将一个操作触发器添加到您的代码中。

do_action( 'wp_login' );
2 个赞

我完全按照你说的做了。

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: Too few arguments to function WPDiscourse\WordPressEmailVerification\WordPressEmailVerification::verify_email_after_login(), 1 passed in /home/customer/www/[domain.com/public_html/wp-includes/class-wp-hook.php on line 307 and exactly 2 expected in /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', 'User verified', 'Status must change' ); 
   
    return false;
}

这是代码顺序问题,还是我需要向 wp_login 操作传递一些参数?

编辑:用户已在 WP 中创建并登录,但用户未在 Discourse 中创建。

1 个赞

我建议你阅读一下关于该操作的文档。WP 文档比我更适合作为这方面的资源。很遗憾,我无法在此弄清楚如何最好地集成你的自定义 WP 登录代码。至于你遇到的问题,我认为我们已经弄清楚了。

3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.