下面我将从基础到高级,详细讲解如何调用搜索关键词,并给出多种场景下的实例代码。

(图片来源网络,侵删)
核心标签:{dede:hotwords}
所有关于搜索关键词的调用,几乎都是围绕这个核心标签展开的,它的作用是从数据库的dede_search_keywords表中提取关键词数据。
基础用法:调用热门搜索词
这是最简单的用法,直接调用系统中最热门的搜索词。
标签结构:
{dede:hotwords num='10' subday='30' maxlength='20'}
<a href='/plus/search.php?keyword=[field:keyword/]'>[field:keyword/]</a>
{/dede:hotwords}
参数详解:
num='10':调用关键词的数量,这里设置为10,即显示10个热门搜索词。subday='30':统计的时间范围(单位:天),这里设置为30,即统计最近30天内用户的搜索次数,如果不设置,默认统计所有时间。- `maxlength='20':关键词显示的最大长度,如果某个关键词很长,超过这个长度就会被截断,防止破坏页面布局。
[field:keyword/]:这是关键词的底层字段,用于获取当前循环到的关键词文本。/plus/search.php?keyword=[field:keyword/]:这是DedeCMS内置的搜索结果页面的URL,将关键词作为参数传递过去。
完整示例(显示热门搜索词):
假设你想在网站页脚显示10个最近30天内的热门搜索词,每个词用逗号隔开。
<div class="hot-search">
<span>热门搜索:</span>
{dede:hotwords num='10' subday='30' maxlength='12'}
<a href='/plus/search.php?keyword=[field:keyword/]'>[field:keyword/]</a>
{/dede:hotwords}
</div>
进阶用法:调用相关搜索词
相关搜索词通常用在搜索结果页,根据用户当前搜索的关键词,推荐一些相关的其他搜索词,这需要用到keyword参数。

(图片来源网络,侵删)
标签结构:
{dede:hotwords num='8' keyword='织梦CMS' maxlength='15'}
<a href='/plus/search.php?keyword=[field:keyword/]'>[field:keyword/]</a>
{/dede:hotwords}
关键参数:
keyword='织梦CMS':这是实现“相关”搜索的核心,DedeCMS会分析“织梦CMS”这个词,然后从数据库中找出与它经常被一起搜索的关键词,这个值通常是动态获取的,而不是硬编码。
完整示例(在搜索结果页调用相关搜索):
打开 plus/search.php 文件,找到显示搜索结果的地方,加入以下代码。
// ... 搜索结果的PHP代码 ...
<div class="result-list">
<!-- 这里是正常的搜索结果循环输出 -->
</div>
<div class="related-search">
<h3>相关搜索:</h3>
{dede:hotwords num='8' keyword='[field:keyword/]' maxlength='15'}
<a href='/plus/search.php?keyword=[field:keyword/]'>[field:keyword/]</a>
{/dede:hotwords}
</div>
// ... 后续代码 ...
注意:这里的 [field:keyword/] 是DedeCMS的一个特殊变量,在search.php的模板环境中,它代表了用户本次搜索输入的关键词。
高级用法:自定义排序与样式
有时你可能需要更灵活的控制,比如按不同方式排序,或者为每个关键词添加不同的样式。
按搜索次数排序(默认)
默认情况下,{dede:hotwords} 就是按搜索次数(count字段)从高到低排序的。

(图片来源网络,侵删)
按最后搜索时间排序
如果你想显示最近被搜索过的词,可以修改标签,虽然官方标签不直接支持,但可以通过修改/include/taglib/hotwords.lib.php文件来实现,更简单的方法是直接在模板里用SQL查询。
使用自定义SQL调用(最灵活)
当默认标签无法满足需求时,可以直接使用{dede:sql}标签执行自定义SQL语句。
场景:调用最近7天内被搜索过的所有关键词(去重),并按搜索次数降序排列,只取前15个。
{dede:sql sql="
SELECT keyword, count
FROM dede_search_keywords
WHERE lasttime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 7 DAY))
ORDER BY count DESC
LIMIT 0, 15
"}
<a href='/plus/search.php?keyword=[field:keyword/]'>[field:keyword/]</a>
{/dede:sql}
SQL语句解释:
SELECT keyword, count:选择要显示的关键词文本和搜索次数。FROM dede_search_keywords:从关键词数据表查询。WHERE lasttime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 7 DAY)):筛选条件,只取最近7天内(lasttime字段是时间戳)有搜索记录的关键词。ORDER BY count DESC:按搜索次数降序排列。LIMIT 0, 15:从第0条开始,取15条记录。
为关键词添加随机样式
为了让热门搜索词更美观,可以给它们添加不同的颜色、字号等。
{dede:hotwords num='15' subday='30' maxlength='12'}
<a href='/plus/search.php?keyword=[field:keyword/]'>
<span style="color: {[field:global.autoindex runphp='yes'] @me = mt_rand(1,5); if(@me==1) @me='#ff0000'; elseif(@me==2) @me='#0066cc'; elseif(@me==3) @me='#9900ff'; elseif(@me==4) @me='#ff6600'; else @me='#009900';[/field:global.autoindex]};">
[field:keyword/]
</span>
</a>
{/dede:hotwords}
代码解释:
[field:global.autoindex/]:获取当前循环的序号(从1开始)。runphp='yes':允许在标签内执行PHP代码。mt_rand(1,5):生成一个1到5的随机数。- 通过
if-elseif-else判断,为不同的序号(这里是随机数)分配不同的颜色。
后台管理与注意事项
- 数据来源:所有搜索关键词都来自于用户在前台使用搜索框时,系统自动记录到
dede_search_keywords表中的,要求数据库的写入权限是正常的。 - 清理数据:如果搜索词太多,或者想清理掉一些无用的记录,可以登录DedeCMS后台。
- 路径:
[后台] -> [系统] -> [SQL命令行工具] - 在这里可以执行
DELETE FROM dede_search_keywords WHERE ...这样的SQL语句来清理数据。
- 路径:
- 无数据时显示:如果某个时间段内没有任何搜索,调用标签可能不会显示任何内容,你可以用
if条件判断来处理这种情况,但这需要更复杂的底层文件修改,在用户量大的网站上,这不是问题。
| 需求场景 | 推荐标签 | 示例代码 |
|---|---|---|
| 显示热门搜索词 | {dede:hotwords} |
{dede:hotwords num='10' subday='30'}<a>[field:keyword/]</a>{/dede:hotwords} |
| 显示相关搜索词 | {dede:hotwords} + keyword参数 |
{dede:hotwords num='8' keyword='[field:keyword/]'}<a>[field:keyword/]</a>{/dede:hotwords} |
| 自定义复杂逻辑 | {dede:sql} |
{dede:sql sql="SELECT ... FROM ..."}<a>[field:keyword/]</a>{/dede:sql} |
| 美化样式 | {dede:hotwords} + runphp |
结合PHP随机数生成颜色、字号等。 |
希望这份详细的指南能帮助你在DedeCMS项目中灵活地调用搜索关键词!
