使用DedeCMS自带的关键词自动提取功能(基础方法)
这是最直接的方法,但需要确保你的模板和系统设置正确。

(图片来源网络,侵删)
操作步骤:
-
后台设置:
- 登录DedeCMS后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “关键字替换次数” 这个选项,将其设置为 1 或 2(0表示不替换,1表示替换一次,建议设置为1)。
- 保存设置。
-
发布文章时勾选:
- 在后台发布或编辑文章时,你会看到关键词输入框。
- 在关键词输入框的下方,有一个 “自动获取关键词” 的复选框。
- 勾选这个复选框,然后点击“确定”或“保存”。
- 系统会自动从文章内容中提取出现频率较高的词语,并填充到关键词输入框中。
优点:
- 无需修改任何文件,官方自带功能。
- 操作简单,一键获取。
缺点:

(图片来源网络,侵删)
- 提取效果一般,可能不够精准。
- 需要每次发布文章时手动勾选。
- 可能会提取出一些无意义的常用词(如“的”、“是”、“在”等,DedeCMS有内置词库过滤,但不一定完美)。
修改 arc.archives.class.php 文件(优化自动提取)
这个方法的核心是修改DedeCMS处理文章数据的底层类文件,让它在文章保存时自动提取关键词,无需手动勾选,并且可以优化提取算法。
操作步骤:
-
找到并打开文件:
- 使用FTP或文件管理器,登录你的网站服务器。
- 找到并打开以下文件:
/include/arc.archives.class.php
-
定位关键代码:
- 在文件中搜索
this->Keywords = '';这行代码,它通常在SaveToDb()函数附近,用于处理文章的附加数据(包括关键词)。 - 你会找到类似这样的代码块:
// 关键词处理 if(empty($this->Keywords)) { $this->GetKeywords($this->body); } $this->Keywords = preg_replace('/[,,\s]+/', ',', trim($this->Keywords)); $this->Keywords = addslashes($this->Keywords); - 在文件中搜索
-
优化代码(可选但推荐):
(图片来源网络,侵删)- 默认的
GetKeywords函数提取效果可能不好,我们可以替换或增强它,一个更优化的方法是使用CutStr函数来截取,并结合正则表达式过滤掉无意义的词。 - 将上面那段代码替换为以下优化后的代码:
// 关键词处理 - 自动获取 if(empty($this->Keywords)) { // 从内容中提取关键词 $this->GetKeywords($this->body); // 如果提取的关键词为空,或者数量太少,则使用一个更可靠的方法 if(empty($this->Keywords) || count(explode(',', $this->Keywords)) < 3) { // 使用CutStr函数截取内容的前200个字符作为备选关键词源 $auto_keywords = trim($this->GetKeywords($this->GetLitpic() . $this->body)); // 如果还是为空,则用标题代替 if(empty($auto_keywords)){ $auto_keywords = $this->Title; } $this->Keywords = $auto_keywords; } } // 清理和格式化关键词 // 1. 替换常见的分隔符为英文逗号 $this->Keywords = preg_replace('/[,,\s]+/', ',', $this->Keywords); // 2. 移除开头和结尾的逗号 $this->Keywords = trim($this->Keywords, ','); // 3. 移除重复的关键词(确保每个关键词只出现一次) $keyword_array = array_unique(explode(',', $this->Keywords)); $this->Keywords = implode(',', $keyword_array); // 4. 转义特殊字符,防止SQL注入 $this->Keywords = addslashes($this->Keywords);代码解释:
if(empty($this->Keywords)): 只有当关键词为空时才自动获取,避免覆盖手动输入的关键词。count(explode(',', $this->Keywords)) < 3: 增加一个判断,如果自动获取的关键词太少(少于3个),则触发备用方案,从标题和内容中重新提取,确保关键词数量。preg_replace和array_unique: 用来清理和去重,使关键词格式更规范。addslashes: 增加安全性,防止SQL注入。
- 默认的
-
保存文件并测试:
- 保存修改后的
arc.archives.class.php文件。 - 重新发布一篇文章,不要在后台填写任何关键词,保存后你会发现关键词字段已经被自动填充了。
- 保存修改后的
优点:
- 全自动:发布文章时无需任何额外操作。
- 更智能:通过优化代码,提取的关键词质量和数量都有提升。
- 保留手动输入:如果手动填写了关键词,系统不会覆盖它。
缺点:
- 需要修改核心文件,升级DedeCMS时可能会被覆盖,需要重新修改。
- 对技术有一定要求,操作不当可能导致网站出错。
使用DedeCMS标签在首页/列表页自动显示关键词(前端应用)
我们需要的不是后台自动填充,而是在前台的页面(如文章详情页、列表页)自动将文章中的关键词高亮或提取出来展示给用户,这可以通过DedeCMS的标签结合自定义函数实现。
示例:在文章详情页自动提取并显示相关关键词
-
在
templets/default/article_article.htm(你的文章详情模板)中,找到合适的位置添加以下代码:<div class="keywords"> <strong>本文标签:</strong> {dede:field name='keywords' runphp='yes'} if(@me != ''){ $keywords = explode(',', @me); $result = ''; foreach($keywords as $keyword){ // 这里可以给每个关键词加链接,比如链接到搜索结果页 $result .= "<a href='/search.php?kw=".urlencode($keyword)."' target='_blank'>".$keyword."</a> "; } @me = $result; }else{ // 如果没有关键词,则尝试自动提取并显示(但不保存到数据库) @me = '暂无标签'; } {/dede:field} </div> -
更高级的自动提取(前端不保存): 如果你想在页面上展示一个自动提取的、但不保存到数据库的关键词列表,你需要一个自定义函数。
-
在
/include/extend.func.php文件中添加以下函数:// 自动从内容中提取关键词并格式化(不保存到数据库) function GetAutoKeywords($body, $len = 500) { // 1. 过滤HTML标签 $body = stripslashes($body); $body = preg_replace('/[<>]/', ' ', $body); // 2. 移除无意义的常用词,你可以根据需要扩展这个数组 $filter_words = array('的', '了', '和', '是', '在', '我', '有', '为', '不', '人', '都', '一', '个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'); $body = str_replace($filter_words, ' ', $body); // 3. 按空格分割成词组 $words = preg_split('/\s+/', $body); // 4. 统计词频 $word_count = array(); foreach ($words as $word) { if (mb_strlen($word, 'UTF-8') > 1 && !is_numeric($word)) { // 只统计长度大于1的词 $word_count[$word] = isset($word_count[$word]) ? $word_count[$word] + 1 : 1; } } // 5. 按词频排序,并取前N个 arsort($word_count); $top_keywords = array_slice(array_keys($word_count), 0, 10); // 取前10个关键词 return implode(',', $top_keywords); } -
在模板中调用这个函数:
<div class="auto-keywords"> <strong>自动提取标签:</strong> {dede:field name='body' runphp='yes'} $body = @me; require_once(DEDEINC.'/dedecollection.class.php'); // 可能需要引入某些类 @me = GetAutoKeywords($body); if(@me){ $keywords = explode(',', @me); $result = ''; foreach($keywords as $keyword){ $result .= "<a href='/search.php?kw=".urlencode($keyword)."' target='_blank'>".$keyword."</a> "; } @me = $result; }else{ @me = '暂无标签'; } {/dede:field} </div>
-
优点:
- 灵活性极高,可以完全自定义关键词的展示方式。
- 不影响数据库,纯粹用于前端展示。
缺点:
- 实现相对复杂,需要懂PHP和DedeCMS标签。
- 每次页面加载都会执行计算,如果文章内容很长,可能会对页面加载速度有轻微影响。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 后台勾选 | 简单、官方、无需修改文件 | 需手动操作,提取效果一般 | 临时使用、新手用户、少量文章 |
| 修改核心文件 | 全自动、效果优化、一劳永逸 | 修改核心文件,升级可能覆盖 | 强烈推荐,适合大多数网站,追求效率和SEO |
| 前端标签 | 灵活、不影响数据库、展示效果好 | 实现复杂,可能影响性能 | 需要在页面上特殊展示关键词,如标签云、相关推荐 |
给你的建议:
- 首选方法二:这是最实用、最一劳永逸的解决方案,按照“方法二”的步骤修改
arc.archives.class.php文件,可以让你在发布文章时彻底告别手动输入关键词的烦恼。 - 辅助方法三:如果想在文章页面上给用户展示更美观的标签,可以结合“方法三”来实现前端展示,但请注意,这和方法二不冲突,方法二是为了SEO和后台管理,方法三是为了前端用户体验。
- 谨慎使用方法一:除非你只是偶尔发几篇文章,否则不推荐依赖手动勾选。
希望这份详细的指南能帮助你成功实现DedeCMS的自动获取关键词功能!
