# DiscourseConnect 和用户时区/位置

**URL:** https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461
**Category:** WordPress
**Created:** [2022年三月19日 22:38 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461 "2022-03-19T22:38:16Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月19日 22:38 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/1 "2022-03-19T22:38:16Z")

</div>

您好！

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

在“site\_settings/category/login”下似乎有一个名为“[discourse connect](https://meta.discourse.org/t/13045?silent=true) overrides location”的 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 设置。这是否仅适用于“位置”字段，还是也处理了时区？勾选此框后，[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 会从 WP 数据库的哪个位置提取此信息？

即，如果我们实施自己的类似设置，我们希望将其存储在正确的位置，以便在启用“位置”选项时通过 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 正确同步。

谢谢！

---

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月21日 18:28 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/2 "2022-03-21T18:28:48Z")

</div>

在进一步研究之后，我猜测在 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 中勾选“覆盖位置”选项不会采用 WordPress 的时区设置，如果我们想要这个功能，最好的方法是通过 API 在用户编辑该信息时进行设置。如果我猜对了，请告诉我。

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

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

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2022年三月22日 07:50 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/3 "2022-03-22T07:50:13Z")

</div>

嘿 @troygrady，抱歉回复缓慢（我负责处理 [WP Discourse](https://github.com/discourse/wp-discourse) 插件上的问题）。我将分别处理时区和位置设置（它们是无关的）。

### 时区

> [@troygrady](#):
>
> 我们将添加用户在 Wordpress 中调整其时区的功能，以便他们在我们网站上的活动以本地时间显示

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

 ![Screenshot 2022-03-22 at 08.33.55](https://global.discourse-cdn.com/meta/original/3X/3/f/3ff5534cd5d8bbbad8a77fb703990cfe74a87ba2.png)

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

### 位置

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

```php
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 位置字段只是一个“字符串”字段，这意味着它将仅显示输入其中的任何内容。它不会影响用户的时区，也不是地理位置（即与地图以任何方式关联）。

---

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月22日 14:59 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/4 "2022-03-22T14:59:01Z")

</div>

谢谢 Angus！延迟没关系。

> [@angus](#):
>
> > [@troygrady](#):
> >
> > 我们正在添加一项功能，允许用户在 WordPress 中调整他们的时区，以便他们在我们网站上的活动以本地时间显示
> 
> 你能否澄清一下，你的意思是希望用户的活动以_他们_的本地时间显示？如果是这样，与 WordPress 不同，Discourse 目前默认就是这样。

抱歉造成困惑！是的，本地时区，是的，标准的 Discourse 行为很棒。正如你所指出的，问题不在于 Discourse，而在于 WP 没有能力让用户以本地时区查看网站。这就是我们想要添加的。如果我们让用户设置他们的时区，那么我认为我们也应该让该设置覆盖 Discourse 的设置，以便它们保持同步。这就是我想知道 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 是否提供的内容。听起来它不提供。

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

> [@angus](#):
>
> 你可以将 WordPress 用户配置文件中设置的位置与 Discourse 中用户配置文件的位置字段同步。它不会默认同步，因为 WordPress 中没有与 Discourse 中的位置字段等效的标准字段。

太好了，这是缺失的信息——我不知道 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 应该从 WP 端的位置数据中获取什么。我们手动实现了自己的位置字段，在 usermeta 中，所以我们可以使用 wpdc\_sso\_params 钩子从中提取值。

我比较迟钝，所以可能忽略了。是否有关于 wpdc\_sso\_params 的文档？我找到了这个帖子，目前似乎涵盖了它：

> [@Map custom User Fields](https://meta.discourse.org/t/map-custom-user-fields/156164/7):
>
> You can update User Fields that you have created on Discourse via SSO. This does not require a plugin. To do this, you need to know the name that Discourse uses in the database for the custom field. The easiest way I know of to do this is by going to your Admin / Customize / User Fields page and then loading the JSON version of the page. For example https://forum.example.com/admin/customize/user\_fields.json The JSON data of the page will look something like this: { user\_fields: [ { id: 12, nam…

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2022年三月22日 15:10 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/5 "2022-03-22T15:10:49Z")

</div>

> [@troygrady](#):
>
> 如果我们允许用户设置他们的时区，那么我想我们也应该让该设置覆盖 Discourse 的设置，以便它们同步。这就是我想知道 [DiscourseConnect](https://meta.discourse.org/t/13045) 是否提供此功能。听起来它没有。

不，您无法通过 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 设置时区，我也不建议尝试这样做，因为跨平台/标准时区的可移植性有点棘手（有多个“标准”时区列表，但略有不同）。

> [@troygrady](#):
>
> 我很迟钝，所以我可能忽略了它。是否有 wpdc\_sso\_params 的文档？我找到了这个帖子，目前似乎涵盖了它：

没有结构化的文档。我正在对所有 [WP Discourse](https://github.com/discourse/wp-discourse) 文档进行大修，并将发布一个全面的操作和过滤器列表 🙂

---

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月22日 15:15 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/6 "2022-03-22T15:15:22Z")

</div>

没问题，没问题。

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

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2022年三月22日 15:31 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/7 "2022-03-22T15:31:45Z")

</div>

为了让我清楚，您想做的是：

1. 有一个包含“用户平台主页”的 WordPress 自定义字段
2. 使用 `wpdc_sso_params` 过滤器将自定义字段传递给 Discourse（如[此处](https://meta.discourse.org/t/map-custom-user-fields/156164/7?u=angus)所述）。
3. 在 Discourse 用户卡片上显示自定义字段，并且不允许用户在 Discourse 个人资料中编辑它（不勾选“注册后可编辑”）。

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

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

---

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月22日 15:42 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/8 "2022-03-22T15:42:22Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2022年三月22日 16:06 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/9 "2022-03-22T16:06:47Z")

</div>

> [@troygrady](#):
>
> 但是，由于我们的用户实际上从未看到 Discourse 注册表单，因此这可能无关紧要。

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

> [@troygrady](#):
>
> 换句话说，是否有办法创建仅供内部使用而永远不会出现在 Discourse 的任何用户可编辑表单中的自定义字段？我想这在将 WP 或其他外部平台数据集成到 Discourse 显示方面有许多潜在用途。

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

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

```

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

---

<div class="post-metadata">

### Author: ![troygrady](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/troygrady/32/232574_2.png) [@troygrady](https://meta.discourse.org/u/troygrady)
#### Post date: [2022年三月22日 16:39 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/10 "2022-03-22T16:39:40Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2022年四月21日 16:40 UTC](https://meta.discourse.org/t/discourseconnect-and-user-time-zone-location/221461/11 "2022-04-21T16:40:21Z")

</div>

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