# 允许用户屏蔽关键词

**URL:** https://meta.discourse.org/t/allow-users-to-block-keywords/256228
**Category:** Theme component
**Created:** [2023年二月25日 07:22 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228 "2023-02-25T07:22:20Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![asc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/asc/32/288324_2.png) [@asc](https://meta.discourse.org/u/asc)
#### Post date: [2023年二月25日 07:22 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/1 "2023-02-25T07:22:21Z")

</div>

|||  
|-|-|-|  
| ℹ | **摘要** | 此主题组件允许用户屏蔽关键字。需要先在管理员设置中创建三个自定义用户字段才能正常工作。  
| 👓| **预览** | 我无法在主题创建器中预览此功能，因为它需要创建用户字段，但我已在下方附上屏幕截图。 |  
| : hammer\_and\_wrench:| **仓库** | [Github - a-very-old-sock/discourse-keyword-block](https://github.com/a-very-old-sock/discourse-keyword-block) |  
| ❓| **安装指南** |[如何安装主题或主题组件](https://meta.discourse.org/t/how-do-i-install-a-theme-or-theme-component/63682)|  
| 📖| **刚接触 Discourse 主题？** | [Discourse 主题使用入门指南](https://meta.discourse.org/t/beginners-guide-to-using-discourse-themes/91966)

安装此主题组件

此主题组件允许用户屏蔽关键字，这些关键字由用户在“首选项”\>“个人资料”中指定。需要先在管理员设置中创建三个自定义用户字段才能正常工作。

在主题标题或主题摘要中屏蔽关键字：

 ![Screen Shot 2023-02-25 at 9.05.12 PM](https://global.discourse-cdn.com/meta/original/4X/3/9/5/3956d6c82fd3957f47499778056ba9d8b480df46.png)

屏蔽包含关键字的主题或回复帖子，以及包含关键字的建议主题：

 ![Screen Shot 2023-02-25 at 9.06.09 PM](https://global.discourse-cdn.com/meta/original/4X/d/8/b/d8b13b589f0da1198cb85cfe94973c8458b02049.png)

此主题组件允许单个用户指定他们不想看到的内容的关键字，并隐藏包含该关键字的主题和回复帖子，同时提供一个显示链接。已关注的词语是一个管理员设置，适用于所有用户和整个站点；这允许单个用户指定他们不想看到的内容的关键字。

例如：一个宠物论坛可能有一个关于处理宠物毛发的一般性主题，但主要主题没有标记特定种类的动物。用户 A 回复了关于他们的狗的内容，用户 B 回复了关于他们的猫的内容，但用户 A 完全不想看到任何关于猫的内容。此主题组件允许用户 A 将“猫”添加到他们的屏蔽列表中，然后在任何地方，“猫”出现在主题或回复中，都会被替换为“已屏蔽，因为包含猫”，并附带一个可点击的显示链接。

用户必须在“首选项”\>“个人资料”的自定义用户字段中指定一个逗号分隔的屏蔽关键字列表，并且可以指定关键字是否区分大小写或必须匹配整个单词。（区分大小写和全词匹配适用于整个屏蔽列表，而不是单个关键字）。

此主题组件要求您在“管理员”\>“自定义”\>“用户字段”中创建三个自定义用户字段才能正常工作。默认情况下，主题组件设置期望这些用户字段按以下顺序排列：1、2 和 3。如果您定义了其他自定义用户字段，则需要在主题组件设置中输入正确的用户字段编号。（用户字段编号从 1 开始，因此请向下计数您已定义的其他用户字段的数量）。有关更多详细信息，请参阅 Meta [创建和配置自定义用户字段指南](https://meta.discourse.org/t/create-and-configure-custom-user-fields/113192)。

**1 - 用户的屏蔽词列表**

字段类型：文本字段

字段名称：（任何名称都可以）屏蔽词

字段描述：（任何描述都可以）屏蔽帖子或主题中出现的词语或短语。逗号分隔。要屏蔽用户名，请在选择了全词匹配的情况下包含 @。

✅ 注册后可编辑

❌ 注册时必填

❌ 显示在公开个人资料上

❌ 显示在用户卡上

❌ 可搜索

**2 - 区分大小写**

字段类型：确认

字段名称：（任何名称都可以）屏蔽词 - 区分大小写

字段描述：（任何描述都可以）“屏蔽词”列表中的词语区分大小写。

✅ 注册后可编辑

❌ 注册时必填

❌ 显示在公开个人资料上

❌ 显示在用户卡上

❌ 可搜索

**3 - 搜索全词或部分词**

字段类型：确认

字段名称：（任何名称都可以）屏蔽词 - 全词

字段描述：（任何描述都可以）屏蔽词必须是完整的单词，而不是部分单词。

✅ 注册后可编辑

❌ 注册时必填

❌ 显示在公开个人资料上

❌ 显示在用户卡上

❌ 可搜索

下面的 CSS 已包含在主题组件中，它将阻止在注册表单上显示任何自定义用户字段。如果您有其他希望在注册表单上显示的自定义用户字段，则需要用自己的自定义 CSS 覆盖它。

```css
.login-form .user-fields {
    display: none;
}

```

我只在默认主题上测试过此功能。当类别设置为显示“类别/最新”和“类别/热门”时，会屏蔽帖子和主题，但在“类别/精选”或任何框式类别视图中则不会。我不太可能更改此设置，因为我自己的站点不需要它，但欢迎提交拉取请求。

此功能目前仅屏蔽在浏览器中可见的标题或摘要中包含关键字的帖子。我一直无法弄清楚如何在查看搜索结果或主题列表时检查整个帖子的内容，但我很乐意听取任何有关如何实现此功能的想法。

我打算让此功能也能在全页搜索视图中运行，但截至 2023 年 2 月 24 日，我目前正[在努力使其正常工作](https://meta.discourse.org/t/api-decoratepluginoutlet-not-firing/256204)。如果我能够让搜索屏蔽生效，我会在此处进行编辑。

此功能 **兼容** “主题摘要”主题组件；它 **不兼容** “主题列表预览”。我没有对其他主题组件进行广泛测试。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年二月25日 09:35 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/3 "2023-02-25T09:35:26Z")

</div>

创建自定义用户字段并启用组件后，我看到了这个：

 ![image](https://global.discourse-cdn.com/meta/original/4X/b/9/8/b982d380542122b14484195d2929293350b59dd4.jpeg)

有什么想法它想警告我什么吗？也许是因为这个：

`用户关键字阻止程序主题/组件正在抛出错误：TypeError：null 不是对象（正在评估 'e.match'）`

> **堆栈跟踪**
>
> ```plaintext
> 消息
> 
> 用户关键字阻止程序主题/组件正在抛出错误：
> TypeError：null 不是对象（正在评估 'e.match'）
> 
> 堆栈跟踪
> 
> viewingCategoryId@https://foorumi.katiska.eu/theme-javascripts/2d7e05cf5f7eb3e5f8699871f25f32a21d9221c2.js?__ws=foorumi.katiska.eu:209:77
> @https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:1347:71
> @https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:3677:13
> get@https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:1347:56
> Ee@https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:1324:40
> map@[原生代码]
> @https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:5042:163
> @https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:1347:71
> @https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:3677:13
> get@https://cdnfoorumi.katiska.eu/assets/vendor-f2e959203bc406b4698a4388ad51464d9ee2c5ff7b4011f332b7d88c6ce5dab8.br.js:1347:56
> 
> 环境
> 
> HTTP HOSTS: foorumi.katiska.eu
> 
> ```

那么……我到底做错了什么？

---

<div class="post-metadata">

### Author: ![asc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/asc/32/288324_2.png) [@asc](https://meta.discourse.org/u/asc)
#### Post date: [2023年二月25日 13:13 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/4 "2023-02-25T13:13:58Z")

</div>

嗯，我不确定，我无法使用新创建的用户字段或不存在的用户字段重现此问题。

看起来您使用的是默认主题？您是否启用了其他主题组件？看起来这与正则表达式匹配有关，但如果没有找到任何内容，它不应该抛出错误。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年二月25日 13:32 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/5 "2023-02-25T13:32:45Z")

</div>

当然，我还有其他组件 😉 但当然——这可能与某些其他组件或插件发生冲突。

我会在某个时候再深入研究一下。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年二月25日 13:52 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/6 "2023-02-25T13:52:46Z")

</div>

然后，在这一点上发生了 ;)\n\n冲突发生在它和 [主题列表预览](https://meta.discourse.org/t/topic-list-previews-theme-component/209973) 之间。至少在我的设置中是这样。\n\n所以，让您和 @merefield 争论你们俩（谁？我真的很讨厌英语）修复什么 😉

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2023年二月25日 13:59 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/7 "2023-02-25T13:59:05Z")

</div>

恐怕我太忙了，无法支持与第三方主题组件的冲突，但我对拉取请求持开放态度。目前你只能在它们之间做出选择。🙂

---

<div class="post-metadata">

### Author: ![Heliosurge](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/heliosurge/32/571810_2.png) [@Heliosurge](https://meta.discourse.org/u/Heliosurge)
#### Post date: [2023年二月25日 15:15 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/8 "2023-02-25T15:15:48Z")

</div>

我想知道这是否可以用来扩展用户静音功能？

例如，将静音用户添加到“已阻止”白名单以隐藏对静音用户的回复？

---

<div class="post-metadata">

### Author: ![asc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/asc/32/288324_2.png) [@asc](https://meta.discourse.org/u/asc)
#### Post date: [2023年二月26日 01:47 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/9 "2023-02-26T01:47:41Z")

</div>

理论上我认为是可行的，但我现在找不到简单的方法来做到。我现在用的是 `decorateCooked`，它似乎不能方便地访问包含回复信息的父元素。我可能会再研究一下，看看是否能让它工作，但不敢保证。

这将阻止帖子中提及的用户名，如果用户名在阻止列表中；如果开启了全词匹配，阻止列表中的用户名需要包含 @提及，但如果关闭了全词匹配，则只能包含不带 @ 的用户名。

---

<div class="post-metadata">

### Author: ![asc](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/asc/32/288324_2.png) [@asc](https://meta.discourse.org/u/asc)
#### Post date: [2023年二月26日 02:09 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/10 "2023-02-26T02:09:01Z")

</div>

我也不认为我能让它们兼容，但我已经在 OP 中注明它们不兼容。欢迎提交 PR。

---

<div class="post-metadata">

### Author: ![Heliosurge](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/heliosurge/32/571810_2.png) [@Heliosurge](https://meta.discourse.org/u/Heliosurge)
#### Post date: [2024年七月5日 06:28 UTC](https://meta.discourse.org/t/allow-users-to-block-keywords/256228/11 "2024-07-05T06:28:00Z")

</div>

> [@asc](#):
>
> 我认为理论上是可能的，但我现在找不到简单的方法。我现在使用的是 decorateCooked，它似乎不允许轻松访问包含回复信息的父元素。

抱歉。我正在查看这个问题。我所说的扩展阻止/静音用户是指将用户名添加到阻止词列表中。我的理论是，也许用户名在：

[quote=“asc, post:9, topic:256228”]

所以，例如，如果我添加了你的用户名“asc”，任何带有上述内容的回复帖子都会显示为隐藏。

只是为了确认，阻止的词是否不显示？只显示一个取消隐藏帖子的链接？或者是否可以覆盖监视词以不显示阻止的词？

如果是这样，这将更接近某些用户想要的更完整的阻止功能。
