- 数据查询层面:获取文章列表的SQL语句没有包含未审核的文章。
- 标签调用层面:生成标签云或相关标签的标签调用代码,没有考虑到未审核文章的状态。
下面我将从这两个层面,为您提供详细的排查和解决方案。

问题根源分析
要解决这个问题,我们首先要明白DedeCMS的工作流程:
- 文章列表:你在后台看到文章列表,或者在首页、栏目页调用文章列表时,通常是通过
GetArcList等函数实现的,这些函数默认的查询条件是arcrank >= 0,即只显示已审核(arcrank=0)和推荐(arcrank=-1)等特殊状态的文章,而忽略了arcrank=1(待审核)的文章。 - 标签生成:当你在文章内容页调用
{dede:tag}标签时,系统会根据当前文章的ID,去dede_taglist表中查找关联的标签,而dede_taglist表中的数据,是在文章发布时,由系统自动生成的,如果文章从未被“发布”过(即一直是未审核状态),它就不会触发这个生成过程,自然也就没有记录在dede_taglist表里。
解决问题的关键在于:确保在需要显示未审核文章的页面,查询语句能包含它们;并且确保这些未审核文章在发布时能正确生成标签记录。
解决方案
请根据你的具体需求,选择对应的解决方案。
让未审核文章的Tag在页显示
这是最常见的需求,比如在后台“预览”未审核文章时,希望看到它应有的标签。

原因:调用文章内容的SQL语句 (GetArticleContent) 默认也只查 arcrank >= 0 的文章。
解决方法:
找到并修改 /include arc.archives.class.php 文件,这是处理文章内容的核心文件。
- 用代码编辑器打开
/include/arc.archives.class.php。 - 找到
SelectOneArchive()函数(通常在文件的开头部分)。 - 在该函数的SQL查询语句中,找到
WHERE子句,将AND arc.arcrank >= 0这部分删除或注释掉。
修改前(大概在第50行左右):

$this->Fields = $this->dsql->GetOne("SELECT * FROM `dede_archives` WHERE id='$aid' AND arcrank >= 0 ");
修改后:
// 去掉 arcrank >= 0 的限制,以获取所有状态的文章
$this->Fields = $this->dsql->GetOne("SELECT * FROM `dede_archives` WHERE id='$aid' ");
修改完成后,保存文件即可。
注意:这个修改会影响全站所有调用文章内容的地方,意味着所有未审核的文章(即使不在前台显示)都可以被程序读取到,这通常是我们预览文章时希望看到的。
让未审核文章的Tag在标签云或相关文章中显示
原因:生成标签云或相关文章的函数(如 GetTags)在查询时,默认也是关联已审核的文章。
解决方法:
找到并修改 /include/taglib/tag.lib.php 文件,这是处理标签相关的核心文件。
- 用代码编辑器打开
/include/taglib/tag.lib.php。 - 找到
lib_tag()函数。 - 在该函数的SQL查询语句中,找到
WHERE子句,将AND arc.arcrank >= 0这部分删除或注释掉。
修改前(通常在函数内):
$query = "SELECT tagid,tagname FROM `dede_taglist` WHERE arcrank >= 0 GROUP BY tagid ORDER BY count DESC";
修改后:
// 去掉 arcrank >= 0 的限制,以获取所有文章的标签 $query = "SELECT tagid,tagname FROM `dede_taglist` GROUP BY tagid ORDER BY count DESC";
修改完成后,保存文件即可。
手动为已存在的未审核文章补充Tag标签
如果你的未审核文章已经存在,但没有生成标签记录,你需要手动补充。
后台单个操作(推荐)
- 在后台找到那篇未审核的文章。
- 点击“修改”进入编辑页面。
- 在文章编辑页面的“TAG标签”输入框中,重新输入一遍你想要的标签(即使之前有,也再输一遍)。
- 不要直接点“保存”,而是点击“更新文档”按钮(这个按钮会重新生成文档,包括标签)。
- 操作完成后,这篇文章的标签就会被写入
dede_taglist表。
数据库批量操作(谨慎使用)
如果未审核文章很多,可以批量操作数据库。
- 进入你的数据库管理工具(如phpMyAdmin)。
- 找到
dede_archives和dede_taglist两个表。 - 假设你已经知道哪些文章需要补充标签,可以先在
dede_archives表中找出它们的ID,SELECT id, title FROM dede_archives WHERE arcrank = 1;
- 你需要一个能根据文章ID生成标签的脚本,这比较复杂,不如使用方法一的“更新文档”功能来得直接和稳妥。强烈推荐使用方法一。
总结与最佳实践
| 场景 | 问题文件 | 修改方法 | 效果 |
|---|---|---|---|
| 页不显示未审核文章的Tag | /include/arc.archives.class.php |
删除 SelectOneArchive() 函数中 arcrank >= 0 的条件。 |
页(如预览)读取到未审核文章的标签。 |
| 标签云/相关文章不显示未审核文章的Tag | /include/taglib/tag.lib.php |
删除 lib_tag() 函数中 arcrank >= 0 的条件。 |
标签云和相关文章会包含来自未审核文章的标签。 |
| 为已有未审核文章补充Tag | 后台文章编辑页 | 进入编辑页,重新输入Tag,点击“更新文档”。 | 为单篇文章补充或修复缺失的标签记录。 |
重要提示:
在进行任何文件修改前,请务必备份这些文件,以防修改出错导致网站异常,修改后,建议清除一下DedeCMS的缓存(后台-系统-SQL命令运行器,执行 DEL FROM dede_arccache),以确保更改生效。
通过以上步骤,你应该可以解决“DedeCMS未审核文章的tag标签不显示”的问题。
