现有表情标签在编辑器中显示为新标签;发布后新表情标签消失

我发现主题编辑器中表情符号标签的行为不一致,并在未修改的 main 分支(提交哈希:802125b979b5bb848a7cfc52409ef3176ffd4d82)上复现了该问题。

对于已存在的表情符号标签,输入其名称时可能会显示创建选项,而不是显示现有标签及其使用次数。选择该选项并发布后,系统仍会关联现有的标签。真正的新表情符号标签属于另一种情况:可以在编辑器中选择,但发布后会消失。

要复现已有标签的问题:

  1. 使用一个包含现有表情符号标签(例如 😊)以及其他更常用标签的网站。
  2. 打开主题编辑器并输入表情符号标签的名称。
  3. 如果该标签不在返回的热门标签限制范围内,下拉菜单将显示创建选项和不相关的热门标签,而不显示现有标签的使用次数。
  4. 选择创建选项,发布并刷新页面。该主题仍然使用原始的标签记录。

在独立的浏览器测试中,我使用了一个计数为 17 的现有表情符号标签、一个计数为 100 的不相关标签,以及搜索限制设为 1。下拉菜单显示了 Create: '😊' 和 popular x100;发布后,现有的表情符号标签被正确重用。在没有现有 😊 记录的情况下,相同操作返回 HTTP 200,但未保存任何标签。

问题出在 DiscourseTagging.clean_tag 方法中,该方法同时用于搜索术语和处理新名称的保存。它会移除表情符号字符。随后搜索回退到热门结果,而在保存时,清理新名称之前仍可能通过原始名称找到现有标签。

我有一个小的补丁,可以保留由现有 Emoji.unicode_replacements 数据识别的完整表情符号字素。它保留了现有的 ASCII 过滤功能,并移除非表情符号文本中的无效字符。它还允许禁用的标签建议匹配名称的开头,因为当前的单词边界表达式会遗漏以表情符号开头的名称,例如 😊-restricted。

该补丁修改了两个实现文件,并在三个测试文件中添加了回归测试覆盖。它没有添加数据库迁移、前端更改、新的 API 或另一个表情符号缓存。

本地验证:572 个相关的后端示例和 8 个浏览器示例通过。浏览器测试检查了现有表情符号标签是否显示 x17,以及它在发布和刷新后是否与真正的新 😊 标签一起保留。

更新 — 2026 年 10 月 23 日

修复现已作为 PR #44994: FIX: Preserve emoji tags during search and saving 提交,并准备接受审查。

我 fork 上的完整 CI 已通过:所有 10 个测试矩阵任务、代码风格检查 和 许可证检查。

对于此次运行,我使用了一个包含相同修复的独立验证分支,并将测试任务的超时时间从 20/30 分钟增加到 90 分钟,因为之前的运行在 fork runner 上超时。测试命令、矩阵和断言均未改变。超时调整不属于上游 PR 的一部分。该 PR 尚未合并;上游 CI 仍在等待维护者批准。

补丁分支:

相关报告和讨论:

这些报告描述了早期的表情符号标签限制。此补丁解决了上述复现的编辑器搜索和保存故障;它并不声称能解决所有表情符号标签问题。