织梦CMS如何记录和展示用户阅读过的文章?

99ANYc3cd6
预计阅读时长 27 分钟
位置: 首页 织梦建站 正文
  1. 手动代码实现:理解原理,灵活自定义。
  2. 使用现成插件:快速、方便,适合不想写代码的用户。

手动代码实现(核心原理)

这种方法的核心是利用PHP的 setcookie()$_COOKIE 全局变量,以及织梦的 arc.archives.class.php 文件来获取文章信息。

织梦cms阅读过的文章
(图片来源网络,侵删)

步骤 1:修改文章内容页模板 (article_article.htm)

这是记录用户阅读行为的关键位置,当用户打开一篇文章时,我们就需要将这篇文章的ID记录到Cookie中。

  1. 登录织梦后台,找到 默认模板风格 -> 页模板 (article_article.htm)。
  2. 在模板的末尾,</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:创建一个用于显示历史记录的模板文件

我们需要一个独立的模板文件来展示历史文章列表。

  1. 默认模板风格 目录下,新建一个文件,命名为 view_history.htm
  2. 在这个文件中,我们可以使用织梦的标签来循环显示文章。
<!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} 标签,因为它自带分页、样式等。

织梦cms阅读过的文章
(图片来源网络,侵删)

步骤 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:创建一个页面来展示历史记录

我们需要一个页面来调用这个模板。

织梦cms阅读过的文章
(图片来源网络,侵删)
  1. 在织梦后台,点击【核心】-> 【新增内容】-> 【普通文章】。
  2. 可以填写为“我的阅读历史”。
  3. 选择栏目:选择一个合适的栏目,用户中心”或新建一个“关于我们”之类的栏目。
  4. 留空。
  5. 最关键的一步:在右侧的“可选选项”中,找到 “自定义文件名”,填入你之前创建的模板文件名:view_history.htm
  6. 点击“确定”发布。

访问你刚刚创建的这篇文章的页面,就能看到你阅读过的文章列表了。


使用现成插件(推荐)

如果你不想手动编写代码,最简单的方法是使用织梦CMS的官方市场或第三方网站提供的插件。

  1. 搜索插件:在百度或搜索引擎中搜索“织梦CMS 阅读历史 插件”或“织梦CMS 浏览记录 插件”。
  2. 选择插件:你会找到很多免费的或付费的插件,选择一个评价高、下载量大的插件。
  3. 下载和安装:下载插件包,通常里面会有详细的安装说明文档,一般步骤是:
    • 将插件文件上传到织梦程序的 plus 目录或指定目录。
    • 登录后台,进入【模块】-> 【上传新模块】或类似菜单,上传插件包。
    • 根据文档进行启用和配置。
  4. 调用模板标签:安装成功后,插件会提供模板标签,你只需要在需要显示历史记录的地方(比如头部模板 head.htm 或用户中心模板)插入相应的标签即可,{dede:history/}

优点

  • 快速便捷:几步操作即可完成。
  • 功能稳定:成熟的插件通常经过测试,兼容性好。
  • 功能丰富:有些插件可能还包含“猜你喜欢”、“热门推荐”等额外功能。

缺点

  • 不够灵活:样式和功能可能无法完全自定义。
  • 安全性:来源不明的插件可能存在安全风险,请务必从可信渠道下载。
方法 优点 缺点 适用人群
手动代码 灵活可控,完全自定义,无插件依赖 需要一定的PHP和织梦知识,调试稍复杂 喜欢钻研、希望深度定制网站的开发者
使用插件 快速、简单、功能齐全 不够灵活,可能有安全风险 想要快速实现功能、不想写代码的普通站长

对于大多数用户来说,使用插件是更省时省力的选择,但如果希望深度了解织梦CMS或进行个性化开发,手动实现是一个非常好的学习过程。

-- 展开阅读全文 --
头像
C语言中string究竟指什么?
« 上一篇 01-21
织梦2025漏洞关键词有哪些?
下一篇 » 01-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]