dede上一篇下一篇标题如何调用?

99ANYc3cd6
预计阅读时长 22 分钟
位置: 首页 DEDE建站 正文

使用 GetPreNext 函数

DedeCMS 提供了一个专门的函数 GetPreNext 来获取上一篇和下一篇文章的信息,这个函数可以在文章内容页模板(通常是 article_article.htm)中直接使用。

dede上一篇下一篇标题调用
(图片来源网络,侵删)

标准调用(显示标题和链接)

这是最常用、最标准的方法,它会生成一个带有链接的标题。

在模板文件中,你需要找到合适的位置(例如文章内容下方),然后插入以下代码:

<div class="prenext">
    <strong>上一篇:</strong>{dede:prenext get='pre'/}<br />
    <strong>下一篇:</strong>{dede:prenext get='next'/}
</div>

代码解析:

  • {dede:prenext}:这是 DedeCMS 的一个标签函数。
  • get='pre':参数 pre 表示获取上一篇文章。
  • get='next':参数 next 表示获取下一篇文章。
  • 默认情况下,这个标签会直接输出 <a href="文章链接">文章标题</a> 这样的 HTML 代码。

效果示例: 是“DedeCMS教程:列表页调用”,下一篇标题是“DedeCMS安全设置”,那么上面的代码会渲染成:

dede上一篇下一篇标题调用
(图片来源网络,侵删)
<div class="prenext">
    <strong>上一篇:</strong><a href="/jiaocheng/123.html">DedeCMS教程:列表页调用</a><br />
    <strong>下一篇:</strong><a href="/anquan/456.html">DedeCMS安全设置</a>
</div>

高级自定义调用(分离链接和标题)

你可能不希望使用默认的样式,或者想把链接和标题分开处理,放在不同的 HTML 结构中,这时,你可以使用 GetPreNext 的函数形式。

使用 runphp='yes'@me 变量

这是最灵活的方式,可以在模板中直接处理逻辑。

<div class="article-nav">
    <div class="nav-pre">
        {dede:prenext get='pre' runphp='yes'}
            @me = is_numeric(@me) ? '' : '<a href="'.@me.'">'.strip_tags(@me).'</a>';
        {/dede:prenext}
    </div>
    <div class="nav-next">
        {dede:prenext get='next' runphp='yes'}
            @me = is_numeric(@me) ? '' : '<a href="'.@me.'">'.strip_tags(@me).'</a>';
        {/dede:prenext}
    </div>
</div>

代码解析:

dede上一篇下一篇标题调用
(图片来源网络,侵删)
  • runphp='yes':开启 PHP 模式,让 @me 变量可以被 PHP 代码处理。
  • @me:这个变量代表了 {dede:prenext} 标签默认输出的值(即 <a href="...">标题</a>)。
  • is_numeric(@me):这是一个判断,当没有上一篇或下一篇时,@me 的值可能是一个数字(如 1),而不是链接字符串,这个判断可以避免在没有文章时输出错误。
  • strip_tags(@me):如果只想获取标题文字,而不想包含 <a> 标签,可以使用这个函数来去除 HTML 标签。

include/common.func.php 中自定义函数(推荐用于复用)

如果你在多个模板中都需要自定义的上一篇/下一篇调用,最好的方式是修改核心函数文件。

  1. 打开文件/include/common.func.php
  2. 在文件末尾添加以下函数
/**
 * 获取上一篇和下一篇文章的链接和标题(自定义格式)
 * @param string $type 'pre' 或 'next'
 * @param string $titleformat 标题格式,如:'上一篇文章:%s'
 * @param string $linkformat 链接格式,如:'<a href="%s">%s</a>'
 * @param string $innertext 如果有内容,则直接使用此内容作为链接文本
 * @return string
 */
function GetPreNextAdvanced($type = 'pre', $titleformat = '', $linkformat = '<a href="%s">%s</a>', $innertext = '')
{
    global $dsql;
    $aid = isset($GLOBALS['aid']) ? intval($GLOBALS['aid']) : 0;
    if ($aid == 0) {
        return '';
    }
    $row = $dsql->GetOne("SELECT id,title FROM `#@__archives` WHERE id $type $aid ORDER BY id $type");
    if (!is_array($row)) {
        return $titleformat ? sprintf($titleformat, '没有了') : '';
    }
    $link = GetFileUrl($row['id'], $row['typeid'], $row['senddate'], $row['title'], $row['ismake'], $row['arcrank'], $row['channel'], $row['moresite'], $row['siteurl'], $row['sitepath']);
    if ($innertext) {
        $linktext = sprintf($linkformat, $link, $innertext);
    } else {
        $linktext = sprintf($linkformat, $link, $row['title']);
    }
    return $titleformat ? sprintf($titleformat, $linktext) : $linktext;
}
  1. 在模板中调用这个新函数
<div class="prenext">
    <strong>上一篇:</strong><?php echo GetPreNextAdvanced('pre', '没有了'); ?>
    <br />
    <strong>下一篇:</strong><?php echo GetPreNextAdvanced('next', '没有了'); ?>
</div>

这种方式的好处

  • 高度灵活:你可以完全控制输出的格式。
  • 代码复用:定义一次,全站模板都可以用。
  • 性能更好:相比在模板里用 runphp,直接调用 PHP 函数效率更高。

常见问题与解决方案 (FAQ)

Q1: 为什么上一篇/下一篇显示“没有了”?

原因分析:

  1. 权限问题:上一篇或下一篇文章可能是草稿、待审核文章,或者设置了“仅会员可见”,而当前访客没有权限查看。
  2. 栏目设置:文章可能属于一个“不生成栏目页”或“外部链接”的栏目,导致 GetPreNext 无法找到它。
  3. 文章本身问题:该文章可能已从数据库中删除,但缓存或索引未更新。

解决方案:

  • 检查权限:确保你测试的文章是“已审核”且“公开”状态。
  • 检查栏目:进入后台,检查上一篇/下一篇文章所属的栏目设置是否正常。
  • 更新缓存:进入 DedeCMS 后台 -> 系统 -> 一键更新网站 -> 更新HTML,更新一下相关页面。

Q2: 如何只显示标题,不显示链接?

方法: 使用 strip_tags 函数来去除默认输出中的 <a>

<div class="prenext">
    <strong>上一篇:</strong>{dede:prenext get='pre' runphp='yes'}@me=strip_tags(@me);{/dede:prenext}<br />
    <strong>下一篇:</strong>{dede:prenext get='next' runphp='yes'}@me=strip_tags(@me);{/dede:prenext}
</div>

Q3: 如何自定义“没有了”时的显示文字?

方法: 使用 if 判断。

<div class="prenext">
    <strong>上一篇:</strong>
    {dede:prenext get='pre' runphp='yes'}
        if(@me == '' || is_numeric(@me)){
            @me = '已经是第一篇了';
        }else{
            @me = '<a href="'.@me.'">'.strip_tags(@me).'</a>';
        }
    {/dede:prenext}
    <br />
    <strong>下一篇:</strong>
    {dede:prenext get='next' runphp='yes'}
        if(@me == '' || is_numeric(@me)){
            @me = '没有了';
        }else{
            @me = '<a href="'.@me.'">'.strip_tags(@me).'</a>';
        }
    {/dede:prenext}
</div>
需求场景 推荐方法 示例代码
标准调用(最常用) 使用 {dede:prenext} {dede:prenext get='pre'/}
自定义样式 使用 runphp='yes'@me 变量 {dede:prenext get='pre' runphp='yes'}@me=strip_tags(@me);{/dede:prenext}
全站复用/复杂逻辑 修改 common.func.php 并调用新函数 <?php echo GetPreNextAdvanced('pre'); ?>

对于绝大多数情况,第一种标准调用已经足够,如果你需要更精细的控制,可以尝试第二种方法,如果你是一个开发者,并且需要在多个项目中使用,那么第三种自定义函数的方法是最佳实践。

-- 展开阅读全文 --
头像
织梦还原无数据,备份文件是否损坏?
« 上一篇 01-10
exit与return在C语言中到底该如何选择?
下一篇 » 01-10

相关文章

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