troygrady
(Troy Grady)
2022 年3 月 19 日 22:38
1
您好!
我们正在为 WordPress 添加用户调整时区功能,以便他们在我们网站上的活动能以本地时间显示。在进行此操作的同时,我们认为最好也让该设置同步到论坛,这样用户就不必设置两次。目前,Discourse 上的用户在“偏好设置/个人资料”下设置自己的位置和时区,因此我们希望尽可能覆盖该设置。
在“site_settings/category/login”下似乎有一个名为“discourse connect overrides location”的 DiscourseConnect 设置。这是否仅适用于“位置”字段,还是也处理了时区?勾选此框后,DiscourseConnect 会从 WP 数据库的哪个位置提取此信息?
即,如果我们实施自己的类似设置,我们希望将其存储在正确的位置,以便在启用“位置”选项时通过 DiscourseConnect 正确同步。
谢谢!
3 个赞
troygrady
(Troy Grady)
2022 年3 月 21 日 18:28
2
在进一步研究之后,我猜测在 DiscourseConnect 中勾选“覆盖位置”选项不会采用 WordPress 的时区设置,如果我们想要这个功能,最好的方法是通过 API 在用户编辑该信息时进行设置。如果我猜对了,请告诉我。
不过,我仍然不确定“位置”信息来自 WordPress 的哪一端,甚至它是否会传输过来。例如,我没有在我的用户的“最后载荷”中看到“位置”令牌。但我确实看到了头像、简介、用户名、外部 ID 等。值得注意的是,简介信息正在传输过来,尽管我们实际上并没有开启“覆盖简介”功能,所以“位置”信息也应该会传输过来?
如果你有时间,@simon ,我相信你是插件大师。如果你有什么见解,请告诉我。谢谢!
1 个赞
angus
(Angus McLeod)
2022 年3 月 22 日 07:50
3
嘿 @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 个赞
troygrady
(Troy Grady)
2022 年3 月 22 日 14:59
4
谢谢 Angus!延迟没关系。
抱歉造成困惑!是的,本地时区,是的,标准的 Discourse 行为很棒。正如你所指出的,问题不在于 Discourse,而在于 WP 没有能力让用户以本地时区查看网站。这就是我们想要添加的。如果我们让用户设置他们的时区,那么我认为我们也应该让该设置覆盖 Discourse 的设置,以便它们保持同步。这就是我想知道 DiscourseConnect 是否提供的内容。听起来它不提供。
我没有 意识到 Discourse 的设置是自动的。如果是这样,我们可能就保持原样。即,在 WP 中实现本地时区,而不让该值覆盖 Discourse 的值。是的,它们可能会不同步,但这可能对大多数用户来说并不是真正的问题。
太好了,这是缺失的信息——我不知道 DiscourseConnect 应该从 WP 端的位置数据中获取什么。我们手动实现了自己的位置字段,在 usermeta 中,所以我们可以使用 wpdc_sso_params 钩子从中提取值。
我比较迟钝,所以可能忽略了。是否有关于 wpdc_sso_params 的文档?我找到了这个帖子,目前似乎涵盖了它:
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…
2 个赞
angus
(Angus McLeod)
2022 年3 月 22 日 15:10
5
不,您无法通过 DiscourseConnect 设置时区,我也不建议尝试这样做,因为跨平台/标准时区的可移植性有点棘手(有多个“标准”时区列表,但略有不同)。
没有结构化的文档。我正在对所有 WP Discourse 文档进行大修,并将发布一个全面的操作和过滤器列表
1 个赞
troygrady
(Troy Grady)
2022 年3 月 22 日 15:15
6
没问题,没问题。
关于 wpdc_sso_params,我们希望包含用户平台主页的链接,并在他们的卡片上显示。看起来我可以将其设置为自定义字段,然后通过类似的钩子传递它。但我希望它仅供我们内部使用,也就是说,我实际上不希望它显示为用户可编辑的内容。由于我们控制所有 WordPress 上的注册,并且论坛账户是自动处理的,这是否有可能解决这个问题?也就是说,我们创建自定义字段,将其设置为创建后不可编辑,然后仅通过 sso 更新其数据。用户永远不会在任何地方看到编辑框?
1 个赞
angus
(Angus McLeod)
2022 年3 月 22 日 15:31
7
为了让我清楚,您想做的是:
有一个包含“用户平台主页”的 WordPress 自定义字段
使用 wpdc_sso_params 过滤器将自定义字段传递给 Discourse(如此处 所述)。
在 Discourse 用户卡片上显示自定义字段,并且不允许用户在 Discourse 个人资料中编辑它(不勾选“注册后可编辑”)。
如果以上正确,那么应该可以工作,前提是您在 WordPress 中没有为自定义字段设置编辑框。
请注意,即使您不选择“注册后可编辑”,管理员也始终可以编辑用户字段(即自定义字段)。要实际查看此功能,您需要使用非管理员账户进行测试。
2 个赞
troygrady
(Troy Grady)
2022 年3 月 22 日 15:42
8
是的,这正是我们想要做的。
不过,有一个问题是,自定义用户字段似乎总是在 Discourse 用户注册表单上显示为可编辑的,即使您从未打算让用户访问它们。我们永远不希望用户编辑他们的平台主页 URL,因为该 URL 是由系统自动生成的。但是,由于我们的用户实际上从未看到 Discourse 注册表单,因此这可能无关紧要。
换句话说,是否有办法创建仅供内部使用(即永远不会出现在任何用户可编辑的 Discourse 表单上)的自定义字段?我认为在将 WP 或其他外部平台数据集成到 Discourse 显示方面,这有很多潜在用途。
1 个赞
angus
(Angus McLeod)
2022 年3 月 22 日 16:06
9
对。他们不会看到登录表单。
是的,但它们不会自动出现在用户卡片上,而这正是您希望显示数据的位置,对吗?不过,如果您想要这样,您可以随时在 wpdc_sso_params 过滤器中添加任何任意字段,例如:
$sso_params["custom.not_a_user_field"] = "field value";
这将存储在 Discourse 的 user_custom_fields 数据库表中,但不会在任何地方可见。您可以使用数据浏览器插件对其进行查询。
3 个赞
troygrady
(Troy Grady)
2022 年3 月 22 日 16:39
10
好的,我们希望在用户卡片上显示 WP 生成的与用户主站点账户相关的任意字段,例如他们的主页 URL,以及可能存在的其他字段。这些字段永远不打算由用户提供,即使在创建账户时也是如此。它们仅供用户显示。在我们的案例中,自定义“用户”字段似乎是最佳方法,因为它已经包含了个人资料和卡片的显示选项。而且用户根本不会看到注册表单。
边缘情况是,如果您不使用 SSO,用户将在注册表单上看到这些字段,尽管他们不打算填写它们。我想那里的解决方法就是用 CSS 隐藏它们?
无论如何,在我们的案例中,我们似乎已经找到了解决方案。谢谢!
2 个赞
system
(system)
关闭
2022 年4 月 21 日 16:40
11
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.