下面我将从基础用法到自定义样式,再到常见问题,为你详细讲解。

基础用法(最常用)
页模板(通常是 article_article.htm)中,找到你希望显示上一篇/下一篇的位置,直接插入以下标签:
{dede:prenext get='pre'/}
{dede:prenext get='next'/}
解释:
{dede:prenext}: 这是织梦的核心标签,用于获取当前文章的上一篇和下一篇。get='pre': 表示获取上一篇文章。get='next': 表示获取下一篇文章。
织梦会自动解析并替换成类似这样的HTML代码:
上一篇的输出示例:
<a href='/a/2025/12345.html'>这是上一篇的文章标题</a>

下一篇的输出示例:
<a href='/a/2025/12347.html'>这是下一篇的文章标题</a>
自定义样式与布局
默认的 {dede:prenext} 标签输出比较简单,通常我们希望对其进行美化,或者将上一篇和下一篇放在同一个容器中,进行更灵活的布局。
获取单独的标题和链接
有时候你可能不想要 <a> 标签,而是想分别获取标题和链接地址,这时可以使用 function='getto' 属性。
获取上一篇的链接和标题:

{dede:prenext get='pre' function='getto(@me)'/}
这会输出一个数组格式的字符串,
"Array ( [title] => 这是上一篇的文章标题 [url] => /a/2025/12345.html )"
你可以结合PHP来分别使用:
<?php
$pre = '{dede:prenext get="pre" function="getto(@me)"}';
$pre_info = unserialize($pre); // 将字符串反序列化为数组
if($pre_info['title']){
?>
<div class="prenext-box">
<div class="pre">
<span>上一篇:</span>
<a href="<?php echo $pre_info['url']; ?>"><?php echo $pre_info['title']; ?></a>
</div>
<?php
}
?>
获取下一篇的链接和标题:
{dede:prenext get='next' function='getto(@me)'/}
用法同上,只需将 get='pre' 改为 get='next'。
经典布局:左右分栏(上一篇在左,下一篇在右)
这是最常见的布局方式,我们可以将两个标签放在一个 div 容器中,并用 float 来控制位置。
HTML/CSS 代码示例:
在模板文件 article_article.htm 中添加以下代码:
<div class="prenav">
<!-- 左侧上一篇 -->
<div class="prenav-left">
{dede:prenext get='pre'/}
</div>
<!-- 右侧下一篇 -->
<div class="prenav-right">
{dede:prenext get='next'/}
</div>
<!-- 清除浮动,防止布局错乱 -->
<div class="clear"></div>
</div>
然后在CSS文件(/templets/default/style/dedecms.css)中添加样式:
.prenav {
width: 100%;
border-top: 1px dashed #e0e0e0;
border-bottom: 1px dashed #e0e0e0;
padding: 15px 0;
margin: 20px 0;
font-size: 14px;
color: #666;
}
.prenav-left {
float: left;
width: 48%;
}
.prenav-right {
float: right;
width: 48%;
text-align: right; /* 让下一篇靠右对齐 */
}
.clear {
clear: both;
height: 0;
overflow: hidden;
font-size: 0;
}
效果: 上一篇的文章链接会显示在左边,下一篇的文章链接会显示在右边,中间用虚线隔开,非常美观。
常见问题与注意事项
没有上一篇或下一篇时显示指定文字
默认情况下,如果已经是第一篇或最后一篇文章,上一篇/下一篇的链接会指向自己,或者不显示,我们可以通过修改标签,让它在没有时显示“已经是第一篇”或“已经是最后一篇”这样的提示。
方法:使用 runphp='yes' 属性
这是一个非常强大的技巧,可以让我们用PHP代码来控制输出。
<div class="prenav">
<div class="prenav-left">
{dede:prenext get='pre' runphp='yes'}
if(@me == ''){
@me = '<span>已经是第一篇了</span>';
}else{
@me = @me; // 保持原样输出
}
{/dede:prenext}
</div>
<div class="prenav-right">
{dede:prenext get='next' runphp='yes'}
if(@me == ''){
@me = '<span>已经是最后一篇了</span>';
}else{
@me = @me; // 保持原样输出
}
{/dede:prenext}
</div>
<div class="clear"></div>
</div>
代码解释:
runphp='yes': 启用PHP解析。@me: 在{dede:}标签的runphp中,@me代表标签本身将要输出的内容。if(@me == ''): 判断织梦默认获取到的内容是否为空,如果为空,说明没有上一篇或下一篇。@me = '...': 如果条件成立,就重新给@me赋值,即显示我们自定义的文字。@me = @me;: 如果条件不成立,就保持原来的输出。
指定栏目内获取上一篇/下一篇
默认情况下,上一篇/下一篇是在全站范围内查找的,但很多时候我们希望只在当前栏目内查找。
这需要修改 include/arc.archives.class.php 文件,修改前请务必备份原文件!
- 打开
include/arc.archives.class.php文件。 - 搜索
function GetPreNext($gtype='pre')函数。 - 找到生成SQL查询的代码,通常在
if($gtype=='pre')和else if($gtype=='next')分支里。 - 修改
$query变量,在WHERE条件中加入AND typeid = '$this->TypeID'。
修改示例(上一篇部分):
修改前:
if($gtype=='pre')
{
$query = "SELECT id,title FROM `dede_archives` WHERE $order < '$this->Fields['senddate']' AND arcrank > -1 ORDER BY $order DESC";
}
修改后(限定当前栏目):
if($gtype=='pre')
{
// 在WHERE条件中增加了 AND typeid = '$this->TypeID'
$query = "SELECT id,title FROM `dede_archives` WHERE typeid = '{$this->TypeID}' AND $order < '{$this->Fields['senddate']}' AND arcrank > -1 ORDER BY $order DESC";
}
修改示例(下一篇部分):
修改前:
else if($gtype=='next')
{
$query = "SELECT id,title FROM `dede_archives` WHERE $order > '$this->Fields['senddate']' AND arcrank > -1 ORDER BY $order ASC";
}
修改后(限定当前栏目):
else if($gtype=='next')
{
// 在WHERE条件中增加了 AND typeid = '$this->TypeID'
$query = "SELECT id,title FROM `dede_archives` WHERE typeid = '{$this->TypeID}' AND $order > '{$this->Fields['senddate']}' AND arcrank > -1 ORDER BY $order ASC";
}
注意:
$this->TypeID就是当前文章的栏目ID。- 修改后,需要清除一下织梦的缓存(后台 -> 系统 -> 清除缓存),才能生效。
| 需求 | 解决方案 |
|---|---|
| 基本显示 | {dede:prenext get='pre'} 和 {dede:prenext get='next'} |
| 左右分栏布局 | 用 div 包裹,并用 float 布局 |
| 无文章时显示提示 | 使用 runphp='yes' 进行PHP判断 |
| 限定在当前栏目 | 修改 include/arc.archives.class.php 文件,增加 typeid 条件 |
希望这份详细的指南能帮助你完美地在织梦CMS中实现上一篇和下一篇功能!
