HotSearch 是一款 Typecho 热门搜索插件,自动记录访客搜索的关键词,按热度排序,支持通过后台模板占位符完全自定义前端展示样式。
- 自动记录:访客使用 Typecho 原生搜索时自动记录关键词与次数
- 模板占位符:后台支持自定义 HTML 模板,通过占位符注入数据
- 数据安全:默认禁用插件时保留数据表,可选开启删除
- 兼容伪静态:自动适配普通模式与伪静态模式的搜索链接
在 Typecho 安装目录下找到 usr/plugins/,新建文件夹:
usr/
└── plugins/
└── HotSearch/
└── Plugin.php
将插件代码保存为 Plugin.php 放入该文件夹。
登录 Typecho 后台:
控制台 → 插件 → 找到「热门搜索」→ 点击 启用
首次启用会自动创建数据表 {prefix}_search_log。
点击插件名称进入 设置页面,根据需求调整参数。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 前台显示数量 | 数字 | 10 |
前台展示多少个热门搜索词 |
| 自动记录搜索 | 单选 | 开启 |
关闭后不再自动记录,需手动调用 HotSearch_Plugin::log() |
| 禁用插件时删除数据表 | 单选 | 否 |
开启后禁用插件将 永久删除 所有搜索记录 |
| 外层容器模板 | 文本域 | <ul class="hot-search-list">{items}</ul> |
列表外层 HTML,使用 {items} 注入渲染后的列表项 |
| 单项模板 | 文本域 | <li><a href="{url}" title="{keyword}">{keyword}<span class="hot-search-count">({count})</span></a></li> |
单个搜索词的 HTML 结构 |
| 空数据模板 | 文本域 | <p class="hot-search-empty">暂无热门搜索</p> |
没有任何记录时的提示内容 |
| 占位符 | 说明 |
|---|---|
{items} |
将被替换为所有渲染后的单项 HTML |
| 占位符 | 说明 | 示例输出 |
|---|---|---|
{keyword} |
搜索关键词(已转义) | Typecho |
{count} |
被搜索的次数 | 42 |
{url} |
该关键词的搜索链接 | https://example.com/search/Typecho/ |
{index} |
当前序号(从 1 开始) | 1 |
无占位符,直接填写纯静态 HTML 即可。若留空,无记录时不输出任何内容。
将以下代码放入主题模板(如 sidebar.php、footer.php):
<?php if (class_exists('HotSearch_Plugin')): ?>
<div class="widget hot-search-widget">
<h3 class="widget-title">热门搜索</h3>
<?php HotSearch_Plugin::render(); ?>
</div>
<?php endif; ?>如需完全自定义 PHP 逻辑:
<?php
if (class_exists('HotSearch_Plugin')) {
$list = HotSearch_Plugin::getHotSearch(10);
if (!empty($list)) {
foreach ($list as $index => $item) {
$url = Typecho_Router::url(
'search',
array('keywords' => urlencode($item['keyword'])),
Helper::options()->index
);
echo '<a href="' . $url . '">' . htmlspecialchars($item['keyword']) . '</a>';
}
}
}
?>外层容器模板:
<ul class="hot-search-list">{items}</ul>单项模板:
<li>
<a href="{url}" title="{keyword}">
{keyword}
<span class="hot-search-count">({count})</span>
</a>
</li>外层容器模板:
<ol class="hot-search-rank">{items}</ol>单项模板:
<li>
<span class="rank-num">{index}</span>
<a href="{url}">{keyword}</a>
<span class="hot-count">{count} 次</span>
</li>外层容器模板:
<div class="hot-search-cloud">{items}</div>单项模板:
<a href="{url}" class="hot-tag">{keyword}</a>外层容器模板:
<div class="hot-search-grid">{items}</div>单项模板:
<div class="hot-card">
<a href="{url}">
<strong>{keyword}</strong>
<small>热度 {count}</small>
</a>
</div>如果你的主题使用了 AJAX 搜索 或其他非标准搜索方式,导致自动记录失效,可在搜索处理处手动调用:
HotSearch_Plugin::log($keyword);或在传统搜索模板 search.php 顶部加一道保险:
<?php
if (class_exists('HotSearch_Plugin') && !empty($_GET['s'])) {
HotSearch_Plugin::log($_GET['s']);
}
?>- 确认插件已启用且「自动记录搜索」为开启状态
- 确认使用的是 Typecho 原生搜索(非前端 AJAX)
- 尝试禁用后重新启用插件
- 检查数据库中
{prefix}_search_log表是否存在
表名为 search_log,前缀与你的 Typecho 数据库前缀一致。例如前缀为 typecho_,则表名为 typecho_search_log。
默认 保留。如需删除,在插件设置中开启「禁用插件时删除数据表」后再禁用。
进入数据库管理工具(如 phpMyAdmin),执行:
TRUNCATE TABLE `typecho_search_log`;或删除该表后重新启用插件。
count 字段类型为 int(10) unsigned,上限约 42 亿次,正常使用无需担心。
- 性能:数据量小时无需优化;若搜索量极大,建议给
count+lastsearch加联合索引,或定期归档旧数据。 - 缓存:热门搜索列表目前实时查询,若访问量高,建议在主题层面做文件缓存。
- 安全:插件已对所有关键词输出做
htmlspecialchars()转义,防止 XSS。