我们正在使用 Discourse 而非 WordPress 评论(已勾选“移除 WordPress 评论模板”,并启用了 Ajax)。我在自定义文章类型上设置了 Toolset 访问控制,该类型会发布到 Discourse(对应一个与访问控制相匹配的私有分类)。通常此类控制也会影响帖子评论的可见性,但 Discourse 评论的显示并未受到影响。有什么建议吗?
或许我可以在此补充一些背景信息:
我们在 WordPress 网站上有一个私有的自定义文章类型,其文章应与私有 Discourse 分类中的话题相关联。拥有该 Discourse 分类访问权限的用户,同样可以访问 WordPress 上的相应文章。我们实现这一方式的方法是:在 WordPress 中将这些用户分配为“编辑者”角色,而在 Discourse 中,他们属于一个“组”,该组赋予他们访问私有分类的权限。
在任何情况下,未登录用户都不应看到 WordPress 上的文章或 Discourse 中的话题讨论。目前,通过各自的角色和组访问控制,这一目标已按预期实现。如上所述,在 WordPress 端,我们使用 Toolset Access 插件来限制对该自定义文章类型所有文章的访问。
然而,来自 Discourse 的私有讨论线程在通过嵌入方式显示在 WordPress 上时,却对公众可见,尽管文章本身的内容已被隐藏。换句话说,嵌入的 Discourse 评论并未受到访问控制的有效保护。我们正试图找出是什么导致这些输出绕过了访问控制流程,以及如何修复这一问题。
WP Discourse 插件通过加载自定义评论模板来显示评论。它使用 WordPress 的 comments_template 过滤器来加载该自定义模板。我不确定为什么在您为文章类型配置了 Toolset Access Control 的情况下,评论仍然会加载。我会调查一下具体原因。
我认为该插件应添加一个选项,以便不加载已发布到私有 Discourse 分类的帖子的评论。启用后,将仅显示指向 Discourse 主题的链接。不过,我不确定这是否能解决您遇到的问题。
你好,Simon,我正在和@Kayla 一起处理这个问题。你在这里描述的内容将解决我们的问题。
此外,了解如何将 Discourse 评论模板纳入我们更细粒度的访问控制中也很重要。谢谢!
太好了!我认为在插件的下一个版本中实现这一点应该没有问题。我会尽量在本周末前完成。我会随时向你同步进展。
我认为你遇到的问题与 WP Discourse 挂钩到 WordPress comments_template 过滤器钩子的优先级有关。WP Discourse 插件在调用挂钩到此过滤器的函数时,使用的优先级为 20。Toolset 插件可能以较低的优先级挂钩到此过滤器,以防止在受保护页面加载评论模板。
我已就此与 Toolset 取得联系,并意识到我之前对预期行为的理解有误。Toolset Access 插件根本不会挂钩到评论模板。要在受限内容上隐藏评论,需要编写自定义代码,挂钩到他们的 toolset_access_api_get_post_permissions 过滤器,以在主题层面抑制或允许渲染评论模板。很抱歉,我之前没有意识到他们的内容限制实际上是指内容模板本身。![]()
此选项已添加至插件的 2.0.7 版本,目前可在 WordPress 仓库 中找到。
当您选择插件的“启用 Discourse 评论”选项后,现在会看到三种评论类型选项:
选择“仅显示公开主题的评论”选项,则仅当主题位于公开的 Discourse 分类中时才会显示评论。如果主题发布到了私密分类,则会显示指向该主题的链接及其评论 数量。
如果从 WordPress 发布到 Discourse 的主题在 Discourse 上从公开分类移到了私密分类,WordPress 上的评论将被移除并替换为链接。由于 WP Discourse 插件会缓存从 Discourse 返回的评论数据,此变更可能需要长达 10 分钟才能生效。您可以通过在插件的“发布设置”页面中选择“强制更新分类”选项并保存该设置页面,立即清除分类缓存。
为了让插件能够访问 Discourse 子分类的分类权限,您需要在插件的“发布设置”选项卡中选择“显示子分类”选项。如果未启用该选项,但已启用“仅显示公开主题的评论”选项,则 Discourse 上的所有子分类都将被视为私密分类,此时将显示链接而非评论。
注意: 仅当您的站点运行较新版本的 Discourse 时,插件才能识别直接在 Discourse 上进行的分类变更。
若要编程式地控制哪些用户会显示 Discourse 评论,您可以完全绕过为特定用户加载 WP Discourse 评论,方法是使用 wpdc_load_comments_template_for_user 过滤器钩子。该钩子会接收三个参数:$load_template(默认为 true)、$current_user 和 $post_id。在挂钩到该过滤器的函数中返回 false,即可阻止为特定用户加载评论。
我在这次更新中发现的变化是:虽然 discourse_replies_html 正常加载且显示符合预期,但 discourse_no_replies_html 似乎未能加载(看到了“加入讨论链接:无评论”的文本链接,但没有我们的模板)。此外,如果帖子尚未发布到 Discourse,会出现一条新消息:“此帖子当前无法查看评论。”这些帖子都是发布到公开 Discourse 分类的公开帖子。
对于发布到私有 Discourse 分类的帖子,似乎加载了默认的 WordPress 评论表单,没有指向 Discourse 话题的链接。
“显示公开话题的评论”和“显示子分类”均已启用。我已更新了“清除缓存的评论 HTML + 强制更新分类”。我是否遗漏了什么?
感谢您反馈!该问题已在 WP Discourse 2.0.8 版本 中修复。
我将在今天晚些时候或明天对插件进行一些更改,以解决您报告的其他问题。对于尚未发布到 Discourse 的帖子,无法加载 WordPress 评论模板的问题必须立即修复。
当我选择“显示公共主题的评论”选项和“显示现有 WP 评论”选项,然后发布一个包含现有 WordPress 内容的帖子时,我看到的情况如下:
从用户的角度来看,这看起来不太清晰(这可以通过一些 WordPress 自定义来修复),但 Discourse 评论的链接确实存在。
如果您启用了“缓存评论 HTML”站点设置,请尝试禁用它。该设置本不应导致问题,但取消选中它可以简化对此问题的调试。
请发送您拥有的关于该问题的任何其他详细信息。我今天晚些时候将向 WordPress 仓库推送一个小更新,以修复与 WordPress 5.5 版本相关的“取消链接主题”按钮的问题。
我们目前使用的是 WP 5.5 下的 2.1.1 版本。我们没有启用评论缓存,也没有使用 WP 自带的评论系统(但现在默认表单不再加载,这很好)。
然而,自定义模板有时能加载,有时却不能。我们已恢复为无论 Discourse 话题是否私密,都显示所有帖子的评论,但这并没有解决问题。我无法确定原因,但问题似乎对各个帖子是持续存在的。以下是公开话题中公开帖子的示例:
无评论,未加载 discourse_no_replies_html:
无评论,已加载 discourse_no_replies_html:
有评论,未加载 discourse_replies_html:
有评论,已加载 discourse_replies_html:
这个问题可能与自定义模板有关,但也有一份其他报告指出评论模板未能加载,反而显示了评论链接。我在开发网站上无法复现该问题,但我将对该插件进行一个小修改以解决此问题。预计明天一早即可准备好。感谢您的耐心等待!
您能否尝试将插件更新至 2.1.2 版本,并告知我该问题是否已解决?
我可以确认,升级到 2.1.2 版本已解决了我们的模板加载问题。谢谢!
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.

