核心标签
在织梦的文章内容页模板(通常是 article_article.htm)中,获取上一篇和下一篇标题的核心标签是:

(图片来源网络,侵删)
- :
{dede:prenext get='pre'/} - :
{dede:prenext get='next'/}
这两个标签会自动解析并输出上一篇和下一篇文章的标题文本,并且会自动生成一个指向该文章的链接。
基础用法与代码示例
最简单的用法就是直接将标签放在模板中。
示例代码:
<div class="prenext">
<div class="pre">
<strong>上一篇:</strong>
{dede:prenext get='pre'/}
</div>
<div class="next">
<strong>下一篇:</strong>
{dede:prenext get='next'/}
</div>
</div>
效果:
如果当前文章有上一篇,它会显示类似这样的HTML:
上一篇:<a href="/article/123.html">这是上一篇的文章标题</a>

(图片来源网络,侵删)
如果没有上一篇,则显示:
上一篇:没有了
高级用法:自定义显示内容(推荐)
很多时候,我们希望对上一篇/下一篇的显示进行更精细的控制,
- ,不显示“上一篇:”这样的前缀。
- 自定义“没有了”时的提示文字。
- 获取并显示文章的发布时间、缩略图等更多信息。
这时,我们需要使用 {dede:prenext} 的 底层循环。
和链接
场景: 不希望有“上一篇:”这样的文字,只保留一个干净的链接。

(图片来源网络,侵删)
代码示例:
<div class="article-nav">
<div class="nav-prev">
{dede:prenext get='pre' function='str_replace("上一篇:", "", @me)'/}
</div>
<div class="nav-next">
{dede:prenext get='next' function='str_replace("下一篇:", "", @me)'/}
</div>
</div>
function='str_replace("上一篇:", "", @me)'的作用是,将标签默认输出的内容(@me代表默认内容)中的“上一篇:”字符串替换为空。
使用底层循环获取更多信息(最灵活)
这是最强大和常用的方法,通过 {dede:prenext} 的底层循环,我们可以像调用文章列表一样,获取上一篇/下一篇的任意字段,如标题、链接、时间、作者、缩略图等。
代码示例:
<div class="prenext">
<!-- 上一篇 -->
<div class="pre">
<strong>上一篇:</strong>
{dede:prenext get='pre' runphp='yes'}
if(@me <> ''){
@me = '<a href="'.@me['url'].'" title="'.@me['title'].'">'.@me['title'].'</a>';
}else{
@me = '没有了';
}
{/dede:prenext}
</div>
<!-- 下一篇 -->
<div class="next">
<strong>下一篇:</strong>
{dede:prenext get='next' runphp='yes'}
if(@me <> ''){
@me = '<a href="'.@me['url'].'" title="'.@me['title'].'">'.@me['title'].'</a>';
}else{
@me = '没有了';
}
{/dede:prenext}
</div>
</div>
更简洁的底层循环写法(推荐):
<div class="prenext">
<!-- 上一篇 -->
<div class="pre">
<strong>上一篇:</strong>
{dede:prenext get='pre'}
<a href="[field:url/]" title="[field:title/]">[field:title/]</a>
{/dede:prenext}
</div>
<!-- 下一篇 -->
<div class="next">
<strong>下一篇:</strong>
{dede:prenext get='next'}
<a href="[field:url/]" title="[field:title/]">[field:title/]</a>
{/dede:prenext}
</div>
</div>
底层循环中可用的常用字段:
[field:title/][field:arcurl/]或[field:url/]:文章链接[field:pubdate function="MyDate('Y-m-d',@me)"/]:文章发布时间(需自定义函数或使用格式化字符串)[field:writer/]:文章作者[field:litpic/]:文章缩略图
进阶示例:显示标题、时间和缩略图
<div class="prenext">
<!-- 上一篇 -->
<div class="pre">
{dede:prenext get='pre'}
<a href="[field:arcurl/]" class="pre-img">
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
<div class="pre-info">
<p class="pre-title"><a href="[field:arcurl/]">[field:title/]</a></p>
<p class="pre-date">[field:pubdate function="strftime('%Y-%m-%d',@me)"/]</p>
</div>
{/dede:prenext}
</div>
<!-- 下一篇 -->
<div class="next">
{dede:prenext get='next'}
<a href="[field:arcurl/]" class="next-img">
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
<div class="next-info">
<p class="next-title"><a href="[field:arcurl/]">[field:title/]</a></p>
<p class="next-date">[field:pubdate function="strftime('%Y-%m-%d',@me)"/]</p>
</div>
{/dede:prenext}
</div>
</div>
常见问题与解决方案
问题:上一篇/下一篇不显示,或者显示异常。
原因分析:
- 文章为最新或最旧: 当前文章已经是频道或分类中的第一篇或最后一篇,所以自然没有上一篇或下一篇。
- 栏目设置问题: 检查该文章所属的栏目,在“栏目管理” -> “高级选项”中,“文章排序选项” 是否设置了特殊的排序方式(如按ID降序),如果排序方式不是默认的“发布时间降序”,可能会导致逻辑错乱。
- 模板标签错误: 检查标签拼写是否正确,是否在正确的模板文件(
article_article.htm)中。
解决方案:
- 检查排序: 进入后台“栏目管理”,点击该文章所属的栏目,进入“高级选项”,确保“文章排序选项”为 “默认(按发布时间降序)” 或其他符合你逻辑的排序方式。
- 使用
if判断: 在模板中使用runphp进行判断,如果为空则显示自定义提示。
{dede:prenext get='pre' runphp='yes'}
if(@me){
@me = '<a href="'.@me['url'].'">'.@me['title'].'</a>';
}else{
@me = '<span>已经是第一篇了</span>';
}
{/dede:prenext}
问题:上一篇/下一篇指向了错误的栏目。
原因分析:
默认情况下,{dede:prenext} 只在 当前文章所在的栏目 内查找上一篇/下一篇,如果你的文章同时属于多个栏目(通过副栏目),并且希望它在全站范围内查找,就需要修改。
解决方案: 修改织梦核心文件。(操作前请务必备份!)
- 打开
/include/arc.archives.class.php文件。 - 搜索
function GetPreNext($gtype='pre')函数。 - 在函数内找到
if($gtype=='pre')和if($gtype=='next')的query查询语句。 - 在
WHERE条件中,默认是AND (typeid = '$this->TypeId' OR typeid IN (SELECT id FROMdede_arctypeWHERE reid='$this->TypeId')),这限制了只在当前栏目及其子栏目查找。 - 要跨栏目查找,请将这个
WHERE条件简化或删除。
修改示例(将查找范围限制为当前主栏目): 找到类似这样的代码:
$query = "SELECT id,title FROM `dede_archives` WHERE
(typeid = '$this->TypeId' OR typeid IN (SELECT id FROM `dede_arctype` WHERE reid='$this->TypeId'))
AND id $op $aid
$orderby limit 0,1";
你可以将其修改为只在当前主栏目查找(去掉子栏目部分):
$query = "SELECT id,title FROM `dede_archives` WHERE
typeid = '$this->TypeId'
AND id $op $aid
$orderby limit 0,1";
或者,要实现全站查找(不限制栏目),则将 typeid 相关的条件完全移除:
$query = "SELECT id,title FROM `dede_archives` WHERE
id $op $aid
$orderby limit 0,1";
修改完成后,保存文件,然后更新一下HTML页面即可生效。
| 需求 | 推荐方法 | 示例代码 |
|---|---|---|
| 简单显示 | 使用默认标签 | {dede:prenext get='pre'/} |
| 自定义文字 | 使用function修改 |
{dede:prenext get='pre' function='str_replace("上一篇:", "", @me)'/} |
| 获取更多信息 | 使用底层循环 | {dede:prenext get='pre'}<a href="[field:arcurl/]">[field:title/]</a>{/dede:prenext} |
| 处理边界情况 | 在底层循环中用if判断 |
{dede:prenext get='pre' runphp='yes'}if(@me){...}{/dede:prenext} |
| 跨栏目查找 | 修改核心文件 | 修改 /include/arc.archives.class.php 中的 GetPreNext 函数的查询条件 |
希望这份详细的指南能帮助您完美地实现织梦CMS的上一篇/下一篇功能!
