在织梦CMS(DedeCMS)中调用浏览记录功能,可以帮助用户快速浏览近期访问过的内容,提升用户体验,这一功能通常结合Cookie或Session技术实现,记录用户浏览过的文章ID,并在前端页面动态展示,以下是详细的实现步骤和代码示例,涵盖从数据库设计到前端展示的全流程。

浏览记录功能的实现原理
浏览记录的核心逻辑是通过Cookie存储用户最近浏览的文章ID,然后在页面中读取这些ID,查询对应的文章信息并展示,具体步骤包括:
- 存储浏览记录:当用户访问文章详情页时,将文章ID存入Cookie(限制数量,如只保留最近10条)。
- 读取浏览记录:在需要展示浏览记录的页面(如首页、列表页),从Cookie中获取文章ID列表。
- 查询文章信息:根据文章ID列表查询数据库,获取标题、缩略图、发布时间等信息。
- 前端展示:将查询结果以列表或网格形式展示在页面中。
具体实现步骤
修改文章详情页(article_article.htm)
在文章详情页的模板文件中,添加以下PHP代码,用于将当前文章ID存入Cookie,建议在</head>标签前插入:
<?php
if(!empty($aid)){
$cookie_name = 'dede_view_history';
$cookie_value = isset($_COOKIE[$cookie_name]) ? explode(',', $_COOKIE[$cookie_name]) : array();
// 避免重复添加
if(($key = array_search($aid, $cookie_value)) !== false){
unset($cookie_value[$key]);
}
// 将当前文章ID添加到数组开头
array_unshift($cookie_value, $aid);
// 限制存储数量为10条
$cookie_value = array_slice($cookie_value, 0, 10);
// 将数组转换为字符串存入Cookie,有效期30天
setcookie($cookie_name, implode(',', $cookie_value), time() + 30*24*3600, '/');
}
?>
创建浏览记录调用标签
在织梦的后台“标签调用”中,可以自定义一个标签来获取浏览记录,以下是两种实现方式:
直接在模板中写PHP代码(适用于非静态化页面) 在需要展示浏览记录的位置插入以下代码:

<?php
$cookie_name = 'dede_view_history';
if(isset($_COOKIE[$cookie_name])){
$ids = trim($_COOKIE[$cookie_name], ',');
$dsql = new DedeSql(false);
$sql = "SELECT * FROM dede_archives WHERE id IN ($ids) ORDER BY FIELD(id, $ids) LIMIT 10";
$dsql->SetQuery($sql);
$dsql->Execute();
$list = '';
while($row = $dsql->GetArray()){
$list .= '<li><a href="/plus/view.php?aid='.$row['id'].'">'.$row['title'].'</a></li>';
}
echo $list;
}
?>
使用织梦的自定义标签(推荐)
- 在织梦后台“核心” → “标签调用管理”中,新建一个标签,命名为“浏览记录”。
- 标签代码如下:
{dede:php} $cookie_name = 'dede_view_history'; if(isset($_COOKIE[$cookie_name])){ $ids = trim($_COOKIE[$cookie_name], ','); $dsql = new DedeSql(false); $sql = "SELECT * FROM dede_archives WHERE id IN ($ids) ORDER BY FIELD(id, $ids) LIMIT 10"; $dsql->SetQuery($sql); $dsql->Execute(); $result = array(); while($row = $dsql->GetArray()){ $result[] = $row; } $GLOBALS['view_history'] = $result; {/dede:php} - 在模板中调用:
<ul> {dede:loop table='dede_archives' sort='id' row='10'} <li><a href="[field:arcurl/]">[field:title/]</a></li> {/dede:loop} </ul>
前端展示优化
为了提升用户体验,可以将浏览记录设计为更美观的样式,使用表格展示:
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>标题</th>
<th>发布时间</th>
</tr>
<?php
if(!empty($view_history)){
foreach($view_history as $row){
echo '<tr>';
echo '<td><a href="/plus/view.php?aid='.$row['id'].'">'.$row['title'].'</a></td>';
echo '<td>'.date('Y-m-d', $row['pubdate']).'</td>';
echo '</tr>';
}
}else{
echo '<tr><td colspan="2">暂无浏览记录</td></tr>';
}
?>
</table>
注意事项
- Cookie安全性:建议对Cookie中的ID进行加密处理,防止篡改。
- 性能优化:如果浏览记录数量较多,建议使用缓存技术减少数据库查询。
- 静态化页面:如果网站使用静态化,可能需要通过AJAX动态加载浏览记录,因为Cookie在静态页面中无法直接读取。
相关问答FAQs
问题1:为什么浏览记录中的文章顺序不正确?
解答:浏览记录的顺序依赖于ORDER BY FIELD(id, $ids)语句,确保文章ID按Cookie中的顺序排列,如果顺序错乱,可能是Cookie中的ID格式问题(如包含空格或非数字字符),需在使用前对$ids进行过滤,$ids = preg_replace('/[^0-9,]/', '', $_COOKIE[$cookie_name]);。
问题2:如何清除用户的浏览记录?
解答:可以通过设置Cookie过期时间来清除,在页面中添加以下代码:

<?php
setcookie('dede_view_history', '', time() - 3600, '/'); // 将过期时间设为过去时间
?>
或者通过JavaScript清除:
document.cookie = 'dede_view_history=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
