- 手动代码实现:理解原理,灵活自定义。
- 使用现成插件:快速、方便,适合不想写代码的用户。
手动代码实现(核心原理)
这种方法的核心是利用PHP的 setcookie() 和 $_COOKIE 全局变量,以及织梦的 arc.archives.class.php 文件来获取文章信息。

(图片来源网络,侵删)
步骤 1:修改文章内容页模板 (article_article.htm)
这是记录用户阅读行为的关键位置,当用户打开一篇文章时,我们就需要将这篇文章的ID记录到Cookie中。
- 登录织梦后台,找到
默认模板风格->页模板(article_article.htm)。 - 在模板的末尾,
</body>标签之前,添加以下PHP代码:
{dede:php}
// 1. 获取当前文章的ID
$aid = $arc->ArcID;
// 2. 从Cookie中获取已读文章ID列表
// Cookie名称可以自定义,这里用 'dede_view_history'
// Cookie值存储的是一个逗号分隔的ID字符串,如 '1,5,12,88'
$view_history = isset($_COOKIE['dede_view_history']) ? $_COOKIE['dede_view_history'] : '';
// 3. 将当前文章ID添加到列表中
// a. 防止重复添加
// b. 将字符串转换成数组方便操作
$history_ids = $view_history ? explode(',', $view_history) : [];
if (!in_array($aid, $history_ids)) {
array_unshift($history_ids, $aid); // 将新ID添加到数组开头,这样最新的在最前面
}
// 4. 限制历史记录数量(例如只保留最近10篇)
// 防止Cookie过大
$max_history = 10;
if (count($history_ids) > $max_history) {
$history_ids = array_slice($history_ids, 0, $max_history);
}
// 5. 将数组重新转换成逗号分隔的字符串
$new_history_ids_str = implode(',', $history_ids);
// 6. 更新Cookie
// setcookie(名称, 值, 过期时间, 路径);
// time() + 3600 * 24 * 7 表示Cookie一周后过期
// '/' 表示在整个网站下都有效
setcookie('dede_view_history', $new_history_ids_str, time() + 3600 * 24 * 7, '/');
{/dede:php}
代码解释:
- 我们首先获取当前文章的ID (
$aid)。 - 然后从名为
dede_view_history的Cookie中读取之前的历史记录。 - 将新文章ID添加到列表的开头(这样显示时最新的在前),并限制列表长度为10条。
- 将更新后的ID列表写回Cookie,并设置一周的有效期。
步骤 2:创建一个用于显示历史记录的模板文件
我们需要一个独立的模板文件来展示历史文章列表。
- 在
默认模板风格目录下,新建一个文件,命名为view_history.htm。 - 在这个文件中,我们可以使用织梦的标签来循环显示文章。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">我的阅读历史</title>
<link rel="stylesheet" href="{dede:global.cfg_templets_skin/}/style/css.css" type="text/css" />
</head>
<body>
<div class="main">
<h2>我的阅读历史</h2>
{dede:php}
// 从Cookie中获取历史记录ID字符串
$history_ids_str = isset($_COOKIE['dede_view_history']) ? $_COOKIE['dede_view_history'] : '';
if ($history_ids_str) {
// 将字符串转换成数组,并过滤掉空值
$history_ids = array_filter(explode(',', $history_ids_str));
// 使用 implode 将数组转换成SQL查询的IN子句格式
$id_string = implode(',', $history_ids);
// 查询这些ID对应的文章
// 注意:这里假设你的文章表是 dede_archives,标题字段是 title
$query = "SELECT id, title, arcurl FROM `dede_archives` WHERE id IN ($id_string) ORDER BY FIELD(id, $id_string)";
$dsql->SetQuery($query);
$dsql->Execute();
$items = array();
while ($row = $dsql->GetArray()) {
$items[] = $row;
}
// 将查询结果赋值给一个变量,以便在模板中使用
// 注意:这里需要手动织梦化,因为模板引擎无法直接遍历PHP数组
// 我们将数据赋值给一个全局变量
global $viewHistoryList;
$viewHistoryList = $items;
} else {
global $viewHistoryList;
$viewHistoryList = array();
}
{/dede:php}
{if $viewHistoryList}
<ul class="history-list">
{dede:php}
foreach ($viewHistoryList as $item) {
// 为了在模板中显示,我们直接在这里输出
// 更优雅的方式是使用织梦的 {dede:arclist} 标签,但需要预先设置好缓存
echo '<li>';
echo '<a href="' . $item['arcurl'] . '" target="_blank">' . $item['title'] . '</a>';
echo '<span class="time">' . date('Y-m-d', time()) . '</span>'; // 这里可以添加实际的时间
echo '</li>';
}
{/dede:php}
</ul>
{else}
<p>您还没有阅读过任何文章。</p>
{/if}
</div>
</body>
</html>
注意:上面的 view_history.htm 模板中使用了原生PHP循环输出,虽然可行,但不够“织梦化”,更推荐的做法是利用 {dede:arclist} 标签,因为它自带分页、样式等。

(图片来源网络,侵删)
步骤 3:利用 {dede:arclist} 优化历史记录显示
我们可以将Cookie中的ID列表传递给 {dede:arclist} 标签来调用。
修改 view_history.htm 模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">我的阅读历史</title>
<link rel="stylesheet" href="{dede:global.cfg_templets_skin/}/style/css.css" type="text/css" />
</head>
<body>
<div class="main">
<h2>我的阅读历史</h2>
{dede:php}
$history_ids_str = isset($_COOKIE['dede_view_history']) ? $_COOKIE['dede_view_history'] : '';
if ($history_ids_str) {
// 将ID列表传递给模板变量
$GLOBALS['history_ids_for_arclist'] = $history_ids_str;
}
{/dede:php}
{if $history_ids_for_arclist}
{dede:arclist
titlelen='60'
row='10'
idlist='$history_ids_for_arclist'
orderby='custom'
orderway='desc'
}
<li>
<a href="[field:arcurl/]" target="_blank">[field:title/]</a>
<span class="time">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</li>
{/dede:arclist}
{else}
<p>您还没有阅读过任何文章。</p>
{/if}
</div>
</body>
</html>
{dede:arclist} 参数说明:
idlist='$history_ids_for_arclist':这是关键,它告诉arclist只显示ID列表中的文章。orderby='custom' orderway='desc':orderby='custom'可以保持idlist中指定的ID顺序。orderway='desc'让最新的(排在ID列表最前面的)显示在最上面。
步骤 4:创建一个页面来展示历史记录
我们需要一个页面来调用这个模板。

(图片来源网络,侵删)
- 在织梦后台,点击【核心】-> 【新增内容】-> 【普通文章】。
- 可以填写为“我的阅读历史”。
- 选择栏目:选择一个合适的栏目,用户中心”或新建一个“关于我们”之类的栏目。
- 留空。
- 最关键的一步:在右侧的“可选选项”中,找到 “自定义文件名”,填入你之前创建的模板文件名:
view_history.htm。 - 点击“确定”发布。
访问你刚刚创建的这篇文章的页面,就能看到你阅读过的文章列表了。
使用现成插件(推荐)
如果你不想手动编写代码,最简单的方法是使用织梦CMS的官方市场或第三方网站提供的插件。
- 搜索插件:在百度或搜索引擎中搜索“织梦CMS 阅读历史 插件”或“织梦CMS 浏览记录 插件”。
- 选择插件:你会找到很多免费的或付费的插件,选择一个评价高、下载量大的插件。
- 下载和安装:下载插件包,通常里面会有详细的安装说明文档,一般步骤是:
- 将插件文件上传到织梦程序的
plus目录或指定目录。 - 登录后台,进入【模块】-> 【上传新模块】或类似菜单,上传插件包。
- 根据文档进行启用和配置。
- 将插件文件上传到织梦程序的
- 调用模板标签:安装成功后,插件会提供模板标签,你只需要在需要显示历史记录的地方(比如头部模板
head.htm或用户中心模板)插入相应的标签即可,{dede:history/}。
优点:
- 快速便捷:几步操作即可完成。
- 功能稳定:成熟的插件通常经过测试,兼容性好。
- 功能丰富:有些插件可能还包含“猜你喜欢”、“热门推荐”等额外功能。
缺点:
- 不够灵活:样式和功能可能无法完全自定义。
- 安全性:来源不明的插件可能存在安全风险,请务必从可信渠道下载。
| 方法 | 优点 | 缺点 | 适用人群 |
|---|---|---|---|
| 手动代码 | 灵活可控,完全自定义,无插件依赖 | 需要一定的PHP和织梦知识,调试稍复杂 | 喜欢钻研、希望深度定制网站的开发者 |
| 使用插件 | 快速、简单、功能齐全 | 不够灵活,可能有安全风险 | 想要快速实现功能、不想写代码的普通站长 |
对于大多数用户来说,使用插件是更省时省力的选择,但如果希望深度了解织梦CMS或进行个性化开发,手动实现是一个非常好的学习过程。
