DiscourseConnect 和用户时区/位置

您好!

我们正在为 WordPress 添加用户调整时区功能,以便他们在我们网站上的活动能以本地时间显示。在进行此操作的同时,我们认为最好也让该设置同步到论坛,这样用户就不必设置两次。目前,Discourse 上的用户在“偏好设置/个人资料”下设置自己的位置和时区,因此我们希望尽可能覆盖该设置。

在“site_settings/category/login”下似乎有一个名为“discourse connect overrides location”的 DiscourseConnect 设置。这是否仅适用于“位置”字段,还是也处理了时区?勾选此框后,DiscourseConnect 会从 WP 数据库的哪个位置提取此信息?

即,如果我们实施自己的类似设置,我们希望将其存储在正确的位置,以便在启用“位置”选项时通过 DiscourseConnect 正确同步。

谢谢!

3 个赞

在进一步研究之后,我猜测在 DiscourseConnect 中勾选“覆盖位置”选项不会采用 WordPress 的时区设置,如果我们想要这个功能,最好的方法是通过 API 在用户编辑该信息时进行设置。如果我猜对了,请告诉我。

不过,我仍然不确定“位置”信息来自 WordPress 的哪一端,甚至它是否会传输过来。例如,我没有在我的用户的“最后载荷”中看到“位置”令牌。但我确实看到了头像、简介、用户名、外部 ID 等。值得注意的是,简介信息正在传输过来,尽管我们实际上并没有开启“覆盖简介”功能,所以“位置”信息也应该会传输过来?

如果你有时间,@simon,我相信你是插件大师。如果你有什么见解,请告诉我。谢谢!

1 个赞

@troygrady,抱歉回复缓慢(我负责处理 WP Discourse 插件上的问题)。我将分别处理时区和位置设置(它们是无关的)。

时区

您能否澄清一下,您的意思是希望用户的活动以_他们_的本地时间显示吗?如果是这样,与 Wordpress 不同,这在 Discourse 中是默认的(无需使用 DiscourseConnect),并且即使用户未设置也会自动更新。例如,我最近从“Australia/Perth”时区切换到了“Europe/Oslo”。我没有更改此处的个人资料中的时区设置,它现在显示为

您想要与此不同的行为吗?

位置

您可以将 Wordpress 用户个人资料中的位置设置与 Discourse 中用户个人资料的位置字段同步。它默认不同步,因为 Wordpress 中没有与 Discourse 中的位置字段等效的标准字段。您需要在此处添加一些代码。在您的主题的 functions.php 文件或其他可以添加代码的位置,您需要添加类似以下内容,关键部分是使用 wpdc_sso_params 过滤器。

function sync_discourse_location( $params, $user ) {
    $location = get_user_meta( $user->ID, 'user_location_meta', true );
    if ( $location  ) {
        $params['location'] = $location;
    }
    return $params;
}
add_filter( 'wpdc_sso_params', 'sync_discourse_location', 10, 2 );

请注意,您需要将 ‘user_location_meta’ 替换为您 Wordpress 实例中用于存储用户位置的用户元字段(即您正在使用的插件用于将用户位置添加到 Wordpress 的任何字段)。

另请注意,Discourse 位置字段只是一个“字符串”字段,这意味着它将仅显示输入其中的任何内容。它不会影响用户的时区,也不是地理位置(即与地图以任何方式关联)。

1 个赞

谢谢 Angus!延迟没关系。

抱歉造成困惑!是的,本地时区,是的,标准的 Discourse 行为很棒。正如你所指出的,问题不在于 Discourse,而在于 WP 没有能力让用户以本地时区查看网站。这就是我们想要添加的。如果我们让用户设置他们的时区,那么我认为我们也应该让该设置覆盖 Discourse 的设置,以便它们保持同步。这就是我想知道 DiscourseConnect 是否提供的内容。听起来它不提供。

没有意识到 Discourse 的设置是自动的。如果是这样,我们可能就保持原样。即,在 WP 中实现本地时区,而不让该值覆盖 Discourse 的值。是的,它们可能会不同步,但这可能对大多数用户来说并不是真正的问题。

太好了,这是缺失的信息——我不知道 DiscourseConnect 应该从 WP 端的位置数据中获取什么。我们手动实现了自己的位置字段,在 usermeta 中,所以我们可以使用 wpdc_sso_params 钩子从中提取值。

我比较迟钝,所以可能忽略了。是否有关于 wpdc_sso_params 的文档?我找到了这个帖子,目前似乎涵盖了它:

2 个赞

不,您无法通过 DiscourseConnect 设置时区,我也不建议尝试这样做,因为跨平台/标准时区的可移植性有点棘手(有多个“标准”时区列表,但略有不同)。

没有结构化的文档。我正在对所有 WP Discourse 文档进行大修,并将发布一个全面的操作和过滤器列表 :slight_smile:

1 个赞

没问题,没问题。

关于 wpdc_sso_params,我们希望包含用户平台主页的链接,并在他们的卡片上显示。看起来我可以将其设置为自定义字段,然后通过类似的钩子传递它。但我希望它仅供我们内部使用,也就是说,我实际上不希望它显示为用户可编辑的内容。由于我们控制所有 WordPress 上的注册,并且论坛账户是自动处理的,这是否有可能解决这个问题?也就是说,我们创建自定义字段,将其设置为创建后不可编辑,然后仅通过 sso 更新其数据。用户永远不会在任何地方看到编辑框?

1 个赞

为了让我清楚,您想做的是:

  1. 有一个包含“用户平台主页”的 WordPress 自定义字段
  2. 使用 wpdc_sso_params 过滤器将自定义字段传递给 Discourse(如此处所述)。
  3. 在 Discourse 用户卡片上显示自定义字段,并且不允许用户在 Discourse 个人资料中编辑它(不勾选“注册后可编辑”)。

如果以上正确,那么应该可以工作,前提是您在 WordPress 中没有为自定义字段设置编辑框。

请注意,即使您不选择“注册后可编辑”,管理员也始终可以编辑用户字段(即自定义字段)。要实际查看此功能,您需要使用非管理员账户进行测试。

2 个赞

是的,这正是我们想要做的。

不过,有一个问题是,自定义用户字段似乎总是在 Discourse 用户注册表单上显示为可编辑的,即使您从未打算让用户访问它们。我们永远不希望用户编辑他们的平台主页 URL,因为该 URL 是由系统自动生成的。但是,由于我们的用户实际上从未看到 Discourse 注册表单,因此这可能无关紧要。

换句话说,是否有办法创建仅供内部使用(即永远不会出现在任何用户可编辑的 Discourse 表单上)的自定义字段?我认为在将 WP 或其他外部平台数据集成到 Discourse 显示方面,这有很多潜在用途。

1 个赞

对。他们不会看到登录表单。

是的,但它们不会自动出现在用户卡片上,而这正是您希望显示数据的位置,对吗?不过,如果您想要这样,您可以随时在 wpdc_sso_params 过滤器中添加任何任意字段,例如:

$sso_params["custom.not_a_user_field"] = "field value";

这将存储在 Discourse 的 user_custom_fields 数据库表中,但不会在任何地方可见。您可以使用数据浏览器插件对其进行查询。

3 个赞

好的,我们希望在用户卡片上显示 WP 生成的与用户主站点账户相关的任意字段,例如他们的主页 URL,以及可能存在的其他字段。这些字段永远不打算由用户提供,即使在创建账户时也是如此。它们仅供用户显示。在我们的案例中,自定义“用户”字段似乎是最佳方法,因为它已经包含了个人资料和卡片的显示选项。而且用户根本不会看到注册表单。

边缘情况是,如果您不使用 SSO,用户将在注册表单上看到这些字段,尽管他们不打算填写它们。我想那里的解决方法就是用 CSS 隐藏它们?

无论如何,在我们的案例中,我们似乎已经找到了解决方案。谢谢!

2 个赞

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