页,显示“上一篇”和“下一篇”是一个非常常见且重要的功能,它能有效引导用户浏览更多内容,降低网站的跳出率,提升用户体验和页面浏览量。

DedeCMS 提供了非常灵活的多种方式来实现这个功能,从最简单的模板标签到复杂的自定义SQL查询,可以满足各种需求。
使用官方默认的 GetNextArc 和 GetPreArc 标签(最常用)
这是最标准、最简单的方法,适用于绝大多数情况,它通过调用一个函数来获取当前文章的上一篇和下一篇信息。
标签语法
模板(通常是 article_article.htm)中,将以下代码插入到你希望显示上下篇的位置。
上一篇标签:

{dede:getpreart}
<a href='[field:arcurl/]'>[field:title/]</a>
{/dede:getpreart}
下一篇标签:
{dede:getnextart}
<a href='[field:arcurl/]'>[field:title/]</a>
{/dede:getnextart}
标签详解
{dede:getpreart}...{/dede:getpreart}:这是一个循环标签,用于获取上一篇,如果存在上一篇,它会循环输出其中的内容;如果不存在,则什么都不输出。{dede:getnextart}...{/dede:getnextart}:同理,用于获取下一篇。[field:arcurl/]:获取文章的链接地址。[field:title/]:获取文章的标题。
功能扩展和常用属性
这两个标签支持一些属性,可以让你更好地控制输出。
a. 控制字数(防止标题过长)
使用 len 属性来限制标题显示的字符数,超出部分用省略号 代替。

{dede:getpreart}
<a href='[field:arcurl/]' title="[field:title/]">[field:title function='cn_substr(@me, 30)'/]</a>
{/dede:getpreart}
{dede:getnextart}
<a href='[field:arcurl/]' title="[field:title/]">[field:title function='cn_substr(@me, 30)'/]</a>
{/dede:getnextart}
注意:这里使用了
function='cn_substr(@me, 30)'来截取字符串,这是 DedeCMS 的一个内置函数。@me代表当前字段的值。
b. 处理没有上下篇的情况
当没有上一篇或下一篇时,默认标签不会输出任何内容,我们可以通过添加默认文本来优化用户体验。
<!-- 上一篇 -->
{dede:getpreart}
<a href='[field:arcurl/]' title="[field:title/]">上一篇:[field:title function='cn_substr(@me, 30)'/]</a>
{else}
上一篇:没有了
{/dede:getpreart}
<!-- 下一篇 -->
{dede:getnextart}
<a href='[field:arcurl/]' title="[field:title/]">下一篇:[field:title function='cn_substr(@me, 30)'/]</a>
{else}
下一篇:没有了
{/dede:getnextart}
这里使用了 {else} 标签,当 getpreart 或 getnextart 没有获取到结果时,就会输出 else 后面的内容。
c. 指定栏目(仅获取同栏目下的上下篇)
默认情况下,上下篇是全站范围的,如果你只想在当前栏目内查找,可以添加 col 属性。
{dede:getpreart col='0'}
<a href='[field:arcurl/]' title="[field:title/]">上一篇:[field:title function='cn_substr(@me, 30)'/]</a>
{else}
上一篇:没有了
{/dede:getpreart}
{dede:getnextart col='0'}
<a href='[field:arcurl/]' title="[field:title/]">下一篇:[field:title function='cn_substr(@me, 30)'/]</a>
{else}
下一篇:没有了
{/dede:getnextart}
col='0':表示在当前文章所在栏目内查找。col='-1':表示在全站所有栏目(包括副栏目)内查找。col='栏目ID':表示在指定的栏目ID内查找。
使用 arclist 标签(更灵活,可自定义排序)
如果你觉得 这种方法的核心思路是:获取当前文章ID,然后用 在模板中,你需要先获取当前文章的ID,通常通过全局变量 上一篇(按ID降序,即ID比当前小的最新一篇): 下一篇(按ID升序,即ID比当前大的最新一篇): 如果你有非常特殊的需求,比如需要根据文章的某个自定义字段(如权重、专题ID等)来决定上下篇的顺序,那么直接写SQL是最好的选择。 DedeCMS 提供了 示例:获取上一篇(按自定义字段 示例:获取下一篇(按自定义字段 对于绝大多数用户,我强烈推荐使用【方法一】,它简单、高效、稳定,并且官方文档也推荐使用,只有在方法一无法满足你的特殊需求时,再去考虑方法二和方法三。GetNextArc 和 GetPreArc 的功能不够用,比如想按特定的排序方式(如按发布时间、点击量)来获取上下篇,可以使用 arclist
arcid 排除掉当前文章,再用 sort 或 orderway 指定排序方向,最后只取一条记录。获取当前文章ID
$arcid。{dede:getvar name='arcid'/}
使用
arclist 获取上一篇和下一篇{dede:arclist row='1' titlelen='30' sort='id' orderway='desc' arcid='$arcid'}
<a href='[field:arcurl/]' title="[field:title/]">上一篇:[field:title/]</a>
{/dede:arclist}
{dede:arclist row='1' titlelen='30' sort='id' orderway='asc' arcid='$arcid'}
<a href='[field:arcurl/]' title="[field:title/]">下一篇:[field:title/]</a>
{/dede:arclist}
arclist 关键属性解释
row='1':只获取一条记录,len='30'`:标题长度限制。sort='id':按文章ID排序,这是获取上下篇最关键的,因为DedeCMS默认新文章的ID更大。orderway='desc':排序方式,desc 为降序(从大到小),asc 为升序(从小到大)。arcid='$arcid':非常重要,这个属性会排除掉当前文章ID,确保不会获取到当前文章本身。
使用自定义SQL(最强大,适用于复杂逻辑)
获取当前文章ID和栏目ID
{dede:getvar name='arcid'/}
{dede:getvar name='typeid'/}
编写自定义SQL标签
{dede:sql} 标签来执行自定义SQL查询。weight降序,然后按ID升序){dede:sql sql='Select id,title From dede_archives where id < ~arcid~ and typeid=~typeid~ order by weight desc, id asc limit 1'}
<a href='/plus/view.php?aid=[field:id/]' title="[field:title/]">上一篇:[field:title function="cn_substr(@me,30)"/]</a>
{/dede:sql}
weight升序,然后按ID降序){dede:sql sql='Select id,title From dede_archives where id > ~arcid~ and typeid=~typeid~ order by weight asc, id desc limit 1'}
<a href='/plus/view.php?aid=[field:id/]' title="[field:title/]">下一篇:[field:title function="cn_substr(@me,30)"/]</a>
{/dede:sql}
SQL语句详解
Select id,title From dede_archives:从文章表 dede_archives 中查询ID和标题。where id < ~arcid~:查找ID小于当前文章ID的记录(上一篇)。~arcid~ 是DedeCMS模板中调用PHP变量的特殊写法。and typeid=~typeid~:限制在当前栏目内查找。order by weight desc, id asc:先按自定义的 weight 字段降序排列,weight 相同,再按ID升序排列,这是实现复杂排序的关键。limit 1:只取一条结果。/plus/view.php?aid=[field:id/]:手动拼接文章链接地址。
总结与推荐
方法
优点
缺点
适用场景
GetNextArc/GetPreArc官方推荐,最简单,性能好
功能相对固定,排序方式固定(按发布时间/ID)
99%的常规需求,快速实现上下篇功能。
arclist灵活,可以自定义排序字段(如按ID)
语法比方法一稍复杂,性能略低于方法一
需要按特定顺序(如ID)获取上下篇,且不满足默认排序时。
自定义SQL
功能最强大,完全可控
语法复杂,需要懂SQL,有一定风险(SQL注入)
有非常特殊的业务逻辑,需要根据自定义字段等复杂条件排序时。
