“上一篇/下一篇”的核心逻辑是:根据当前文章的发布时间,找到时间上紧邻的前一篇文章和后一篇文章。

织梦CMS已经内置了非常方便的标签来实现这个功能,我们只需要在文章内容页模板(通常是 article_article.htm)中正确调用即可。
使用默认的织梦标签(最简单、最常用)
织梦提供了两个专门的标签:{dede:prenext get='pre'} 和 {dede:prenext get='next'}。
基本用法
将这两个标签直接放在文章内容页模板(/templets/default/article_article.htm)的合适位置,比如文章内容的上方或下方。
示例代码:

<div class="article-content">
{dede:field.body/}
</div>
<div class="prenext">
<div class="pre">
{dede:prenext get='pre'/}
</div>
<div class="next">
{dede:prenext get='next'/}
</div>
</div>
效果:
{dede:prenext get='pre'}会输出类似上一篇:<a href="/article/123.html">这是上一篇文章的标题</a>{dede:prenext get='next'}会输出类似下一篇:<a href="/article/125.html">这是下一篇文章的标题</a>
高级用法(自定义样式和文本)
默认的标签虽然方便,但样式比较单一,我们可以使用更灵活的 {dede:sql} 或 {dede:arclist} 标签来完全自定义上一篇/下一篇的显示效果,包括链接、标题、甚至摘要和缩略图。
推荐使用 {dede:arclist} 标签,因为它更安全、更高效。
示例代码(自定义样式):

<div class="prenext clearfix">
<!-- 上一篇 -->
<div class="pre-article">
<span>上一篇:</span>
{dede:arclist row=1 titlelen=40 orderby=pubdate idlist=''}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
</div>
<!-- 下一篇 -->
<div class="next-article">
<span>下一篇:</span>
{dede:arclist row=1 titlelen=40 orderby=pubdate idlist='' sort='desc'}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
</div>
</div>
代码解析:
{dede:arclist}:调用文章列表标签。row=1:只获取一篇文章。titlelen=40长度限制,防止标题过长影响布局。orderby=pubdate:这是关键! 按发布时间排序,从而实现“上一篇/下一篇”的逻辑。idlist='':这里留空,因为我们希望它根据当前文章动态查找相邻的。sort='desc':对于“下一篇”,我们需要按时间倒序排列,才能找到时间上排在后面的文章,上一篇则不需要这个属性(默认是升序)。
补充说明:
在 article_article.htm 模板中,织梦会自动将当前文章的ID传递给环境变量。{dede:arclist} 在这个环境下,idlist 为空时,其行为就是查找与当前文章相关的文章,所以上面的代码是可行的。
使用 {dede:sql} 标签(不推荐,但了解无妨)
你也可以直接用SQL语句来查询,这种方法更直接,但安全性稍差,且不如arclist标签灵活。
示例代码:
<!-- 上一篇 -->
{dede:sql sql="SELECT * FROM `dede_archives` WHERE `pubdate` < (SELECT pubdate FROM `dede_archives` WHERE id=~id~) ORDER BY `pubdate` DESC LIMIT 1"}
<a href="/article/[field:id/].html">[field:title/]</a>
{/dede:sql}
<!-- 下一篇 -->
{dede:sql sql="SELECT * FROM `dede_archives` WHERE `pubdate` > (SELECT pubdate FROM `dede_archives` WHERE id=~id~) ORDER BY `pubdate` ASC LIMIT 1"}
<a href="/article/[field:id/].html">[field:title/]</a>
{/dede:sql}
代码解析:
~id~是织梦模板中的特殊变量,代表当前文章的ID。- 上一篇的SQL逻辑是:查找
pubdate(发布时间)小于当前文章,并且按pubdate降序排列(即时间最大的那一个)的第一条记录。 - 下一篇的SQL逻辑相反:查找
pubdate大于当前文章,并且按pubdate升序排列的第一条记录。
为什么不推荐?
- 性能:每次请求都会执行一次数据库查询,而
arclist有更好的缓存机制。 - 安全性:直接写SQL有潜在注入风险,虽然织梦对
~id~做了处理,但不如官方标签安全。 - 灵活性:无法方便地调用文章摘要、缩略图等其他字段。
总结与最佳实践
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
{dede:prenext} |
最简单,代码最少 | 样式固定,自定义能力差 | ⭐⭐⭐⭐ (对于快速搭建) |
{dede:arclist} |
灵活,安全,性能好,可自定义标题长度、样式,甚至扩展摘要和缩略图 | 代码稍长一点 | ⭐⭐⭐⭐⭐ (强烈推荐) |
{dede:sql} |
逻辑直接,功能强大 | 性能稍差,有安全风险,不灵活 | ⭐ (仅作为了解) |
最终建议:
对于绝大多数网站,直接使用 方法一中的高级用法({dede:arclist}) 是最佳选择,它在保持代码简洁的同时,提供了足够的自定义空间,并且是官方推荐的安全高效的方式。
你可以根据自己网站的设计,给 .pre-article 和 .next-article 添加CSS样式,使其与网站整体风格融为一体。
.prenext {
margin: 20px 0;
padding: 15px;
border-top: 1px solid #eee;
border-bottom: 1px solid #eee;
}
.prenext .pre-article,
.prenext .next-article {
margin: 10px 0;
}
.prenext a {
color: #333;
text-decoration: none;
}
.prenext a:hover {
color: #0066cc;
text-decoration: underline;
}
